em-http-request 1.0.2 → 1.0.3

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.

@@ -1,128 +1,150 @@
1
- require 'helper'
2
-
3
- requires_connection do
4
-
5
- describe EventMachine::HttpRequest do
6
-
7
- it "should follow redirects on HEAD method (external)" do
8
- EventMachine.run {
9
- http = EventMachine::HttpRequest.new('http://www.google.com/').head :redirects => 1
10
- http.errback { failed(http) }
11
- http.callback {
12
- http.response_header.status.should == 200
13
- EM.stop
14
- }
15
- }
16
- end
17
-
18
- it "should follow redirect to https and initiate the handshake" do
19
- EventMachine.run {
20
- http = EventMachine::HttpRequest.new('http://analytics.postrank.com/').get :redirects => 5
21
-
22
- http.errback { failed(http) }
23
- http.callback {
24
- http.response_header.status.should == 200
25
- EventMachine.stop
26
- }
27
- }
28
- end
29
-
30
- it "should perform a streaming GET" do
31
- EventMachine.run {
32
-
33
- # digg.com uses chunked encoding
34
- http = EventMachine::HttpRequest.new('http://digg.com/news').get
35
-
36
- http.errback { failed(http) }
37
- http.callback {
38
- http.response_header.status.should == 200
39
- EventMachine.stop
40
- }
41
- }
42
- end
43
-
44
- it "should handle a 100 continue" do
45
- EventMachine.run {
46
- # 8.2.3 Use of the 100 (Continue) Status - http://www.ietf.org/rfc/rfc2616.txt
47
- #
48
- # An origin server SHOULD NOT send a 100 (Continue) response if
49
- # the request message does not include an Expect request-header
50
- # field with the "100-continue" expectation, and MUST NOT send a
51
- # 100 (Continue) response if such a request comes from an HTTP/1.0
52
- # (or earlier) client. There is an exception to this rule: for
53
- # compatibility with RFC 2068, a server MAY send a 100 (Continue)
54
- # status in response to an HTTP/1.1 PUT or POST request that does
55
- # not include an Expect request-header field with the "100-
56
- # continue" expectation. This exception, the purpose of which is
57
- # to minimize any client processing delays associated with an
58
- # undeclared wait for 100 (Continue) status, applies only to
59
- # HTTP/1.1 requests, and not to requests with any other HTTP-
60
- # version value.
61
- #
62
- # 10.1.1: 100 Continue - http://www.ietf.org/rfc/rfc2068.txt
63
- # The client may continue with its request. This interim response is
64
- # used to inform the client that the initial part of the request has
65
- # been received and has not yet been rejected by the server. The client
66
- # SHOULD continue by sending the remainder of the request or, if the
67
- # request has already been completed, ignore this response. The server
68
- # MUST send a final response after the request has been completed.
69
-
70
- url = 'http://ws.serviceobjects.com/lv/LeadValidation.asmx/ValidateLead_V2'
71
- http = EventMachine::HttpRequest.new(url).post :body => {:name => :test}
72
-
73
- http.errback { failed(http) }
74
- http.callback {
75
- http.response_header.status.should == 500
76
- http.response.should match('Missing')
77
- EventMachine.stop
78
- }
79
- }
80
- end
81
-
82
- it "should detect deflate encoding" do
83
- pending "need an endpoint which supports deflate.. MSN is no longer"
84
- EventMachine.run {
85
-
86
- options = {:head => {"accept-encoding" => "deflate"}, :redirects => 5}
87
- http = EventMachine::HttpRequest.new('http://www.msn.com').get options
88
-
89
- http.errback { failed(http) }
90
- http.callback {
91
- http.response_header.status.should == 200
92
- http.response_header["CONTENT_ENCODING"].should == "deflate"
93
-
94
- EventMachine.stop
95
- }
96
- }
97
- end
98
-
99
- context "keepalive" do
100
- it "should default to non-keepalive" do
101
- EventMachine.run {
102
- headers = {'If-Modified-Since' => 'Thu, 05 Aug 2010 22:54:44 GMT'}
103
- http = EventMachine::HttpRequest.new('http://www.google.com/images/logos/ps_logo2.png').get :head => headers
104
-
105
- http.errback { fail }
106
- start = Time.now.to_i
107
- http.callback {
108
- (Time.now.to_i - start).should be_within(2).of(0)
109
- EventMachine.stop
110
- }
111
- }
112
- end
113
-
114
- it "should work with keep-alive servers" do
115
- EventMachine.run {
116
- http = EventMachine::HttpRequest.new('http://mexicodiario.com/touch.public.json.php').get :keepalive => true
117
-
118
- http.errback { failed(http) }
119
- http.callback {
120
- http.response_header.status.should == 200
121
- EventMachine.stop
122
- }
123
- }
124
- end
125
- end
126
-
127
- end
128
- end
1
+ require 'helper'
2
+
3
+ requires_connection do
4
+
5
+ describe EventMachine::HttpRequest do
6
+
7
+ it "should follow redirects on HEAD method (external)" do
8
+ EventMachine.run {
9
+ http = EventMachine::HttpRequest.new('http://www.google.com/').head :redirects => 1
10
+ http.errback { failed(http) }
11
+ http.callback {
12
+ http.response_header.status.should == 200
13
+ EM.stop
14
+ }
15
+ }
16
+ end
17
+
18
+ it "should follow redirect to https and initiate the handshake" do
19
+ EventMachine.run {
20
+ http = EventMachine::HttpRequest.new('http://analytics.postrank.com/').get :redirects => 5
21
+
22
+ http.errback { failed(http) }
23
+ http.callback {
24
+ http.response_header.status.should == 200
25
+ EventMachine.stop
26
+ }
27
+ }
28
+ end
29
+
30
+ it "should perform a streaming GET" do
31
+ EventMachine.run {
32
+
33
+ # digg.com uses chunked encoding
34
+ http = EventMachine::HttpRequest.new('http://digg.com/news').get
35
+
36
+ http.errback { failed(http) }
37
+ http.callback {
38
+ http.response_header.status.should == 200
39
+ EventMachine.stop
40
+ }
41
+ }
42
+ end
43
+
44
+ it "should handle a 100 continue" do
45
+ EventMachine.run {
46
+ # 8.2.3 Use of the 100 (Continue) Status - http://www.ietf.org/rfc/rfc2616.txt
47
+ #
48
+ # An origin server SHOULD NOT send a 100 (Continue) response if
49
+ # the request message does not include an Expect request-header
50
+ # field with the "100-continue" expectation, and MUST NOT send a
51
+ # 100 (Continue) response if such a request comes from an HTTP/1.0
52
+ # (or earlier) client. There is an exception to this rule: for
53
+ # compatibility with RFC 2068, a server MAY send a 100 (Continue)
54
+ # status in response to an HTTP/1.1 PUT or POST request that does
55
+ # not include an Expect request-header field with the "100-
56
+ # continue" expectation. This exception, the purpose of which is
57
+ # to minimize any client processing delays associated with an
58
+ # undeclared wait for 100 (Continue) status, applies only to
59
+ # HTTP/1.1 requests, and not to requests with any other HTTP-
60
+ # version value.
61
+ #
62
+ # 10.1.1: 100 Continue - http://www.ietf.org/rfc/rfc2068.txt
63
+ # The client may continue with its request. This interim response is
64
+ # used to inform the client that the initial part of the request has
65
+ # been received and has not yet been rejected by the server. The client
66
+ # SHOULD continue by sending the remainder of the request or, if the
67
+ # request has already been completed, ignore this response. The server
68
+ # MUST send a final response after the request has been completed.
69
+
70
+ url = 'http://ws.serviceobjects.com/lv/LeadValidation.asmx/ValidateLead_V2'
71
+ http = EventMachine::HttpRequest.new(url).post :body => {:name => :test}
72
+
73
+ http.errback { failed(http) }
74
+ http.callback {
75
+ http.response_header.status.should == 500
76
+ http.response.should match('Missing')
77
+ EventMachine.stop
78
+ }
79
+ }
80
+ end
81
+
82
+ it "should detect deflate encoding" do
83
+ pending "need an endpoint which supports deflate.. MSN is no longer"
84
+ EventMachine.run {
85
+
86
+ options = {:head => {"accept-encoding" => "deflate"}, :redirects => 5}
87
+ http = EventMachine::HttpRequest.new('http://www.msn.com').get options
88
+
89
+ http.errback { failed(http) }
90
+ http.callback {
91
+ http.response_header.status.should == 200
92
+ http.response_header["CONTENT_ENCODING"].should == "deflate"
93
+
94
+ EventMachine.stop
95
+ }
96
+ }
97
+ end
98
+
99
+ it "should stream chunked gzipped data" do
100
+ EventMachine.run {
101
+ options = {:head => {"accept-encoding" => "gzip"}}
102
+ # GitHub sends chunked gzip, time for a little Inception ;)
103
+ http = EventMachine::HttpRequest.new('https://github.com/igrigorik/em-http-request/commits/master').get options
104
+
105
+ http.errback { failed(http) }
106
+ http.callback {
107
+ http.response_header.status.should == 200
108
+ http.response_header["CONTENT_ENCODING"].should == "gzip"
109
+ http.response.should == ''
110
+
111
+ EventMachine.stop
112
+ }
113
+
114
+ body = ''
115
+ http.stream do |chunk|
116
+ body << chunk
117
+ end
118
+ }
119
+ end
120
+
121
+ context "keepalive" do
122
+ it "should default to non-keepalive" do
123
+ EventMachine.run {
124
+ headers = {'If-Modified-Since' => 'Thu, 05 Aug 2010 22:54:44 GMT'}
125
+ http = EventMachine::HttpRequest.new('http://www.google.com/images/logos/ps_logo2.png').get :head => headers
126
+
127
+ http.errback { fail }
128
+ start = Time.now.to_i
129
+ http.callback {
130
+ (Time.now.to_i - start).should be_within(2).of(0)
131
+ EventMachine.stop
132
+ }
133
+ }
134
+ end
135
+
136
+ it "should work with keep-alive servers" do
137
+ EventMachine.run {
138
+ http = EventMachine::HttpRequest.new('http://mexicodiario.com/touch.public.json.php').get :keepalive => true
139
+
140
+ http.errback { failed(http) }
141
+ http.callback {
142
+ http.response_header.status.should == 200
143
+ EventMachine.stop
144
+ }
145
+ }
146
+ end
147
+ end
148
+
149
+ end
150
+ end
@@ -4,6 +4,7 @@ describe EventMachine::HttpRequest do
4
4
 
5
5
  context "connections via" do
6
6
  let(:proxy) { {:proxy => { :host => '127.0.0.1', :port => 8083 }} }
7
+ let(:authenticated_proxy) { {:proxy => { :host => '127.0.0.1', :port => 8083, :authorization => ["user", "name"] } } }
7
8
 
8
9
  it "should use HTTP proxy" do
9
10
  EventMachine.run {
@@ -12,6 +13,21 @@ describe EventMachine::HttpRequest do
12
13
  http.errback { failed(http) }
13
14
  http.callback {
14
15
  http.response_header.status.should == 200
16
+ http.response_header.should_not include("X_PROXY_AUTH")
17
+ http.response.should match('test')
18
+ EventMachine.stop
19
+ }
20
+ }
21
+ end
22
+
23
+ it "should use HTTP proxy with authentication" do
24
+ EventMachine.run {
25
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/proxyauth?q=test', authenticated_proxy).get
26
+
27
+ http.errback { failed(http) }
28
+ http.callback {
29
+ http.response_header.status.should == 200
30
+ http.response_header['X_PROXY_AUTH'].should == "Proxy-Authorization: Basic dXNlcjpuYW1l"
15
31
  http.response.should match('test')
16
32
  EventMachine.stop
17
33
  }
@@ -1,66 +1,66 @@
1
- require 'helper'
2
-
3
- requires_connection do
4
-
5
- describe EventMachine::HttpRequest do
6
-
7
- it "should perform successful pipelined GETs" do
8
- EventMachine.run do
9
-
10
- # Mongrel doesn't support pipelined requests - bah!
11
- conn = EventMachine::HttpRequest.new('http://www.igvita.com/')
12
-
13
- pipe1 = conn.get :keepalive => true
14
- pipe2 = conn.get :path => '/archives/', :keepalive => true
15
-
16
- processed = 0
17
- stop = proc { EM.stop if processed == 2}
18
-
19
- pipe1.errback { failed(conn) }
20
- pipe1.callback {
21
- processed += 1
22
- pipe1.response_header.status.should == 200
23
- stop.call
24
- }
25
-
26
- pipe2.errback { failed(conn) }
27
- pipe2.callback {
28
- processed += 1
29
- pipe2.response_header.status.should == 200
30
- pipe2.response.should match(/2011/i)
31
- stop.call
32
- }
33
-
34
- end
35
- end
36
-
37
- it "should perform successful pipelined HEAD requests" do
38
- EventMachine.run do
39
- conn = EventMachine::HttpRequest.new('http://www.igvita.com/')
40
-
41
- pipe1 = conn.head :keepalive => true
42
- pipe2 = conn.head :path => '/archives/', :keepalive => true
43
-
44
- processed = 0
45
- stop = proc { EM.stop if processed == 2}
46
-
47
- pipe1.errback { failed(conn) }
48
- pipe1.callback {
49
- processed += 1
50
- pipe1.response_header.status.should == 200
51
- stop.call
52
- }
53
-
54
- pipe2.errback { failed(conn) }
55
- pipe2.callback {
56
- processed += 1
57
- pipe2.response_header.status.should == 200
58
- stop.call
59
- }
60
-
61
- end
62
-
63
- end
64
- end
65
-
1
+ require 'helper'
2
+
3
+ requires_connection do
4
+
5
+ describe EventMachine::HttpRequest do
6
+
7
+ it "should perform successful pipelined GETs" do
8
+ EventMachine.run do
9
+
10
+ # Mongrel doesn't support pipelined requests - bah!
11
+ conn = EventMachine::HttpRequest.new('http://www.igvita.com/')
12
+
13
+ pipe1 = conn.get :keepalive => true
14
+ pipe2 = conn.get :path => '/archives/', :keepalive => true
15
+
16
+ processed = 0
17
+ stop = proc { EM.stop if processed == 2}
18
+
19
+ pipe1.errback { failed(conn) }
20
+ pipe1.callback {
21
+ processed += 1
22
+ pipe1.response_header.status.should == 200
23
+ stop.call
24
+ }
25
+
26
+ pipe2.errback { failed(conn) }
27
+ pipe2.callback {
28
+ processed += 1
29
+ pipe2.response_header.status.should == 200
30
+ pipe2.response.should match(/2011/i)
31
+ stop.call
32
+ }
33
+
34
+ end
35
+ end
36
+
37
+ it "should perform successful pipelined HEAD requests" do
38
+ EventMachine.run do
39
+ conn = EventMachine::HttpRequest.new('http://www.igvita.com/')
40
+
41
+ pipe1 = conn.head :keepalive => true
42
+ pipe2 = conn.head :path => '/archives/', :keepalive => true
43
+
44
+ processed = 0
45
+ stop = proc { EM.stop if processed == 2}
46
+
47
+ pipe1.errback { failed(conn) }
48
+ pipe1.callback {
49
+ processed += 1
50
+ pipe1.response_header.status.should == 200
51
+ stop.call
52
+ }
53
+
54
+ pipe2.errback { failed(conn) }
55
+ pipe2.callback {
56
+ processed += 1
57
+ pipe2.response_header.status.should == 200
58
+ stop.call
59
+ }
60
+
61
+ end
62
+
63
+ end
64
+ end
65
+
66
66
  end
@@ -185,6 +185,21 @@ describe EventMachine::HttpRequest do
185
185
  }
186
186
  end
187
187
 
188
+ it "should apply timeout settings on redirects" do
189
+ EventMachine.run {
190
+ t = Time.now.to_i
191
+ EventMachine.heartbeat_interval = 0.1
192
+
193
+ conn = EventMachine::HttpRequest.new('http://127.0.0.1:8090/redirect/timeout', :inactivity_timeout => 0.1)
194
+ http = conn.get :redirects => 1
195
+ http.callback { failed(http) }
196
+ http.errback {
197
+ (Time.now.to_i - t).should <= 1
198
+ EM.stop
199
+ }
200
+ }
201
+ end
202
+
188
203
  it "should capture and pass cookies on redirect and pass_cookies by default" do
189
204
  EventMachine.run {
190
205
  http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/redirect/multiple-with-cookie').get :redirects => 2, :head => {'cookie' => 'id=2;'}