http 0.5.0.pre → 0.5.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of http might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/CHANGES.md +7 -6
- data/README.md +18 -31
- data/Rakefile +2 -2
- data/examples/celluloid.rb +2 -2
- data/http.gemspec +1 -1
- data/lib/http.rb +1 -14
- data/lib/http/chainable.rb +4 -4
- data/lib/http/client.rb +11 -10
- data/lib/http/header.rb +11 -0
- data/lib/http/mime_type.rb +1 -1
- data/lib/http/mime_types/json.rb +1 -1
- data/lib/http/options.rb +7 -6
- data/lib/http/request.rb +11 -3
- data/lib/http/response.rb +6 -3
- data/lib/http/response_parser.rb +2 -2
- data/lib/http/version.rb +1 -1
- data/spec/http/options/body_spec.rb +5 -5
- data/spec/http/options/callbacks_spec.rb +18 -18
- data/spec/http/options/form_spec.rb +5 -5
- data/spec/http/options/headers_spec.rb +9 -9
- data/spec/http/options/merge_spec.rb +11 -11
- data/spec/http/options/new_spec.rb +14 -14
- data/spec/http/options/proxy_spec.rb +6 -6
- data/spec/http/options/response_spec.rb +7 -7
- data/spec/http/options_spec.rb +5 -5
- data/spec/http/request_spec.rb +19 -0
- data/spec/http/request_stream_spec.rb +6 -7
- data/spec/http/response_spec.rb +12 -12
- data/spec/http_spec.rb +39 -39
- data/spec/spec_helper.rb +6 -0
- metadata +7 -7
- data/lib/http/compat/curb.rb +0 -87
- data/spec/http/compat/curb_spec.rb +0 -40
data/spec/http/response_spec.rb
CHANGED
@@ -1,34 +1,34 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe HTTP::Response do
|
4
4
|
describe "headers" do
|
5
|
-
subject {
|
5
|
+
subject { HTTP::Response.new(200, "1.1", "Content-Type" => "text/plain") }
|
6
6
|
|
7
7
|
it "exposes header fields for easy access" do
|
8
|
-
subject["Content-Type"].
|
8
|
+
expect(subject["Content-Type"]).to eq("text/plain")
|
9
9
|
end
|
10
10
|
|
11
11
|
it "provides a #headers accessor too" do
|
12
|
-
subject.headers.
|
12
|
+
expect(subject.headers).to eq("Content-Type" => "text/plain")
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#parse_body" do
|
17
17
|
context "on a registered MIME type" do
|
18
18
|
let(:body) { ::JSON.dump("Hello" => "World") }
|
19
|
-
subject {
|
19
|
+
subject { HTTP::Response.new(200, "1.1", {"Content-Type" => "application/json"}, body) }
|
20
20
|
|
21
21
|
it "returns a parsed response body" do
|
22
|
-
subject.parse_body.
|
22
|
+
expect(subject.parse_body).to eq ::JSON.parse(body)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
context "on an unregistered MIME type" do
|
27
27
|
let(:body) { "Hello world" }
|
28
|
-
subject {
|
28
|
+
subject { HTTP::Response.new(200, "1.1", {"Content-Type" => "text/plain"}, body) }
|
29
29
|
|
30
30
|
it "returns the raw body as a String" do
|
31
|
-
subject.parse_body.
|
31
|
+
expect(subject.parse_body).to eq(body)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -37,20 +37,20 @@ describe Http::Response do
|
|
37
37
|
context "on a registered MIME type" do
|
38
38
|
let(:body) { ::JSON.dump("Hello" => "World") }
|
39
39
|
let(:content_type) { "application/json" }
|
40
|
-
subject {
|
40
|
+
subject { HTTP::Response.new(200, "1.1", {"Content-Type" => content_type}, body) }
|
41
41
|
|
42
42
|
it "retuns a Rack-like array with a parsed response body" do
|
43
|
-
subject.to_a.
|
43
|
+
expect(subject.to_a).to eq([200, {"Content-Type" => content_type}, ::JSON.parse(body)])
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
context "on an unregistered MIME type" do
|
48
48
|
let(:body) { "Hello world" }
|
49
49
|
let(:content_type) { "text/plain" }
|
50
|
-
subject {
|
50
|
+
subject { HTTP::Response.new(200, "1.1", {"Content-Type" => content_type}, body) }
|
51
51
|
|
52
52
|
it "returns a Rack-like array" do
|
53
|
-
subject.to_a.
|
53
|
+
expect(subject.to_a).to eq([200, {"Content-Type" => content_type}, body])
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
data/spec/http_spec.rb
CHANGED
@@ -1,79 +1,79 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe HTTP do
|
5
5
|
let(:test_endpoint) { "http://127.0.0.1:#{ExampleService::PORT}/" }
|
6
6
|
let(:proxy_endpoint) { "#{test_endpoint}proxy" }
|
7
7
|
|
8
8
|
context "getting resources" do
|
9
9
|
it "should be easy" do
|
10
|
-
response =
|
11
|
-
response.
|
10
|
+
response = HTTP.get test_endpoint
|
11
|
+
expect(response).to match(/<!doctype html>/)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should be easy to get a response object" do
|
15
|
-
response =
|
16
|
-
response.
|
15
|
+
response = HTTP.get(test_endpoint).response
|
16
|
+
expect(response).to be_a HTTP::Response
|
17
17
|
end
|
18
18
|
|
19
19
|
context "with_response" do
|
20
20
|
it 'allows specifying :object' do
|
21
|
-
res =
|
22
|
-
res.
|
21
|
+
res = HTTP.with_response(:object).get test_endpoint
|
22
|
+
expect(res).to be_a(HTTP::Response)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
context "with query string parameters" do
|
27
27
|
|
28
28
|
it "should be easy" do
|
29
|
-
response =
|
30
|
-
response.
|
29
|
+
response = HTTP.get "#{test_endpoint}params" , :params => {:foo => 'bar'}
|
30
|
+
expect(response).to match(/Params!/)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
context "with headers" do
|
35
35
|
it "should be easy" do
|
36
|
-
response =
|
37
|
-
response['json'].
|
36
|
+
response = HTTP.accept(:json).get test_endpoint
|
37
|
+
expect(response['json']).to be_true
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
context "with callbacks" do
|
42
42
|
it "fires a request callback" do
|
43
|
-
pending '
|
43
|
+
pending 'HTTP::Request is not yet implemented'
|
44
44
|
|
45
45
|
request = nil
|
46
|
-
|
47
|
-
request.
|
46
|
+
HTTP.on(:request) {|r| request = r}.get test_endpoint
|
47
|
+
expect(request).to be_a HTTP::Request
|
48
48
|
end
|
49
49
|
|
50
50
|
it "fires a response callback" do
|
51
51
|
response = nil
|
52
|
-
|
53
|
-
response.
|
52
|
+
HTTP.on(:response) {|r| response = r}.get test_endpoint
|
53
|
+
expect(response).to be_a HTTP::Response
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should not mess with the returned status" do
|
58
|
-
client =
|
58
|
+
client = HTTP.with_response(:object)
|
59
59
|
res = client.get test_endpoint
|
60
|
-
res.status.
|
60
|
+
expect(res.status).to eq(200)
|
61
61
|
res = client.get "#{test_endpoint}not-found"
|
62
|
-
res.status.
|
62
|
+
expect(res.status).to eq(404)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
context "with http proxy address and port" do
|
67
67
|
it "should proxy the request" do
|
68
|
-
response =
|
69
|
-
response.
|
68
|
+
response = HTTP.via("127.0.0.1", 8080).get proxy_endpoint
|
69
|
+
expect(response).to match(/Proxy!/)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
context "with http proxy address, port username and password" do
|
74
74
|
it "should proxy the request" do
|
75
|
-
response =
|
76
|
-
response.
|
75
|
+
response = HTTP.via("127.0.0.1", 8081, "username", "password").get proxy_endpoint
|
76
|
+
expect(response).to match(/Proxy!/)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -81,55 +81,55 @@ describe Http do
|
|
81
81
|
it "should proxy the request" do
|
82
82
|
pending "fixing proxy support"
|
83
83
|
|
84
|
-
response =
|
85
|
-
response.
|
84
|
+
response = HTTP.via("127.0.0.1", 8081, "user", "pass").get proxy_endpoint
|
85
|
+
expect(response).to match(/Proxy Authentication Required/)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
context "without proxy port" do
|
90
90
|
it "should raise an argument error" do
|
91
|
-
expect {
|
91
|
+
expect { HTTP.via("127.0.0.1") }.to raise_error ArgumentError
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
95
|
context "posting to resources" do
|
96
96
|
it "should be easy to post forms" do
|
97
|
-
response =
|
98
|
-
response.
|
97
|
+
response = HTTP.post "#{test_endpoint}form", :form => {:example => 'testing-form'}
|
98
|
+
expect(response).to eq("passed :)")
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
context "posting with an explicit body" do
|
103
103
|
it "should be easy to post" do
|
104
|
-
response =
|
105
|
-
response.
|
104
|
+
response = HTTP.post "#{test_endpoint}body", :body => "testing-body"
|
105
|
+
expect(response).to eq("passed :)")
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
context "with redirects" do
|
110
110
|
it "should be easy for 301" do
|
111
|
-
response =
|
112
|
-
response.
|
111
|
+
response = HTTP.with_follow(true).get("#{test_endpoint}redirect-301")
|
112
|
+
expect(response).to match(/<!doctype html>/)
|
113
113
|
end
|
114
114
|
|
115
115
|
it "should be easy for 302" do
|
116
|
-
response =
|
117
|
-
response.
|
116
|
+
response = HTTP.with_follow(true).get("#{test_endpoint}redirect-302")
|
117
|
+
expect(response).to match(/<!doctype html>/)
|
118
118
|
end
|
119
119
|
|
120
120
|
end
|
121
121
|
|
122
122
|
context "head requests" do
|
123
123
|
it "should be easy" do
|
124
|
-
response =
|
125
|
-
response.status.
|
126
|
-
response['content-type'].
|
124
|
+
response = HTTP.head test_endpoint
|
125
|
+
expect(response.status).to eq(200)
|
126
|
+
expect(response['content-type']).to match(/html/)
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
130
|
it "should be chainable" do
|
131
|
-
response =
|
132
|
-
response['json'].
|
131
|
+
response = HTTP.accept(:json).on(:response){|r| r}.get(test_endpoint)
|
132
|
+
expect(response['json']).to be_true
|
133
133
|
end
|
134
134
|
|
135
135
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.
|
4
|
+
version: 0.5.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http_parser.rb
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.11'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.11'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: json
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,7 +89,7 @@ files:
|
|
89
89
|
- lib/http.rb
|
90
90
|
- lib/http/chainable.rb
|
91
91
|
- lib/http/client.rb
|
92
|
-
- lib/http/
|
92
|
+
- lib/http/header.rb
|
93
93
|
- lib/http/mime_type.rb
|
94
94
|
- lib/http/mime_types/json.rb
|
95
95
|
- lib/http/options.rb
|
@@ -99,7 +99,6 @@ files:
|
|
99
99
|
- lib/http/response_parser.rb
|
100
100
|
- lib/http/uri_backport.rb
|
101
101
|
- lib/http/version.rb
|
102
|
-
- spec/http/compat/curb_spec.rb
|
103
102
|
- spec/http/options/body_spec.rb
|
104
103
|
- spec/http/options/callbacks_spec.rb
|
105
104
|
- spec/http/options/form_spec.rb
|
@@ -109,6 +108,7 @@ files:
|
|
109
108
|
- spec/http/options/proxy_spec.rb
|
110
109
|
- spec/http/options/response_spec.rb
|
111
110
|
- spec/http/options_spec.rb
|
111
|
+
- spec/http/request_spec.rb
|
112
112
|
- spec/http/request_stream_spec.rb
|
113
113
|
- spec/http/response_spec.rb
|
114
114
|
- spec/http_spec.rb
|
@@ -139,7 +139,6 @@ signing_key:
|
|
139
139
|
specification_version: 4
|
140
140
|
summary: HTTP should be easy
|
141
141
|
test_files:
|
142
|
-
- spec/http/compat/curb_spec.rb
|
143
142
|
- spec/http/options/body_spec.rb
|
144
143
|
- spec/http/options/callbacks_spec.rb
|
145
144
|
- spec/http/options/form_spec.rb
|
@@ -149,6 +148,7 @@ test_files:
|
|
149
148
|
- spec/http/options/proxy_spec.rb
|
150
149
|
- spec/http/options/response_spec.rb
|
151
150
|
- spec/http/options_spec.rb
|
151
|
+
- spec/http/request_spec.rb
|
152
152
|
- spec/http/request_stream_spec.rb
|
153
153
|
- spec/http/response_spec.rb
|
154
154
|
- spec/http_spec.rb
|
data/lib/http/compat/curb.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'http'
|
2
|
-
|
3
|
-
# Compatibility with the Curb gem
|
4
|
-
module Curl
|
5
|
-
module Err
|
6
|
-
class CurlError < RuntimeError; end
|
7
|
-
class ConnectionFailedError < CurlError; end
|
8
|
-
class HostResolutionError < CurlError; end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Easy
|
12
|
-
attr_accessor :headers, :encoding
|
13
|
-
attr_reader :response_code, :body_str
|
14
|
-
|
15
|
-
def self.http_post(url, request_body = nil)
|
16
|
-
Easy.new(url).tap { |e| e.http_post(request_body) }
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.http_get(url, request_body = nil)
|
20
|
-
Easy.new(url).tap { |e| e.http_get(request_body) }
|
21
|
-
end
|
22
|
-
|
23
|
-
def initialize(url = nil, method = nil, request_body = nil, headers = {})
|
24
|
-
@url = url
|
25
|
-
@method = method
|
26
|
-
@request_body = request_body
|
27
|
-
@headers = headers
|
28
|
-
@response_code = @body_str = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
def perform
|
32
|
-
client = Http::Client.new
|
33
|
-
options = {:response => :object, :headers => @headers}
|
34
|
-
response = client.request @method, @url, options
|
35
|
-
@response_code, @body_str = response.code, response.body
|
36
|
-
true
|
37
|
-
rescue SocketError => ex
|
38
|
-
if ex.message['getaddrinfo'] || ex.message['ame or service not known']
|
39
|
-
raise Err::HostResolutionError, ex.message
|
40
|
-
else
|
41
|
-
raise Err::ConnectionFailedError, ex.message
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def http_get(request_body = nil)
|
46
|
-
@method, @request_body = :get, request_body
|
47
|
-
perform
|
48
|
-
end
|
49
|
-
|
50
|
-
def http_put(request_body = nil)
|
51
|
-
@method, @request_body = :put, request_body
|
52
|
-
perform
|
53
|
-
end
|
54
|
-
|
55
|
-
def http_post(request_body = nil)
|
56
|
-
@method, @request_body = :post, request_body
|
57
|
-
perform
|
58
|
-
end
|
59
|
-
|
60
|
-
def http_delete
|
61
|
-
@method = :delete
|
62
|
-
perform
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
class Multi
|
67
|
-
def initialize
|
68
|
-
@clients = []
|
69
|
-
@done = false
|
70
|
-
end
|
71
|
-
|
72
|
-
def add(client)
|
73
|
-
@clients << client
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
def perform
|
78
|
-
return if @done
|
79
|
-
|
80
|
-
@clients.map do |client|
|
81
|
-
Thread.new { client.perform }
|
82
|
-
end.each(&:join)
|
83
|
-
|
84
|
-
@done = true
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'http/compat/curb'
|
4
|
-
|
5
|
-
describe Curl do
|
6
|
-
let(:test_endpoint) { "http://127.0.0.1:#{ExampleService::PORT}/" }
|
7
|
-
|
8
|
-
describe Curl::Easy do
|
9
|
-
it "gets resources" do
|
10
|
-
response = Curl::Easy.http_get test_endpoint
|
11
|
-
response.body_str.should match(/<!doctype html>/)
|
12
|
-
end
|
13
|
-
|
14
|
-
context :errors do
|
15
|
-
it "raises Curl::Err::HostResolutionError if asked to connect to a nonexistent domain" do
|
16
|
-
expect {
|
17
|
-
Curl::Easy.http_get "http://totallynonexistentdomain.com"
|
18
|
-
}.to raise_exception(Curl::Err::HostResolutionError)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe Curl::Multi do
|
24
|
-
it "gets resources" do
|
25
|
-
requests = [test_endpoint]
|
26
|
-
responses = []
|
27
|
-
|
28
|
-
multi = Curl::Multi.new
|
29
|
-
|
30
|
-
requests.each do |url|
|
31
|
-
response = Curl::Easy.new url, :get
|
32
|
-
multi.add response
|
33
|
-
responses << response
|
34
|
-
end
|
35
|
-
|
36
|
-
multi.perform
|
37
|
-
responses.first.body_str.should match(/<!doctype html>/)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|