celluloid-http 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ rvm:
2
+ - 1.9.3-p194
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - ruby-head
6
+ - jruby-head
7
+
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: 2.0.0
11
+ - rvm: ruby-head
12
+ - rvm: jruby-head
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Celluloid::Http
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/NOX73/celluloid-http.png?branch=master)](https://travis-ci.org/NOX73/celluloid-http)
4
+
5
+ Http request implementation based on celluloid::io.
4
6
 
5
7
  ## Installation
6
8
 
@@ -18,12 +20,16 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ Celluloid::Http.get('http://en.wikipedia.org/wiki/Http')
24
+
25
+ See test/unit/http_test.rb for more examples.
22
26
 
23
27
  ## Contributing
24
28
 
25
29
  1. Fork it
26
30
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
31
+ 3. Write code
32
+ 4. Run test (`bundle exec rake test`)
33
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 6. Push to the branch (`git push origin my-new-feature`)
35
+ 7. Create new Pull Request
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << 'test'
6
+ test.test_files = FileList['test/*/*_test.rb']
7
+ test.verbose = true
8
+ end
9
+
10
+ desc "Run Tests"
11
+ task :default => :test
@@ -22,6 +22,7 @@ Gem::Specification.new do |gem|
22
22
  gem.add_runtime_dependency('http_parser.rb')
23
23
  gem.add_runtime_dependency('activesupport')
24
24
 
25
+ gem.add_development_dependency('rake')
25
26
  gem.add_development_dependency('turn')
26
27
  gem.add_development_dependency('minitest')
27
28
  gem.add_development_dependency('mocha')
@@ -0,0 +1,31 @@
1
+ require 'zlib'
2
+
3
+ class Celluloid::Http::BodyDecoder
4
+
5
+ class<<self
6
+
7
+ def decode(headers, raw_body)
8
+ new(headers, raw_body).decode.body
9
+ end
10
+
11
+ end
12
+
13
+ attr_reader :headers, :body
14
+ def initialize(headers, raw_body)
15
+ @headers, @body = headers, raw_body
16
+ end
17
+
18
+ def decode
19
+ @body = gunzip(@body) if zip?
20
+ self
21
+ end
22
+
23
+ def gunzip(body)
24
+ Zlib::GzipReader.new(StringIO.new(body)).read
25
+ end
26
+
27
+ def zip?
28
+ @headers['Content-Encoding'] == 'gzip'
29
+ end
30
+
31
+ end
@@ -0,0 +1,19 @@
1
+ class Celluloid::Http::Builder
2
+
3
+ class<<self
4
+
5
+ def get(url)
6
+ Celluloid::Http::Request.new url
7
+ end
8
+
9
+ def post(url, params)
10
+ options = {
11
+ form_data: params,
12
+ method: :post
13
+ }
14
+ Celluloid::Http::Request.new url, options
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -8,6 +8,7 @@ class Celluloid::Http::Connection
8
8
 
9
9
  def close
10
10
  socket.close
11
+ terminate
11
12
  end
12
13
 
13
14
  def send_request(request)
@@ -32,7 +33,7 @@ class Celluloid::Http::Connection
32
33
 
33
34
  def self.open(host, port = 80)
34
35
  connection = self.new
35
- connection.open(host, 80)
36
+ connection.open(host, port)
36
37
  connection
37
38
  end
38
39
 
@@ -9,8 +9,12 @@ module Celluloid::Http::Http
9
9
  response
10
10
  end
11
11
 
12
- def get(url)
13
- send_request Celluloid::Http::Request.new url
12
+ def get(*args)
13
+ send_request Celluloid::Http::Builder.get(*args)
14
+ end
15
+
16
+ def post(*args)
17
+ send_request Celluloid::Http::Builder.post(*args)
14
18
  end
15
19
 
16
20
  end
@@ -5,16 +5,16 @@ class Celluloid::Http::Request
5
5
  DEFAULT_METHOD = :get
6
6
  DEFAULT_HTTP_VERSION = '1.1'
7
7
 
8
- attr_accessor :method, :body
8
+ attr_accessor :method, :body, :form_data
9
9
 
10
10
  def_delegators :@uri, :scheme, :host, :path, :port, :query
11
11
  def_delegators :@uri, :scheme=, :host=, :path=, :port=
12
12
 
13
13
  def initialize(url, options = {})
14
- @url = url
15
14
  @uri = URI.parse url
16
15
  @method = options[:method] || DEFAULT_METHOD
17
- @body = options[:body]
16
+ @raw_body = options[:raw_body]
17
+ @form_data = options[:form_data]
18
18
 
19
19
  merge_query_params(options[:query_params]) if options[:query_params]
20
20
  end
@@ -24,13 +24,17 @@ class Celluloid::Http::Request
24
24
  end
25
25
 
26
26
  def to_s
27
- "#{method.to_s.upcase} #{url} HTTP/#{DEFAULT_HTTP_VERSION}\nHOST: #{host}\n\n"
27
+ "#{method.to_s.upcase} #{uri} HTTP/#{DEFAULT_HTTP_VERSION}\nHost: #{host}\n\n#{body}"
28
28
  end
29
29
 
30
30
  def url
31
31
  @uri.to_s
32
32
  end
33
33
 
34
+ def uri
35
+ "#{ "/" if path.length.zero? }#{path}#{ "?" if query }#{query}"
36
+ end
37
+
34
38
  def query=(val)
35
39
  @uri.query = val.is_a?(Hash) ? val.to_query : val
36
40
  end
@@ -40,4 +44,10 @@ class Celluloid::Http::Request
40
44
  self.query = params
41
45
  end
42
46
 
47
+ def body
48
+ @body = @raw_body if @raw_body
49
+ @body = @form_data.to_query if @form_data
50
+ @body
51
+ end
52
+
43
53
  end
@@ -6,11 +6,12 @@ class Celluloid::Http::Response
6
6
  def_delegators :parser, :<<
7
7
 
8
8
  attr_writer :status
9
- attr_accessor :headers, :body
9
+ attr_accessor :headers, :raw_body
10
10
 
11
- def initialize(status = nil, headers = {}, body = "")
11
+ def initialize(status = nil, headers = {}, body = nil)
12
12
  @status, @headers, @body = status, headers, body
13
- @finished = false
13
+ @raw_body = ""
14
+ @finished = !!@body
14
15
  end
15
16
 
16
17
  def status
@@ -18,6 +19,7 @@ class Celluloid::Http::Response
18
19
  end
19
20
 
20
21
  def on_message_complete
22
+ @body = decoded_body
21
23
  @finished = true
22
24
  end
23
25
 
@@ -26,7 +28,7 @@ class Celluloid::Http::Response
26
28
  end
27
29
 
28
30
  def on_body(chunk)
29
- @body << chunk
31
+ @raw_body << chunk
30
32
  end
31
33
 
32
34
  def on_headers_complete(headers)
@@ -45,4 +47,13 @@ class Celluloid::Http::Response
45
47
  reason.downcase.gsub(/\s|-/, '_').to_sym
46
48
  end
47
49
 
50
+ def body
51
+ on_message_complete unless finished?
52
+ @body ||= ""
53
+ end
54
+
55
+ def decoded_body
56
+ Celluloid::Http::BodyDecoder.decode(headers, raw_body)
57
+ end
58
+
48
59
  end
@@ -1,5 +1,5 @@
1
1
  module Celluloid
2
2
  module Http
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -10,6 +10,8 @@ module Celluloid
10
10
  autoload :Request, 'celluloid-http/request'
11
11
  autoload :Http, 'celluloid-http/http'
12
12
  autoload :Connection, 'celluloid-http/connection'
13
+ autoload :Builder, 'celluloid-http/builder'
14
+ autoload :BodyDecoder, 'celluloid-http/body_decoder'
13
15
 
14
16
  extend Http
15
17
  end
Binary file
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Mon, 28 Jan 2013 18:56:25 GMT
3
+ Status: 200 OK
4
+ Connection: close
5
+ Content-Type: application/json; charset=utf-8
6
+ Content-Length: 133
7
+
8
+ {"comment":{"id":31,"message":"My comment.","author_name":"Guest 1359395318.7592747","created_at":"Mon, 28 Jan 2013 22:56:25 +0400"}}
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class BuilderTest < TestCase
4
+
5
+ def test_create_get_request
6
+ url = 'http://en.wikipedia.org/wiki/Http?param=value'
7
+
8
+ request = Celluloid::Http::Builder.get(url)
9
+
10
+ assert_equal "en.wikipedia.org", request.host
11
+ assert_equal :get, request.method
12
+ end
13
+
14
+ def test_create_post_request
15
+ url = 'http://en.wikipedia.org/wiki/Http?param=value'
16
+
17
+ params = {:param2 => "value2"}
18
+
19
+ request = Celluloid::Http::Builder.post(url, params)
20
+
21
+ assert_equal "en.wikipedia.org", request.host
22
+ assert_equal :post, request.method
23
+ end
24
+
25
+
26
+
27
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class ConnectionTest < TestCase
4
+
5
+ def test_static_constructor
6
+ connection = mock('Connection')
7
+ connection.expects(:open).with('host',8080)
8
+ Celluloid::Http::Connection.expects(:new).returns(connection)
9
+
10
+ Celluloid::Http::Connection.open('host',8080)
11
+ end
12
+ end
@@ -15,7 +15,25 @@ class HttpTest < TestCase
15
15
  stub_connection_with_fixture("en.wikipedia.org")
16
16
 
17
17
  response = Celluloid::Http.get('http://en.wikipedia.org/wiki/Http')
18
+
18
19
  assert_match /Wikipedia, the free encyclopedia/, response.body
19
20
  end
20
21
 
22
+ def test_http_get_gzip_method
23
+ stub_connection_with_fixture("gzip.wikipedia.org")
24
+
25
+ response = Celluloid::Http.get('http://en.wikipedia.org/wiki/Chunked_transfer_encoding')
26
+
27
+ assert_match /Chunked transfer encoding/, response.body
28
+ end
29
+
30
+ def test_http_post_method
31
+ stub_connection_with_fixture("post.example.com")
32
+
33
+ params = { :comment => { :message => "My comment." } }
34
+ response = Celluloid::Http.post('http://example.com/api/comments', params)
35
+
36
+ assert_match /"message":"My comment."/, response.body
37
+ end
38
+
21
39
  end
@@ -45,5 +45,35 @@ class RequestTest < TestCase
45
45
  assert_equal 'value3', request.query_params['param3']
46
46
  end
47
47
 
48
+ def test_get_http_request_to_s
49
+ request = Celluloid::Http::Request.new 'http://localhost?param=value'
50
+
51
+ string_request = <<-eos
52
+ GET /?param=value HTTP/1.1
53
+ Host: localhost
54
+
55
+ eos
56
+
57
+ assert_equal string_request, request.to_s
58
+ end
59
+
60
+ def test_post_http_request_to_s
61
+ options = {
62
+ method: :post,
63
+ form_data: {param: :value, param2: :value2 }
64
+ }
65
+ request = Celluloid::Http::Request.new 'http://localhost', options
66
+
67
+ string_request = <<-eos
68
+ POST / HTTP/1.1
69
+ Host: localhost
70
+
71
+ param2=value2&param=value
72
+ eos
73
+
74
+ # without \n symbol
75
+ assert_equal string_request[0...-1], request.to_s
76
+ end
77
+
48
78
 
49
79
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: celluloid-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-31 00:00:00.000000000 Z
12
+ date: 2013-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
78
94
  - !ruby/object:Gem::Dependency
79
95
  name: turn
80
96
  requirement: !ruby/object:Gem::Requirement
@@ -131,20 +147,27 @@ extensions: []
131
147
  extra_rdoc_files: []
132
148
  files:
133
149
  - .gitignore
150
+ - .travis.yml
134
151
  - Gemfile
135
152
  - LICENSE.txt
136
153
  - README.md
137
154
  - Rakefile
138
155
  - celluloid-http.gemspec
139
156
  - lib/celluloid-http.rb
157
+ - lib/celluloid-http/body_decoder.rb
158
+ - lib/celluloid-http/builder.rb
140
159
  - lib/celluloid-http/connection.rb
141
160
  - lib/celluloid-http/http.rb
142
161
  - lib/celluloid-http/request.rb
143
162
  - lib/celluloid-http/response.rb
144
163
  - lib/celluloid-http/version.rb
145
164
  - test/fixtures/en.wikipedia.org
165
+ - test/fixtures/gzip.wikipedia.org
166
+ - test/fixtures/post.example.com
146
167
  - test/support/tcp_socket_stub.rb
147
168
  - test/test_helper.rb
169
+ - test/unit/builder_test.rb
170
+ - test/unit/connection_test.rb
148
171
  - test/unit/http_test.rb
149
172
  - test/unit/request_test.rb
150
173
  - test/unit/response_test.rb
@@ -160,12 +183,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
183
  - - ! '>='
161
184
  - !ruby/object:Gem::Version
162
185
  version: '0'
186
+ segments:
187
+ - 0
188
+ hash: 4403004894707993416
163
189
  required_rubygems_version: !ruby/object:Gem::Requirement
164
190
  none: false
165
191
  requirements:
166
192
  - - ! '>='
167
193
  - !ruby/object:Gem::Version
168
194
  version: '0'
195
+ segments:
196
+ - 0
197
+ hash: 4403004894707993416
169
198
  requirements: []
170
199
  rubyforge_project:
171
200
  rubygems_version: 1.8.24
@@ -174,8 +203,12 @@ specification_version: 3
174
203
  summary: Http requests for celluloid. Based on Celluloid::IO.
175
204
  test_files:
176
205
  - test/fixtures/en.wikipedia.org
206
+ - test/fixtures/gzip.wikipedia.org
207
+ - test/fixtures/post.example.com
177
208
  - test/support/tcp_socket_stub.rb
178
209
  - test/test_helper.rb
210
+ - test/unit/builder_test.rb
211
+ - test/unit/connection_test.rb
179
212
  - test/unit/http_test.rb
180
213
  - test/unit/request_test.rb
181
214
  - test/unit/response_test.rb