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.
- data/History.txt +6 -0
- data/README.rdoc +10 -9
- data/Rakefile +2 -2
- data/lib/rat_hole.rb +26 -4
- data/rat-hole.gemspec +9 -7
- data/test/test_rat_hole.rb +7 -3
- metadata +9 -3
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -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 =
|
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
|
-
*
|
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
|
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.
|
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']
|
data/lib/rat_hole.rb
CHANGED
@@ -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.
|
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 =
|
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
|
-
|
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)
|
data/rat-hole.gemspec
CHANGED
@@ -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.
|
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{
|
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.
|
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
|
26
|
-
s.add_runtime_dependency(%q<rack>, [">= 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.
|
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.
|
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"])
|
data/test/test_rat_hole.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH
|
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 =
|
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.
|
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:
|
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.
|
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:
|