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 +12 -0
- data/README.md +11 -5
- data/Rakefile +10 -0
- data/celluloid-http.gemspec +1 -0
- data/lib/celluloid-http/body_decoder.rb +31 -0
- data/lib/celluloid-http/builder.rb +19 -0
- data/lib/celluloid-http/connection.rb +2 -1
- data/lib/celluloid-http/http.rb +6 -2
- data/lib/celluloid-http/request.rb +14 -4
- data/lib/celluloid-http/response.rb +15 -4
- data/lib/celluloid-http/version.rb +1 -1
- data/lib/celluloid-http.rb +2 -0
- data/test/fixtures/gzip.wikipedia.org +0 -0
- data/test/fixtures/post.example.com +8 -0
- data/test/unit/builder_test.rb +27 -0
- data/test/unit/connection_test.rb +12 -0
- data/test/unit/http_test.rb +18 -0
- data/test/unit/request_test.rb +30 -0
- metadata +35 -2
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Celluloid::Http
|
2
2
|
|
3
|
-
|
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
|
-
|
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.
|
28
|
-
4.
|
29
|
-
5.
|
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
data/celluloid-http.gemspec
CHANGED
@@ -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,
|
36
|
+
connection.open(host, port)
|
36
37
|
connection
|
37
38
|
end
|
38
39
|
|
data/lib/celluloid-http/http.rb
CHANGED
@@ -9,8 +9,12 @@ module Celluloid::Http::Http
|
|
9
9
|
response
|
10
10
|
end
|
11
11
|
|
12
|
-
def get(
|
13
|
-
send_request Celluloid::Http::
|
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
|
-
@
|
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} #{
|
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, :
|
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
|
-
@
|
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
|
-
@
|
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
|
data/lib/celluloid-http.rb
CHANGED
@@ -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
|
data/test/unit/http_test.rb
CHANGED
@@ -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
|
data/test/unit/request_test.rb
CHANGED
@@ -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¶m=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.
|
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:
|
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
|