igrigorik-em-http-request 0.1.1 → 0.1.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.
data/README.rdoc CHANGED
@@ -3,12 +3,13 @@
3
3
  EventMachine based HTTP Request interface. Supports streaming response processing, uses Ragel HTTP parser.
4
4
  - Simple interface for single & parallel requests via deferred callbacks
5
5
  - Automatic gzip & deflate decoding
6
- - Basic-Auth support
6
+ - Basic-Auth support
7
+ - Custom timeouts
7
8
 
8
9
  == Simple client example
9
10
 
10
11
  EventMachine.run {
11
- http = EventMachine::HttpRequest.new('http://127.0.0.1/').get :query => {'keyname' => 'value'}
12
+ http = EventMachine::HttpRequest.new('http://127.0.0.1/').get :query => {'keyname' => 'value'}, :timeout => 10
12
13
 
13
14
  http.callback {
14
15
  p http.response_header.status
@@ -155,8 +155,6 @@ module EventMachine
155
155
  attr_reader :response, :response_header, :errors
156
156
 
157
157
  def post_init
158
- self.comm_inactivity_timeout = 5
159
-
160
158
  @parser = HttpClientParser.new
161
159
  @data = EventMachine::Buffer.new
162
160
  @response_header = HttpResponseHeader.new
@@ -24,7 +24,6 @@ module EventMachine
24
24
  #
25
25
 
26
26
  class HttpRequest
27
- attr_reader :response, :headers
28
27
 
29
28
  def initialize(host, headers = {})
30
29
  @headers = headers
@@ -52,12 +51,19 @@ module EventMachine
52
51
  raise ArgumentError, "invalid request path" unless /^\// === @uri.path
53
52
 
54
53
  method = method.to_s.upcase
55
-
56
- EventMachine.connect(@uri.host, @uri.port, EventMachine::HttpClient) { |c|
57
- c.uri = @uri
58
- c.method = method
59
- c.options = options
60
- }
54
+ begin
55
+ EventMachine.connect(@uri.host, @uri.port, EventMachine::HttpClient) { |c|
56
+ c.uri = @uri
57
+ c.method = method
58
+ c.options = options
59
+ c.comm_inactivity_timeout = options[:timeout] || 5
60
+ }
61
+ rescue RuntimeError => e
62
+ raise e unless e.message == "no connection"
63
+ conn = EventMachine::HttpClient.new("")
64
+ conn.on_error("no connection")
65
+ conn
66
+ end
61
67
  end
62
68
  end
63
69
  end
data/test/stallion.rb CHANGED
@@ -83,6 +83,10 @@ Stallion.saddle :spec do |stable|
83
83
  elsif stable.request.post?
84
84
  stable.response.write 'test'
85
85
 
86
+ elsif stable.request.path_info == '/timeout'
87
+ sleep(10)
88
+ stable.response.write 'timeout'
89
+
86
90
  elsif stable.request.path_info == '/gzip'
87
91
  io = StringIO.new
88
92
  gzip = Zlib::GzipWriter.new(io)
data/test/test_request.rb CHANGED
@@ -8,9 +8,9 @@ describe EventMachine::HttpRequest do
8
8
  fail
9
9
  end
10
10
 
11
- it "should fail GET on invalid host" do
11
+ it "should fail GET on DNS timeout" do
12
12
  EventMachine.run {
13
- http = EventMachine::HttpRequest.new('http://169.169.169.169/').get
13
+ http = EventMachine::HttpRequest.new('http://127.1.1.1/').get
14
14
  http.callback { failed }
15
15
  http.errback {
16
16
  http.response_header.status.should == 0
@@ -19,6 +19,18 @@ describe EventMachine::HttpRequest do
19
19
  }
20
20
  end
21
21
 
22
+ it "should fail GET on invalid host" do
23
+ EventMachine.run {
24
+ http = EventMachine::HttpRequest.new('http://google1.com/').get
25
+ http.callback { failed }
26
+ http.errback {
27
+ http.response_header.status.should == 0
28
+ http.errors.should match(/no connection/)
29
+ EventMachine.stop
30
+ }
31
+ }
32
+ end
33
+
22
34
  it "should fail GET on missing path" do
23
35
  EventMachine.run {
24
36
  lambda {
@@ -122,11 +134,11 @@ describe EventMachine::HttpRequest do
122
134
  EventMachine.run {
123
135
 
124
136
  # digg.com uses chunked encoding
125
- http = EventMachine::HttpRequest.new('http://www.digg.com/').get
137
+ http = EventMachine::HttpRequest.new('http://digg.com/').get
126
138
 
127
139
  http.errback { failed }
128
140
  http.callback {
129
- http.response_header.status == 200
141
+ http.response_header.status.should == 200
130
142
  EventMachine.stop
131
143
  }
132
144
  }
@@ -139,7 +151,7 @@ describe EventMachine::HttpRequest do
139
151
 
140
152
  http.errback { failed }
141
153
  http.callback {
142
- http.response_header.status == 200
154
+ http.response_header.status.should == 200
143
155
  EventMachine.stop
144
156
  }
145
157
  }
@@ -152,7 +164,7 @@ describe EventMachine::HttpRequest do
152
164
 
153
165
  http.errback { failed }
154
166
  http.callback {
155
- http.response_header.status == 200
167
+ http.response_header.status.should == 200
156
168
  EventMachine.stop
157
169
  }
158
170
  }
@@ -165,7 +177,7 @@ describe EventMachine::HttpRequest do
165
177
 
166
178
  http.errback { failed }
167
179
  http.callback {
168
- http.response_header.status == 200
180
+ http.response_header.status.should == 200
169
181
  http.response_header["CONTENT_ENCODING"].should == "deflate"
170
182
  http.response.should == "compressed"
171
183
 
@@ -174,14 +186,14 @@ describe EventMachine::HttpRequest do
174
186
  }
175
187
  end
176
188
 
177
- it "should detect gzip encoding" do
189
+ it "should detect gzip encoding" do
178
190
  EventMachine.run {
179
191
 
180
192
  http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/gzip').get :head => {"accept-encoding" => "gzip, compressed"}
181
193
 
182
194
  http.errback { failed }
183
195
  http.callback {
184
- http.response_header.status == 200
196
+ http.response_header.status.should == 200
185
197
  http.response_header["CONTENT_ENCODING"].should == "gzip"
186
198
  http.response.should == "compressed"
187
199
 
@@ -189,4 +201,17 @@ describe EventMachine::HttpRequest do
189
201
  }
190
202
  }
191
203
  end
204
+
205
+ it "should timeout after 10 seconds" do
206
+ EventMachine.run {
207
+ t = Time.now.to_i
208
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/timeout').get :timeout => 2
209
+
210
+ http.errback {
211
+ (Time.now.to_i - t).should == 2
212
+ EventMachine.stop
213
+ }
214
+ http.callback { failed }
215
+ }
216
+ end
192
217
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: igrigorik-em-http-request
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Grigorik
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-15 00:00:00 -08:00
12
+ date: 2009-03-20 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency