em-http-request 1.0.1 → 1.0.2

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.

Potentially problematic release.


This version of em-http-request might be problematic. Click here for more details.

@@ -48,6 +48,27 @@ describe EventMachine::HttpRequest do
48
48
  }
49
49
  }
50
50
  end
51
+
52
+ it "should use HTTP proxy while redirecting" do
53
+ EventMachine.run {
54
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/redirect', proxy).get :redirects => 1
55
+
56
+ http.errback { failed(http) }
57
+ http.callback {
58
+ http.response_header.status.should == 200
59
+
60
+ http.response_header['X_THE_REQUESTED_URI'].should == 'http://127.0.0.1:8090/gzip'
61
+ http.response_header['X_THE_REQUESTED_URI'].should_not == '/redirect'
62
+
63
+ http.response_header["CONTENT_ENCODING"].should == "gzip"
64
+ http.response.should == "compressed"
65
+ http.last_effective_url.to_s.should == 'http://127.0.0.1:8090/gzip'
66
+ http.redirects.should == 1
67
+
68
+ EventMachine.stop
69
+ }
70
+ }
71
+ end
51
72
  end
52
73
 
53
- end
74
+ end
@@ -42,7 +42,7 @@ describe EventMachine::HttpRequest do
42
42
 
43
43
  it "should not forward cookies across domains with http redirect" do
44
44
 
45
- expires = (Date.today + 1).strftime('%a, %d %b %Y %T GMT')
45
+ expires = (Date.today + 2).strftime('%a, %d %b %Y %T GMT')
46
46
  response =<<-HTTP.gsub(/^ +/, '')
47
47
  HTTP/1.1 301 MOVED PERMANENTLY
48
48
  Location: http://localhost:8081/
@@ -68,7 +68,7 @@ describe EventMachine::HttpRequest do
68
68
 
69
69
  it "should forward valid cookies across domains with http redirect" do
70
70
 
71
- expires = (Date.today + 1).strftime('%a, %d %b %Y %T GMT')
71
+ expires = (Date.today + 2).strftime('%a, %d %b %Y %T GMT')
72
72
  response =<<-HTTP.gsub(/^ +/, '')
73
73
  HTTP/1.1 301 MOVED PERMANENTLY
74
74
  Location: http://127.0.0.1:8081/
@@ -77,8 +77,8 @@ describe EventMachine::HttpRequest do
77
77
  HTTP
78
78
 
79
79
  EventMachine.run do
80
- @stub = StubServer.new(:port => 8080, :response => response)
81
- @echo = StubServer.new(:port => 8081, :echo => true)
80
+ @stub = StubServer.new(:host => '127.0.0.1', :port => 8080, :response => response)
81
+ @echo = StubServer.new(:host => '127.0.0.1', :port => 8081, :echo => true)
82
82
 
83
83
  http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get :redirects => 1
84
84
 
data/spec/stallion.rb CHANGED
@@ -1,273 +1,270 @@
1
- # #--
2
- # Includes portion originally Copyright (C)2008 Michael Fellinger
3
- # license See file LICENSE for details
4
- # #--
5
-
6
- require 'rack'
7
-
8
- module Stallion
9
- class Mount
10
- def initialize(name, *methods, &block)
11
- @name, @methods, @block = name, methods, block
12
- end
13
-
14
- def ride
15
- @block.call
16
- end
17
-
18
- def match?(request)
19
- method = request['REQUEST_METHOD']
20
- right_method = @methods.empty? or @methods.include?(method)
21
- end
22
- end
23
-
24
- class Stable
25
- attr_reader :request, :response
26
-
27
- def initialize
28
- @boxes = {}
29
- end
30
-
31
- def in(path, *methods, &block)
32
- mount = Mount.new(path, *methods, &block)
33
- @boxes[[path, methods]] = mount
34
- mount
35
- end
36
-
37
- def call(request, response)
38
- @request, @response = request, response
39
- @boxes.each do |(path, methods), mount|
40
- if mount.match?(request)
41
- mount.ride
42
- end
43
- end
44
- end
45
- end
46
-
47
- STABLES = {}
48
-
49
- def self.saddle(name = nil)
50
- STABLES[name] = stable = Stable.new
51
- yield stable
52
- end
53
-
54
- def self.run(options = {})
55
- options = {:Host => "127.0.0.1", :Port => 8090}.merge(options)
56
- Rack::Handler::Mongrel.run(Rack::Lint.new(self), options)
57
- end
58
-
59
- def self.call(env)
60
- request = Rack::Request.new(env)
61
- response = Rack::Response.new
62
-
63
- STABLES.each do |name, stable|
64
- stable.call(request, response)
65
- end
66
-
67
- response.finish
68
- end
69
- end
70
-
71
- Stallion.saddle :spec do |stable|
72
- stable.in '/' do
73
-
74
- if stable.request.path_info == '/fail'
75
- stable.response.status = 404
76
-
77
- elsif stable.request.path_info == '/fail_with_nonstandard_response'
78
- stable.response.status = 420
79
-
80
- elsif stable.request.query_string == 'q=test'
81
- stable.response.write 'test'
82
-
83
- elsif stable.request.path_info == '/echo_query'
84
- stable.response["ETag"] = "abcdefg"
85
- stable.response["Last-Modified"] = "Fri, 13 Aug 2010 17:31:21 GMT"
86
- stable.response.write stable.request.query_string
87
-
88
- elsif stable.request.path_info == '/echo_content_length'
89
- stable.response.write stable.request.content_length
90
-
91
- elsif stable.request.path_info == '/echo_content_length_from_header'
92
- stable.response.write "content-length:#{stable.request.env["CONTENT_LENGTH"]}"
93
-
94
- elsif stable.request.head? && stable.request.path_info == '/'
95
- stable.response.status = 200
96
-
97
- elsif stable.request.delete?
98
- stable.response.status = 200
99
-
100
- elsif stable.request.put?
101
- stable.response.write stable.request.body.read
102
-
103
- elsif stable.request.post?
104
- if stable.request.path_info == '/echo_content_type'
105
- stable.response["Content-Type"] = stable.request.env["CONTENT_TYPE"] || 'text/html'
106
- stable.response.write stable.request.env["CONTENT_TYPE"]
107
- else
108
- stable.response.write stable.request.body.read
109
- end
110
-
111
- elsif stable.request.path_info == '/set_cookie'
112
- stable.response["Set-Cookie"] = "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
113
- stable.response.write "cookie set"
114
-
115
- elsif stable.request.path_info == '/set_multiple_cookies'
116
- stable.response["Set-Cookie"] = [
117
- "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;",
118
- "id=2;"
119
- ]
120
- stable.response.write "cookies set"
121
-
122
- elsif stable.request.path_info == '/echo_cookie'
123
- stable.response.write stable.request.env["HTTP_COOKIE"]
124
-
125
- elsif stable.request.path_info == '/timeout'
126
- sleep(10)
127
- stable.response.write 'timeout'
128
-
129
- elsif stable.request.path_info == '/cookie_parrot'
130
- stable.response.status = 200
131
- stable.response["Set-Cookie"] = stable.request.env['HTTP_COOKIE']
132
-
133
- elsif stable.request.path_info == '/redirect'
134
- stable.response.status = 301
135
- stable.response["Location"] = "/gzip"
136
- stable.response.write 'redirect'
137
-
138
- elsif stable.request.path_info == '/redirect/multiple-with-cookie'
139
- stable.response.status = 301
140
- stable.response["Set-Cookie"] = "another_id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
141
- stable.response["Location"] = "/redirect"
142
- stable.response.write 'redirect'
143
-
144
- elsif stable.request.path_info == '/redirect/bad'
145
- stable.response.status = 301
146
- stable.response["Location"] = "http://127.0.0.1:8090"
147
-
148
- elsif stable.request.path_info == '/redirect/head'
149
- stable.response.status = 301
150
- stable.response["Location"] = "/"
151
-
152
- elsif stable.request.path_info == '/redirect/middleware_redirects_1'
153
- stable.response.status = 301
154
- stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
155
- stable.response["Location"] = "/redirect/middleware_redirects_2"
156
-
157
- elsif stable.request.path_info == '/redirect/middleware_redirects_2'
158
- stable.response.status = 301
159
- stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
160
- stable.response["Location"] = "/redirect/middleware_redirects_3"
161
-
162
- elsif stable.request.path_info == '/redirect/middleware_redirects_3'
163
- stable.response.status = 200
164
- stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
165
-
166
- elsif stable.request.path_info == '/redirect/nohost'
167
- stable.response.status = 301
168
- stable.response["Location"] = "http:/"
169
-
170
- elsif stable.request.path_info == '/redirect/badhost'
171
- stable.response.status = 301
172
- stable.response["Location"] = "http://$$$@$!%&^"
173
-
174
- elsif stable.request.path_info == '/gzip'
175
- io = StringIO.new
176
- gzip = Zlib::GzipWriter.new(io)
177
- gzip << "compressed"
178
- gzip.close
179
-
180
- stable.response.write io.string
181
- stable.response["Content-Encoding"] = "gzip"
182
-
183
- elsif stable.request.path_info == '/deflate'
184
- deflater = Zlib::Deflate.new(
185
- Zlib::DEFAULT_COMPRESSION,
186
- -Zlib::MAX_WBITS, # drop the zlib header which causes both Safari and IE to choke
187
- Zlib::DEF_MEM_LEVEL,
188
- Zlib::DEFAULT_STRATEGY
189
- )
190
- deflater.deflate("compressed")
191
- stable.response.write deflater.finish
192
- stable.response["Content-Encoding"] = "deflate"
193
-
194
- elsif stable.request.env["HTTP_IF_NONE_MATCH"]
195
- stable.response.status = 304
196
-
197
- elsif stable.request.env["HTTP_AUTHORIZATION"]
198
- if stable.request.path_info == '/auth'
199
- stable.response.status = 200
200
- stable.response.write stable.request.env["HTTP_AUTHORIZATION"]
201
- else
202
- auth = "Basic %s" % Base64.encode64(['user', 'pass'].join(':')).split.join
203
-
204
- if auth == stable.request.env["HTTP_AUTHORIZATION"]
205
- stable.response.status = 200
206
- stable.response.write 'success'
207
- else
208
- stable.response.status = 401
209
- end
210
- end
211
- elsif stable.request.path_info == '/relative-location'
212
- stable.response.status = 301
213
- stable.response["Location"] = '/forwarded'
214
-
215
- elsif
216
- stable.response.write 'Hello, World!'
217
- end
218
-
219
- end
220
- end
221
-
222
- Thread.new do
223
- begin
224
- Stallion.run :Host => '127.0.0.1', :Port => 8090
225
- rescue Exception => e
226
- print e
227
- end
228
- end
229
-
230
- #
231
- # Simple HTTP Proxy server
232
- #
233
- Thread.new do
234
- server = TCPServer.new('127.0.0.1', 8083)
235
- loop do
236
- session = server.accept
237
- request = ""
238
- while (data = session.gets) != "\r\n"
239
- request << data
240
- end
241
- parts = request.split("\r\n")
242
- method, destination, http_version = parts.first.split(' ')
243
- if destination =~ /^http:/
244
- uri = Addressable::URI.parse(destination)
245
- absolute_path = uri.path + (uri.query ? "?#{uri.query}" : "")
246
- client = TCPSocket.open(uri.host, uri.port || 80)
247
-
248
- client.write "#{method} #{absolute_path} #{http_version}\r\n"
249
- parts[1..-1].each do |part|
250
- client.write "#{part}\r\n"
251
- end
252
-
253
- client.write "\r\n"
254
- client.flush
255
- client.close_write
256
-
257
- # Take the initial line from the upstream response
258
- session.write client.gets
259
-
260
- # What (absolute) uri was requested? Send it back in a header
261
- session.write "X-The-Requested-URI: #{destination}\r\n"
262
-
263
- while data = client.gets
264
- session.write data
265
- end
266
- session.flush
267
- client.close
268
- end
269
- session.close
270
- end
271
- end
272
-
273
- sleep(1)
1
+ # #--
2
+ # Includes portion originally Copyright (C)2008 Michael Fellinger
3
+ # license See file LICENSE for details
4
+ # #--
5
+
6
+ require 'rack'
7
+
8
+ module Stallion
9
+ class Mount
10
+ def initialize(name, *methods, &block)
11
+ @name, @methods, @block = name, methods, block
12
+ end
13
+
14
+ def ride
15
+ @block.call
16
+ end
17
+
18
+ def match?(request)
19
+ method = request['REQUEST_METHOD']
20
+ right_method = @methods.empty? or @methods.include?(method)
21
+ end
22
+ end
23
+
24
+ class Stable
25
+ attr_reader :request, :response
26
+
27
+ def initialize
28
+ @boxes = {}
29
+ end
30
+
31
+ def in(path, *methods, &block)
32
+ mount = Mount.new(path, *methods, &block)
33
+ @boxes[[path, methods]] = mount
34
+ mount
35
+ end
36
+
37
+ def call(request, response)
38
+ @request, @response = request, response
39
+ @boxes.each do |(path, methods), mount|
40
+ if mount.match?(request)
41
+ mount.ride
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ STABLES = {}
48
+
49
+ def self.saddle(name = nil)
50
+ STABLES[name] = stable = Stable.new
51
+ yield stable
52
+ end
53
+
54
+ def self.run(options = {})
55
+ options = {:Host => "127.0.0.1", :Port => 8090}.merge(options)
56
+ Rack::Handler::Mongrel.run(Rack::Lint.new(self), options)
57
+ end
58
+
59
+ def self.call(env)
60
+ request = Rack::Request.new(env)
61
+ response = Rack::Response.new
62
+
63
+ STABLES.each do |name, stable|
64
+ stable.call(request, response)
65
+ end
66
+
67
+ response.finish
68
+ end
69
+ end
70
+
71
+ Stallion.saddle :spec do |stable|
72
+ stable.in '/' do
73
+
74
+ if stable.request.path_info == '/fail'
75
+ stable.response.status = 404
76
+
77
+ elsif stable.request.path_info == '/fail_with_nonstandard_response'
78
+ stable.response.status = 420
79
+
80
+ elsif stable.request.query_string == 'q=test'
81
+ stable.response.write 'test'
82
+
83
+ elsif stable.request.path_info == '/echo_query'
84
+ stable.response["ETag"] = "abcdefg"
85
+ stable.response["Last-Modified"] = "Fri, 13 Aug 2010 17:31:21 GMT"
86
+ stable.response.write stable.request.query_string
87
+
88
+ elsif stable.request.path_info == '/echo_content_length'
89
+ stable.response.write stable.request.content_length
90
+
91
+ elsif stable.request.path_info == '/echo_content_length_from_header'
92
+ stable.response.write "content-length:#{stable.request.env["CONTENT_LENGTH"]}"
93
+
94
+ elsif stable.request.head? && stable.request.path_info == '/'
95
+ stable.response.status = 200
96
+
97
+ elsif stable.request.delete?
98
+ stable.response.status = 200
99
+
100
+ elsif stable.request.put?
101
+ stable.response.write stable.request.body.read
102
+
103
+ elsif stable.request.post?
104
+ if stable.request.path_info == '/echo_content_type'
105
+ stable.response["Content-Type"] = stable.request.env["CONTENT_TYPE"] || 'text/html'
106
+ stable.response.write stable.request.env["CONTENT_TYPE"]
107
+ else
108
+ stable.response.write stable.request.body.read
109
+ end
110
+
111
+ elsif stable.request.path_info == '/set_cookie'
112
+ stable.response["Set-Cookie"] = "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
113
+ stable.response.write "cookie set"
114
+
115
+ elsif stable.request.path_info == '/set_multiple_cookies'
116
+ stable.response["Set-Cookie"] = [
117
+ "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;",
118
+ "id=2;"
119
+ ]
120
+ stable.response.write "cookies set"
121
+
122
+ elsif stable.request.path_info == '/echo_cookie'
123
+ stable.response.write stable.request.env["HTTP_COOKIE"]
124
+
125
+ elsif stable.request.path_info == '/timeout'
126
+ sleep(10)
127
+ stable.response.write 'timeout'
128
+
129
+ elsif stable.request.path_info == '/cookie_parrot'
130
+ stable.response.status = 200
131
+ stable.response["Set-Cookie"] = stable.request.env['HTTP_COOKIE']
132
+
133
+ elsif stable.request.path_info == '/redirect'
134
+ stable.response.status = 301
135
+ stable.response["Location"] = "/gzip"
136
+ stable.response.write 'redirect'
137
+
138
+ elsif stable.request.path_info == '/redirect/multiple-with-cookie'
139
+ stable.response.status = 301
140
+ stable.response["Set-Cookie"] = "another_id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
141
+ stable.response["Location"] = "/redirect"
142
+ stable.response.write 'redirect'
143
+
144
+ elsif stable.request.path_info == '/redirect/bad'
145
+ stable.response.status = 301
146
+ stable.response["Location"] = "http://127.0.0.1:8090"
147
+
148
+ elsif stable.request.path_info == '/redirect/head'
149
+ stable.response.status = 301
150
+ stable.response["Location"] = "/"
151
+
152
+ elsif stable.request.path_info == '/redirect/middleware_redirects_1'
153
+ stable.response.status = 301
154
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
155
+ stable.response["Location"] = "/redirect/middleware_redirects_2"
156
+
157
+ elsif stable.request.path_info == '/redirect/middleware_redirects_2'
158
+ stable.response.status = 301
159
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
160
+ stable.response["Location"] = "/redirect/middleware_redirects_3"
161
+
162
+ elsif stable.request.path_info == '/redirect/middleware_redirects_3'
163
+ stable.response.status = 200
164
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
165
+
166
+ elsif stable.request.path_info == '/redirect/nohost'
167
+ stable.response.status = 301
168
+ stable.response["Location"] = "http:/"
169
+
170
+ elsif stable.request.path_info == '/redirect/badhost'
171
+ stable.response.status = 301
172
+ stable.response["Location"] = "http://$$$@$!%&^"
173
+
174
+ elsif stable.request.path_info == '/gzip'
175
+ io = StringIO.new
176
+ gzip = Zlib::GzipWriter.new(io)
177
+ gzip << "compressed"
178
+ gzip.close
179
+
180
+ stable.response.write io.string
181
+ stable.response["Content-Encoding"] = "gzip"
182
+
183
+ elsif stable.request.path_info == '/deflate'
184
+ deflater = Zlib::Deflate.new(
185
+ Zlib::DEFAULT_COMPRESSION,
186
+ -Zlib::MAX_WBITS, # drop the zlib header which causes both Safari and IE to choke
187
+ Zlib::DEF_MEM_LEVEL,
188
+ Zlib::DEFAULT_STRATEGY
189
+ )
190
+ deflater.deflate("compressed")
191
+ stable.response.write deflater.finish
192
+ stable.response["Content-Encoding"] = "deflate"
193
+
194
+ elsif stable.request.env["HTTP_IF_NONE_MATCH"]
195
+ stable.response.status = 304
196
+
197
+ elsif stable.request.path_info == '/auth' && stable.request.env["HTTP_AUTHORIZATION"]
198
+ stable.response.status = 200
199
+ stable.response.write stable.request.env["HTTP_AUTHORIZATION"]
200
+ elsif stable.request.path_info == '/authtest'
201
+ auth = "Basic %s" % Base64.encode64(['user', 'pass'].join(':')).split.join
202
+ if auth == stable.request.env["HTTP_AUTHORIZATION"]
203
+ stable.response.status = 200
204
+ stable.response.write 'success'
205
+ else
206
+ stable.response.status = 401
207
+ end
208
+ elsif stable.request.path_info == '/relative-location'
209
+ stable.response.status = 301
210
+ stable.response["Location"] = '/forwarded'
211
+
212
+ elsif
213
+ stable.response.write 'Hello, World!'
214
+ end
215
+
216
+ end
217
+ end
218
+
219
+ Thread.new do
220
+ begin
221
+ Stallion.run :Host => '127.0.0.1', :Port => 8090
222
+ rescue Exception => e
223
+ print e
224
+ end
225
+ end
226
+
227
+ #
228
+ # Simple HTTP Proxy server
229
+ #
230
+ Thread.new do
231
+ server = TCPServer.new('127.0.0.1', 8083)
232
+ loop do
233
+ session = server.accept
234
+ request = ""
235
+ while (data = session.gets) != "\r\n"
236
+ request << data
237
+ end
238
+ parts = request.split("\r\n")
239
+ method, destination, http_version = parts.first.split(' ')
240
+ if destination =~ /^http:/
241
+ uri = Addressable::URI.parse(destination)
242
+ absolute_path = uri.path + (uri.query ? "?#{uri.query}" : "")
243
+ client = TCPSocket.open(uri.host, uri.port || 80)
244
+
245
+ client.write "#{method} #{absolute_path} #{http_version}\r\n"
246
+ parts[1..-1].each do |part|
247
+ client.write "#{part}\r\n"
248
+ end
249
+
250
+ client.write "\r\n"
251
+ client.flush
252
+ client.close_write
253
+
254
+ # Take the initial line from the upstream response
255
+ session.write client.gets
256
+
257
+ # What (absolute) uri was requested? Send it back in a header
258
+ session.write "X-The-Requested-URI: #{destination}\r\n"
259
+
260
+ while data = client.gets
261
+ session.write data
262
+ end
263
+ session.flush
264
+ client.close
265
+ end
266
+ session.close
267
+ end
268
+ end
269
+
270
+ sleep(1)