astro-em-http-request 0.1.3.20090419 → 0.1.5

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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.bundle
2
+ *.o
3
+ Makefile
4
+ mkmf.log
data/README.rdoc CHANGED
@@ -50,3 +50,20 @@ EventMachine based HTTP Request interface. Supports streaming response processin
50
50
  }
51
51
  }
52
52
 
53
+ == POST example
54
+
55
+ EventMachine.run {
56
+ http1 = EventMachine::HttpRequest.new('http://www.website.com/').post :body => {"key1" => 1, "key2" => [2,3]}
57
+ http2 = EventMachine::HttpRequest.new('http://www.website.com/').post :body => "some data"
58
+
59
+ # ...
60
+ }
61
+
62
+ == Streaming body processing
63
+ EventMachine.run {
64
+ body = ''
65
+ on_body = lambda { |chunk| body += chunk }
66
+ http = EventMachine::HttpRequest.new('http://www.website.com/').get :on_response => on_body
67
+
68
+ # ...
69
+ }
@@ -0,0 +1,42 @@
1
+ spec = Gem::Specification.new do |s|
2
+ s.name = 'em-http-request'
3
+ s.version = '0.1.5'
4
+ s.date = '2009-03-20'
5
+ s.summary = 'EventMachine based HTTP Request interface'
6
+ s.description = s.summary
7
+ s.email = 'ilya@igvita.com'
8
+ s.homepage = "http://github.com/igrigorik/em-http-request"
9
+ s.has_rdoc = true
10
+ s.authors = ["Ilya Grigorik"]
11
+ s.add_dependency('eventmachine', '>= 0.12.2')
12
+ s.extensions = ["ext/buffer/extconf.rb" , "ext/http11_client/extconf.rb"]
13
+ s.rubyforge_project = "em-http-request"
14
+
15
+ # ruby -rpp -e' pp `git ls-files`.split("\n") '
16
+ s.files = [
17
+ ".autotest",
18
+ ".gitignore",
19
+ "LICENSE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "em-http-request.gemspec",
23
+ "ext/buffer/em_buffer.c",
24
+ "ext/buffer/extconf.rb",
25
+ "ext/http11_client/ext_help.h",
26
+ "ext/http11_client/extconf.rb",
27
+ "ext/http11_client/http11_client.c",
28
+ "ext/http11_client/http11_parser.c",
29
+ "ext/http11_client/http11_parser.h",
30
+ "ext/http11_client/http11_parser.rl",
31
+ "lib/em-http.rb",
32
+ "lib/em-http/client.rb",
33
+ "lib/em-http/core_ext/hash.rb",
34
+ "lib/em-http/decoders.rb",
35
+ "lib/em-http/multi.rb",
36
+ "lib/em-http/request.rb",
37
+ "test/hash.rb",
38
+ "test/helper.rb",
39
+ "test/stallion.rb",
40
+ "test/test_multi.rb",
41
+ "test/test_request.rb"]
42
+ end
data/lib/em-http.rb CHANGED
@@ -11,6 +11,7 @@ require 'eventmachine'
11
11
  require File.dirname(__FILE__) + '/http11_client'
12
12
  require File.dirname(__FILE__) + '/em_buffer'
13
13
 
14
+ require File.dirname(__FILE__) + '/em-http/core_ext/hash'
14
15
  require File.dirname(__FILE__) + '/em-http/client'
15
16
  require File.dirname(__FILE__) + '/em-http/multi'
16
17
  require File.dirname(__FILE__) + '/em-http/request'
@@ -219,7 +219,13 @@ module EventMachine
219
219
  end
220
220
 
221
221
  def send_request_body
222
- send_data @options[:body] if @options[:body]
222
+ return unless @options[:body]
223
+ if @options[:body].is_a? Hash
224
+ body = @options[:body].to_params
225
+ else
226
+ body = @options[:body]
227
+ end
228
+ send_data body
223
229
  end
224
230
 
225
231
  def receive_data(data)
@@ -249,7 +255,7 @@ module EventMachine
249
255
  end
250
256
 
251
257
  def unbind
252
- (@state == :finished) ? succeed : fail
258
+ (@state == :finished) ? succeed(self) : fail
253
259
  close_connection
254
260
  end
255
261
 
@@ -423,6 +429,8 @@ module EventMachine
423
429
 
424
430
  false
425
431
  end
432
+
433
+
426
434
  end
427
435
 
428
436
  end
@@ -0,0 +1,53 @@
1
+ class Hash
2
+ # Stolen partially from Merb : http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
3
+ # Convert this hash to a query string:
4
+ #
5
+ # { :name => "Bob",
6
+ # :address => {
7
+ # :street => '111 Ruby Ave.',
8
+ # :city => 'Ruby Central',
9
+ # :phones => ['111-111-1111', '222-222-2222']
10
+ # }
11
+ # }.to_params
12
+ # #=> "name=Bob&address[city]=Ruby Central&address[phones]=111-111-1111222-222-2222&address[street]=111 Ruby Ave."
13
+ #
14
+ def to_params
15
+ params = ''
16
+ stack = []
17
+
18
+ each do |k, v|
19
+ if v.is_a?(Hash)
20
+ stack << [k,v]
21
+ elsif v.is_a?(Array)
22
+ stack << [k,Hash.from_array(v)]
23
+ else
24
+ params << "#{k}=#{v}&"
25
+ end
26
+ end
27
+
28
+ stack.each do |parent, hash|
29
+ hash.each do |k, v|
30
+ if v.is_a?(Hash)
31
+ stack << ["#{parent}[#{k}]", v]
32
+ else
33
+ params << "#{parent}[#{k}]=#{v}&"
34
+ end
35
+ end
36
+ end
37
+
38
+ params.chop! # trailing &
39
+ params
40
+ end
41
+
42
+ ##
43
+ # Builds a hash from an array with keys as array indices.
44
+ def self.from_array(array = [])
45
+ h = Hash.new
46
+ array.size.times do |t|
47
+ h[t] = array[t]
48
+ end
49
+ h
50
+ end
51
+
52
+ end
53
+
data/test/hash.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'test/helper'
2
+
3
+ describe Hash do
4
+ describe ".to_params" do
5
+ it "should transform a basic hash into HTTP POST Params" do
6
+ {:a => "alpha", :b => "beta"}.to_params.should == "a=alpha&b=beta"
7
+ end
8
+
9
+ it "should transform a more complex hash into HTTP POST Params" do
10
+ {:a => "a", :b => ["c", "d", "e"]}.to_params.should == "a=a&b[0]=c&b[1]=d&b[2]=e"
11
+ end
12
+
13
+ it "should transform a very complex hash into HTTP POST Params" do
14
+ {:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]}.to_params.should == "a=a&b[0][d]=d&b[0][c]=c&b[1][e]=e&b[1][f]=f"
15
+ end
16
+ end
17
+ end
data/test/stallion.rb CHANGED
@@ -81,7 +81,7 @@ Stallion.saddle :spec do |stable|
81
81
  stable.response.write stable.request.query_string
82
82
 
83
83
  elsif stable.request.post?
84
- stable.response.write 'test'
84
+ stable.response.write stable.request.body.read
85
85
 
86
86
  elsif stable.request.path_info == '/timeout'
87
87
  sleep(10)
data/test/test_request.rb CHANGED
@@ -19,7 +19,7 @@ describe EventMachine::HttpRequest do
19
19
  }
20
20
  end
21
21
 
22
- it "should fail GET on invalid host" do
22
+ it "should fail GET on invalid host" do
23
23
  EventMachine.run {
24
24
  http = EventMachine::HttpRequest.new('http://google1.com/').get
25
25
  http.callback { failed }
@@ -112,7 +112,21 @@ describe EventMachine::HttpRequest do
112
112
  http.errback { failed }
113
113
  http.callback {
114
114
  http.response_header.status.should == 200
115
- http.response.should match(/test/)
115
+ http.response.should match(/data/)
116
+ EventMachine.stop
117
+ }
118
+ }
119
+ end
120
+
121
+ it "should perform successfull POST with Ruby Hash/Array as params" do
122
+ EventMachine.run {
123
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').post :body => {"key1" => 1, "key2" => [2,3]}
124
+
125
+ http.errback { failed }
126
+ http.callback {
127
+ http.response_header.status.should == 200
128
+
129
+ http.response.should match(/key1=1&key2\[0\]=2&key2\[1\]=3/)
116
130
  EventMachine.stop
117
131
  }
118
132
  }
@@ -236,7 +250,7 @@ describe EventMachine::HttpRequest do
236
250
  body = ''
237
251
  on_body = lambda { |chunk| body += chunk }
238
252
  http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/deflate').get :head => {"accept-encoding" => "deflate, compressed"},
239
- :on_response => on_body
253
+ :on_response => on_body
240
254
 
241
255
  http.errback { failed }
242
256
  http.callback {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: astro-em-http-request
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3.20090419
4
+ version: 0.1.5
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-04-19 00:00:00 -07:00
12
+ date: 2009-03-20 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -33,9 +33,11 @@ extra_rdoc_files: []
33
33
 
34
34
  files:
35
35
  - .autotest
36
+ - .gitignore
36
37
  - LICENSE
37
38
  - README.rdoc
38
39
  - Rakefile
40
+ - em-http-request.gemspec
39
41
  - ext/buffer/em_buffer.c
40
42
  - ext/buffer/extconf.rb
41
43
  - ext/http11_client/ext_help.h
@@ -46,9 +48,11 @@ files:
46
48
  - ext/http11_client/http11_parser.rl
47
49
  - lib/em-http.rb
48
50
  - lib/em-http/client.rb
51
+ - lib/em-http/core_ext/hash.rb
52
+ - lib/em-http/decoders.rb
49
53
  - lib/em-http/multi.rb
50
54
  - lib/em-http/request.rb
51
- - lib/em-http/decoders.rb
55
+ - test/hash.rb
52
56
  - test/helper.rb
53
57
  - test/stallion.rb
54
58
  - test/test_multi.rb