mikehale-rat-hole 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,9 @@
1
+ === 0.1.7 / 2009-02-25
2
+
3
+ * add support for tidy
4
+ * update api to not require request/response to be returned
5
+ * require rack 0.9.1 or greater
6
+
1
7
  === 0.1.6 / 2008-12-18
2
8
 
3
9
  * properly calculate request_uri if query_string is empty
@@ -15,9 +15,6 @@ You can also modify the response from the server to cleanup html tweak headers e
15
15
  class PoliticalAgendaRatHole < RatHole
16
16
  def process_user_request(rack_request)
17
17
  # optionally munge the request before passing it to the old server
18
-
19
- # required to return the rack request
20
- rack_request
21
18
  end
22
19
 
23
20
  def process_server_response(rack_response, rack_request)
@@ -37,13 +34,16 @@ You can also modify the response from the server to cleanup html tweak headers e
37
34
 
38
35
  rack_response.headers['Ron-Paul'] = 'wish I could have voted for this guy'
39
36
  end
40
-
41
- # required to return the rack response
42
- rack_response
43
37
  end
44
38
  end
45
39
 
46
- app = PoliticalAgendaRatHole.new('www.google.com')
40
+ app = Rack::Builder.new do
41
+ use Rack::CommonLogger # display apache style common logs
42
+ use Rack::ShowExceptions # show exceptions
43
+ use Rack::Reloader # reload app when an included file changes
44
+ run PoliticalAgendaRatHole.new('www.google.com')
45
+ end
46
+
47
47
  Rack::Handler::Mongrel.run(app, {:Host => 'localhost', :Port => 5001})
48
48
 
49
49
  == INSTALL:
@@ -53,14 +53,15 @@ You can also modify the response from the server to cleanup html tweak headers e
53
53
  User Request --->
54
54
  --- RatHoleProxy.process_user_request(rack_request) --->
55
55
  <==========> OLD SERVER
56
- <--- RatHoleProxy.process_server_response(rack_response) ---
56
+ <--- RatHoleProxy.process_server_response(rack_response, rack_request) ---
57
57
  User Response <---
58
58
 
59
59
  == TODO
60
- * add error handling
60
+ * handle server down
61
61
  * handle gziped content (accept-encoding, transfer-encoding)
62
62
  * maybe use a pool of Net::HTTP connections to speed things up
63
63
  * provide an easy way for testing rat holes
64
+ * write up some rathole's for common tasks
64
65
 
65
66
  == Credits
66
67
  * Michael Hale (http://halethegeek.com)
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- $LOAD_PATH << File.join(File.dirname(__FILE__), 'lib')
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
2
2
  require 'rubygems'
3
3
  require 'hoe-patched' # because it supports README.*
4
4
  require 'rat_hole'
@@ -8,7 +8,7 @@ Hoe.new('rat-hole', RatHole::VERSION) do |p|
8
8
  p.description = p.paragraphs_of('README.rdoc', 0...1).to_s
9
9
  p.url = 'http://github.com/mikehale/rat-hole'
10
10
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
11
- p.extra_deps << ['rack', '>= 0.4.0']
11
+ p.extra_deps << ['rack', '>= 0.9.1']
12
12
  p.extra_dev_deps << ['rr', '>= 0.6.0']
13
13
  p.extra_dev_deps << ['hpricot', '>= 0.6.164']
14
14
  p.extra_dev_deps << ['newgem', '>= 1.1.0']
@@ -3,13 +3,15 @@ require 'rubygems'
3
3
  require 'rack'
4
4
  require 'delegate'
5
5
  require 'util'
6
+ require 'open3'
6
7
 
7
8
  class RatHole
8
9
 
9
- VERSION = '0.1.6'
10
+ VERSION = '0.1.7'
10
11
 
11
- def initialize(host)
12
+ def initialize(host, tidy=false)
12
13
  @host = host
14
+ @tidy = tidy
13
15
  end
14
16
 
15
17
  def process_user_request(rack_request)
@@ -25,7 +27,8 @@ class RatHole
25
27
  http.instance_eval{@socket = MethodSpy.new(@socket){|method| method =~ /#{ENV['RH_METHOD_SPY_FILTER']}/}} if $DEBUG
26
28
 
27
29
  env.delete('HTTP_ACCEPT_ENCODING')
28
- source_request = process_user_request(Rack::Request.new(env))
30
+ source_request = Rack::Request.new(env)
31
+ process_user_request(source_request)
29
32
  source_headers = request_headers(source_request.env)
30
33
 
31
34
  if source_request.query_string.nil? || source_request.query_string == ''
@@ -48,10 +51,29 @@ class RatHole
48
51
  code = response.code.to_i
49
52
  headers = response.to_hash
50
53
  body = response.body || ''
54
+ body = tidy_html(body) if @tidy
51
55
  headers.delete('transfer-encoding')
52
56
 
53
- process_server_response(Rack::Response.new(body, code, headers), source_request).finish
57
+ server_response = Rack::Response.new(body, code, headers)
58
+ process_server_response(server_response, source_request)
59
+ if server_response.headers.has_key?("content-length")
60
+ server_response.headers["content-length"] = server_response.headers["content-length"].first
61
+ end
62
+ server_response.finish
63
+ end
64
+ end
65
+
66
+ def tidy_html(body)
67
+ if `which tidy` == ''
68
+ $stderr.puts "tidy not found in path"
69
+ return
70
+ end
71
+ tidied = Open3.popen3('tidy -ascii') do |stdin, stdout, stderr|
72
+ stdin.print body
73
+ stdin.close
74
+ stdout.read
54
75
  end
76
+ body.replace(tidied)
55
77
  end
56
78
 
57
79
  def request_headers(env)
@@ -1,10 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = %q{rat-hole}
3
- s.version = "0.1.6"
5
+ s.version = "0.1.7"
4
6
 
5
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
8
  s.authors = ["Michael Hale", "David Bogus"]
7
- s.date = %q{2008-12-18}
9
+ s.date = %q{2009-02-25}
8
10
  s.description = %q{Rat Hole is a handy library for creating a rack compliant http proxy that allows you to modify the request from the user and the response from the server. The name is inspired by why's mousehole[http://code.whytheluckystiff.net/mouseHole/]}
9
11
  s.email = %q{mikehale@gmail.com}
10
12
  s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
@@ -14,7 +16,7 @@ Gem::Specification.new do |s|
14
16
  s.rdoc_options = ["--main", "README.rdoc"]
15
17
  s.require_paths = ["lib"]
16
18
  s.rubyforge_project = %q{rat-hole}
17
- s.rubygems_version = %q{1.2.0}
19
+ s.rubygems_version = %q{1.3.1}
18
20
  s.summary = %q{Rack compliant proxy}
19
21
  s.test_files = ["test/test_rat_hole.rb"]
20
22
 
@@ -22,15 +24,15 @@ Gem::Specification.new do |s|
22
24
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
25
  s.specification_version = 2
24
26
 
25
- if current_version >= 3 then
26
- s.add_runtime_dependency(%q<rack>, [">= 0.4.0"])
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<rack>, [">= 0.9.1"])
27
29
  s.add_development_dependency(%q<rr>, [">= 0.6.0"])
28
30
  s.add_development_dependency(%q<hpricot>, [">= 0.6.164"])
29
31
  s.add_development_dependency(%q<newgem>, [">= 1.1.0"])
30
32
  s.add_development_dependency(%q<cucumber>, [">= 0.1.12"])
31
33
  s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
32
34
  else
33
- s.add_dependency(%q<rack>, [">= 0.4.0"])
35
+ s.add_dependency(%q<rack>, [">= 0.9.1"])
34
36
  s.add_dependency(%q<rr>, [">= 0.6.0"])
35
37
  s.add_dependency(%q<hpricot>, [">= 0.6.164"])
36
38
  s.add_dependency(%q<newgem>, [">= 1.1.0"])
@@ -38,7 +40,7 @@ Gem::Specification.new do |s|
38
40
  s.add_dependency(%q<hoe>, [">= 1.8.0"])
39
41
  end
40
42
  else
41
- s.add_dependency(%q<rack>, [">= 0.4.0"])
43
+ s.add_dependency(%q<rack>, [">= 0.9.1"])
42
44
  s.add_dependency(%q<rr>, [">= 0.6.0"])
43
45
  s.add_dependency(%q<hpricot>, [">= 0.6.164"])
44
46
  s.add_dependency(%q<newgem>, [">= 1.1.0"])
@@ -1,4 +1,4 @@
1
- $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rr'
@@ -191,7 +191,12 @@ class TestRatHole < Test::Unit::TestCase
191
191
 
192
192
  def test_systemic_political_agenda
193
193
  host = 'terralien.com'
194
- app = PoliticalAgendaRatHole.new(host)
194
+ app = Rack::Builder.new do
195
+ use Rack::ShowExceptions
196
+ use Rack::ShowStatus
197
+ run PoliticalAgendaRatHole.new(host)
198
+ end
199
+
195
200
  app_response = Rack::MockRequest.new(app).get('/', {})
196
201
  raw_response = Net::HTTP.start(host) do |http|
197
202
  http.get('/', {})
@@ -230,6 +235,5 @@ class PoliticalAgendaRatHole < RatHole
230
235
  rack_response.body.first.replace(doc.to_html)
231
236
  rack_response.headers['Ron-Paul'] = 'wish I could have voted for this guy'
232
237
  end
233
- rack_response
234
238
  end
235
239
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mikehale-rat-hole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Hale
@@ -10,20 +10,22 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-12-18 00:00:00 -08:00
13
+ date: 2009-02-25 00:00:00 -08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rack
18
+ type: :runtime
18
19
  version_requirement:
19
20
  version_requirements: !ruby/object:Gem::Requirement
20
21
  requirements:
21
22
  - - ">="
22
23
  - !ruby/object:Gem::Version
23
- version: 0.4.0
24
+ version: 0.9.1
24
25
  version:
25
26
  - !ruby/object:Gem::Dependency
26
27
  name: rr
28
+ type: :development
27
29
  version_requirement:
28
30
  version_requirements: !ruby/object:Gem::Requirement
29
31
  requirements:
@@ -33,6 +35,7 @@ dependencies:
33
35
  version:
34
36
  - !ruby/object:Gem::Dependency
35
37
  name: hpricot
38
+ type: :development
36
39
  version_requirement:
37
40
  version_requirements: !ruby/object:Gem::Requirement
38
41
  requirements:
@@ -42,6 +45,7 @@ dependencies:
42
45
  version:
43
46
  - !ruby/object:Gem::Dependency
44
47
  name: newgem
48
+ type: :development
45
49
  version_requirement:
46
50
  version_requirements: !ruby/object:Gem::Requirement
47
51
  requirements:
@@ -51,6 +55,7 @@ dependencies:
51
55
  version:
52
56
  - !ruby/object:Gem::Dependency
53
57
  name: cucumber
58
+ type: :development
54
59
  version_requirement:
55
60
  version_requirements: !ruby/object:Gem::Requirement
56
61
  requirements:
@@ -60,6 +65,7 @@ dependencies:
60
65
  version:
61
66
  - !ruby/object:Gem::Dependency
62
67
  name: hoe
68
+ type: :development
63
69
  version_requirement:
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements: