http 0.9.9 → 1.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGES.md +15 -11
- data/Gemfile +4 -4
- data/README.md +1 -25
- data/lib/http/chainable.rb +5 -32
- data/lib/http/connection.rb +6 -6
- data/lib/http/headers.rb +5 -9
- data/lib/http/options.rb +1 -10
- data/lib/http/redirector.rb +0 -2
- data/lib/http/request.rb +0 -3
- data/lib/http/response.rb +0 -10
- data/lib/http/response/parser.rb +2 -1
- data/lib/http/response/status.rb +0 -3
- data/lib/http/version.rb +1 -1
- data/spec/lib/http/options_spec.rb +2 -3
- data/spec/lib/http/response/status_spec.rb +2 -2
- data/spec/lib/http_spec.rb +3 -3
- data/spec/support/http_handling_shared.rb +3 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6a3c8891e4a8af6201fcda1333d5570ca5b0c15
|
4
|
+
data.tar.gz: e527a9a5e0976f1e9ef793fd451c127b76738607
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4811c0bf41f037a2615f165d03ee1fd8dee7b42a4e743e1ec35638ca2ab96c82d9b808dfe96eff083003588b98c1dcc1502b8eb23c268e7ef239e388e27a00dc
|
7
|
+
data.tar.gz: 9e7357f1161890a87449b6c92040fff54d9b829481de267d85f0c9337e0ec8e9e3a6a13319ef6055875b09fd39d854f62a48179e1e248da1671c47bc609faf21
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
-
## 0.
|
2
|
-
|
3
|
-
*
|
4
|
-
Remove
|
5
|
-
(
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
(
|
10
|
-
|
1
|
+
## 1.0.0.pre1 (2015-12-05)
|
2
|
+
|
3
|
+
* [#265](https://github.com/httprb/http/pull/265/):
|
4
|
+
Remove deprecations ([@tarcieri]):
|
5
|
+
- HTTP::Chainable#with_follow (use #follow)
|
6
|
+
- HTTP::Chainable#with, #with_headers (use #headers)
|
7
|
+
- HTTP::Chainable#auth(:basic, ...) (use #basic_auth)
|
8
|
+
- HTTP::Chainable#default_headers (use #default_options[:headers])
|
9
|
+
- HTTP::Headers#append (use #add)
|
10
|
+
- HTTP::Options#[] hash-like API deprecated in favor of explicit methods
|
11
|
+
- HTTP::Request#request_header (use #headline)
|
12
|
+
- HTTP::Response::STATUS_CODES (use HTTP::Status::REASONS)
|
13
|
+
- HTTP::Response::SYMBOL_TO_STATUS_CODE (no replacement)
|
14
|
+
- HTTP::Response#status_code (use #status or #code)
|
15
|
+
- HTTP::Response::Status#symbolize (use #to_sym)
|
11
16
|
|
12
17
|
## 0.9.8 (2015-09-29)
|
13
18
|
|
@@ -15,7 +20,6 @@
|
|
15
20
|
Fixed global timeout persisting time left across requests when reusing connections.
|
16
21
|
([@zanker][])
|
17
22
|
|
18
|
-
|
19
23
|
## 0.9.7 (2015-09-19)
|
20
24
|
|
21
25
|
* [#258](https://github.com/httprb/http/pull/258):
|
data/Gemfile
CHANGED
@@ -20,11 +20,11 @@ end
|
|
20
20
|
group :test do
|
21
21
|
gem "backports"
|
22
22
|
gem "coveralls"
|
23
|
-
gem "simplecov",
|
24
|
-
gem "json",
|
25
|
-
gem "
|
23
|
+
gem "simplecov", ">= 0.9"
|
24
|
+
gem "json", ">= 1.8.1"
|
25
|
+
gem "rubocop", "= 0.35.1"
|
26
|
+
gem "rspec", "~> 3.0"
|
26
27
|
gem "rspec-its"
|
27
|
-
gem "rubocop"
|
28
28
|
gem "yardstick"
|
29
29
|
gem "certificate_authority"
|
30
30
|
end
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[![Build Status](https://secure.travis-ci.org/httprb/http.svg?branch=master)](http://travis-ci.org/httprb/http)
|
5
5
|
[![Code Climate](https://codeclimate.com/github/httprb/http.svg?branch=master)](https://codeclimate.com/github/httprb/http)
|
6
6
|
[![Coverage Status](https://coveralls.io/repos/httprb/http/badge.svg?branch=master)](https://coveralls.io/r/httprb/http)
|
7
|
-
|
7
|
+
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/httprb/http/blob/master/LICENSE.txt)
|
8
8
|
|
9
9
|
## About
|
10
10
|
|
@@ -276,30 +276,6 @@ HTTP.persistent('http://en.wikipedia.org') do |http|
|
|
276
276
|
end
|
277
277
|
```
|
278
278
|
|
279
|
-
### Celluloid::IO Support
|
280
|
-
|
281
|
-
http.rb makes it simple to make multiple concurrent HTTP requests from a
|
282
|
-
Celluloid::IO actor. Here's a parallel HTTP fetcher combining http.rb with
|
283
|
-
Celluloid::IO:
|
284
|
-
|
285
|
-
```ruby
|
286
|
-
require "celluloid/io"
|
287
|
-
require "http"
|
288
|
-
|
289
|
-
class HttpFetcher
|
290
|
-
include Celluloid::IO
|
291
|
-
|
292
|
-
def fetch(url)
|
293
|
-
HTTP.get(url, socket_class: Celluloid::IO::TCPSocket)
|
294
|
-
end
|
295
|
-
end
|
296
|
-
```
|
297
|
-
|
298
|
-
There's a little more to it, but that's the core idea!
|
299
|
-
|
300
|
-
* [Full parallel HTTP fetcher example](https://github.com/httprb/http/wiki/Parallel-requests-with-Celluloid%3A%3AIO)
|
301
|
-
* See also: [Celluloid::IO](https://github.com/celluloid/celluloid-io)
|
302
|
-
|
303
279
|
### Timeouts
|
304
280
|
|
305
281
|
By default, HTTP does not timeout on a request. You can enable per operation
|
data/lib/http/chainable.rb
CHANGED
@@ -83,7 +83,10 @@ module HTTP
|
|
83
83
|
# @option options [Float] :write Write timeout
|
84
84
|
# @option options [Float] :connect Connect timeout
|
85
85
|
def timeout(klass, options = {})
|
86
|
-
|
86
|
+
if klass.is_a? Hash
|
87
|
+
options = klass
|
88
|
+
klass = :per_operation
|
89
|
+
end
|
87
90
|
|
88
91
|
klass = case klass.to_sym
|
89
92
|
when :null then HTTP::Timeout::Null
|
@@ -166,24 +169,12 @@ module HTTP
|
|
166
169
|
branch default_options.with_follow opts
|
167
170
|
end
|
168
171
|
|
169
|
-
# @deprecated will be removed in 1.0.0
|
170
|
-
# @see #follow
|
171
|
-
alias_method :with_follow, :follow
|
172
|
-
|
173
172
|
# Make a request with the given headers
|
174
173
|
# @param headers
|
175
174
|
def headers(headers)
|
176
175
|
branch default_options.with_headers(headers)
|
177
176
|
end
|
178
177
|
|
179
|
-
# @deprecated will be removed in 1.0.0
|
180
|
-
# @see #headers
|
181
|
-
alias_method :with, :headers
|
182
|
-
|
183
|
-
# @deprecated will be removed in 1.0.0
|
184
|
-
# @see #headers
|
185
|
-
alias_method :with_headers, :headers
|
186
|
-
|
187
178
|
# Make a request with the given cookies
|
188
179
|
def cookies(cookies)
|
189
180
|
branch default_options.with_cookies(cookies)
|
@@ -197,10 +188,7 @@ module HTTP
|
|
197
188
|
|
198
189
|
# Make a request with the given Authorization header
|
199
190
|
# @param [#to_s] value Authorization header value
|
200
|
-
def auth(value
|
201
|
-
# shim for deprecated auth(:basic, opts).
|
202
|
-
# will be removed in 0.8.0
|
203
|
-
return basic_auth(opts) if :basic == value
|
191
|
+
def auth(value)
|
204
192
|
headers Headers::AUTHORIZATION => value.to_s
|
205
193
|
end
|
206
194
|
|
@@ -229,21 +217,6 @@ module HTTP
|
|
229
217
|
@default_options = HTTP::Options.new(opts)
|
230
218
|
end
|
231
219
|
|
232
|
-
# @deprecated Will be removed in 1.0.0; Use `#default_options#headers`
|
233
|
-
# Get headers of HTTP options
|
234
|
-
def default_headers
|
235
|
-
default_options.headers
|
236
|
-
end
|
237
|
-
|
238
|
-
# Set headers of HTTP options
|
239
|
-
# @deprecated Will be removed in 1.0.0; Use `#headers`
|
240
|
-
# @param headers
|
241
|
-
def default_headers=(headers)
|
242
|
-
@default_options = default_options.dup do |opts|
|
243
|
-
opts.headers = headers
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
220
|
private
|
248
221
|
|
249
222
|
# :nodoc:
|
data/lib/http/connection.rb
CHANGED
@@ -22,15 +22,15 @@ module HTTP
|
|
22
22
|
# @param [HTTP::Options] options
|
23
23
|
def initialize(req, options)
|
24
24
|
@persistent = options.persistent?
|
25
|
-
@keep_alive_timeout = options
|
25
|
+
@keep_alive_timeout = options.keep_alive_timeout.to_f
|
26
26
|
@pending_request = false
|
27
27
|
@pending_response = false
|
28
28
|
@failed_proxy_connect = false
|
29
29
|
|
30
30
|
@parser = Response::Parser.new
|
31
31
|
|
32
|
-
@socket = options
|
33
|
-
@socket.connect(options
|
32
|
+
@socket = options.timeout_class.new(options.timeout_options)
|
33
|
+
@socket.connect(options.socket_class, req.socket_host, req.socket_port)
|
34
34
|
|
35
35
|
send_proxy_connect_request(req)
|
36
36
|
start_tls(req, options)
|
@@ -148,14 +148,14 @@ module HTTP
|
|
148
148
|
def start_tls(req, options)
|
149
149
|
return unless req.uri.https? && !failed_proxy_connect?
|
150
150
|
|
151
|
-
ssl_context = options
|
151
|
+
ssl_context = options.ssl_context
|
152
152
|
|
153
153
|
unless ssl_context
|
154
154
|
ssl_context = OpenSSL::SSL::SSLContext.new
|
155
|
-
ssl_context.set_params(options
|
155
|
+
ssl_context.set_params(options.ssl || {})
|
156
156
|
end
|
157
157
|
|
158
|
-
@socket.start_tls(req.uri.host, options
|
158
|
+
@socket.start_tls(req.uri.host, options.ssl_socket_class, ssl_context)
|
159
159
|
end
|
160
160
|
|
161
161
|
# Open tunnel through proxy
|
data/lib/http/headers.rb
CHANGED
@@ -11,11 +11,11 @@ module HTTP
|
|
11
11
|
include Enumerable
|
12
12
|
|
13
13
|
# Matches HTTP header names when in "Canonical-Http-Format"
|
14
|
-
|
14
|
+
CANONICAL_HEADER = /^[A-Z][a-z]*(-[A-Z][a-z]*)*$/
|
15
15
|
|
16
16
|
# Matches valid header field name according to RFC.
|
17
17
|
# @see http://tools.ietf.org/html/rfc7230#section-3.2
|
18
|
-
|
18
|
+
HEADER_NAME_RE = /^[A-Za-z0-9!#\$%&'*+\-.^_`|~]+$/
|
19
19
|
|
20
20
|
# Class constructor.
|
21
21
|
def initialize
|
@@ -51,9 +51,6 @@ module HTTP
|
|
51
51
|
Array(value).each { |v| @pile << [name, v.to_s] }
|
52
52
|
end
|
53
53
|
|
54
|
-
# @deprecated Will be removed in 1.0.0
|
55
|
-
alias_method :append, :add
|
56
|
-
|
57
54
|
# Returns list of header values if any.
|
58
55
|
#
|
59
56
|
# @return [Array<String>]
|
@@ -194,11 +191,10 @@ module HTTP
|
|
194
191
|
# match {HEADER_NAME_RE}
|
195
192
|
# @return [String] canonical HTTP header name
|
196
193
|
def normalize_header(name)
|
197
|
-
|
198
|
-
|
199
|
-
normalized = name.split(/[\-_]/).each(&:capitalize!).join("-")
|
194
|
+
normalized = name[CANONICAL_HEADER]
|
195
|
+
normalized ||= name.split(/[\-_]/).map(&:capitalize).join("-")
|
200
196
|
|
201
|
-
return normalized if normalized =~
|
197
|
+
return normalized if normalized =~ HEADER_NAME_RE
|
202
198
|
|
203
199
|
fail InvalidHeaderNameError, "Invalid HTTP header field name: #{name.inspect}"
|
204
200
|
end
|
data/lib/http/options.rb
CHANGED
@@ -91,15 +91,6 @@ module HTTP
|
|
91
91
|
!persistent.nil?
|
92
92
|
end
|
93
93
|
|
94
|
-
# @deprecated
|
95
|
-
def [](option)
|
96
|
-
send(option)
|
97
|
-
rescue
|
98
|
-
warn "[DEPRECATED] `HTTP::Options#[:#{option}]` was deprecated. " \
|
99
|
-
"Use `HTTP::Options##{option}` instead."
|
100
|
-
nil
|
101
|
-
end
|
102
|
-
|
103
94
|
def merge(other)
|
104
95
|
h1 = to_hash
|
105
96
|
h2 = other.to_hash
|
@@ -119,7 +110,7 @@ module HTTP
|
|
119
110
|
def to_hash
|
120
111
|
hash_pairs = self.class.
|
121
112
|
defined_options.
|
122
|
-
flat_map { |opt_name| [opt_name,
|
113
|
+
flat_map { |opt_name| [opt_name, send(opt_name)] }
|
123
114
|
Hash[*hash_pairs]
|
124
115
|
end
|
125
116
|
|
data/lib/http/redirector.rb
CHANGED
data/lib/http/request.rb
CHANGED
@@ -126,9 +126,6 @@ module HTTP
|
|
126
126
|
"#{verb.to_s.upcase} #{request_uri.omit :fragment} HTTP/#{version}"
|
127
127
|
end
|
128
128
|
|
129
|
-
# @deprecated Will be removed in 1.0.0
|
130
|
-
alias_method :request_header, :headline
|
131
|
-
|
132
129
|
# Compute HTTP request header SSL proxy connection
|
133
130
|
def proxy_connect_header
|
134
131
|
"CONNECT #{host}:#{port} HTTP/#{version}"
|
data/lib/http/response.rb
CHANGED
@@ -14,13 +14,6 @@ module HTTP
|
|
14
14
|
|
15
15
|
include HTTP::Headers::Mixin
|
16
16
|
|
17
|
-
# @deprecated Will be removed in 1.0.0
|
18
|
-
# Use Status::REASONS
|
19
|
-
STATUS_CODES = Status::REASONS
|
20
|
-
|
21
|
-
# @deprecated Will be removed in 1.0.0
|
22
|
-
SYMBOL_TO_STATUS_CODE = Hash[STATUS_CODES.map { |k, v| [v.downcase.gsub(/\s|-/, "_").to_sym, k] }].freeze
|
23
|
-
|
24
17
|
# @return [Status]
|
25
18
|
attr_reader :status
|
26
19
|
|
@@ -46,9 +39,6 @@ module HTTP
|
|
46
39
|
# @return (see HTTP::Response::Status#code)
|
47
40
|
def_delegator :status, :code
|
48
41
|
|
49
|
-
# @deprecated Will be removed in 1.0.0
|
50
|
-
alias_method :status_code, :code
|
51
|
-
|
52
42
|
# @!method to_s
|
53
43
|
# (see HTTP::Response::Body#to_s)
|
54
44
|
def_delegator :body, :to_s
|
data/lib/http/response/parser.rb
CHANGED
data/lib/http/response/status.rb
CHANGED
data/lib/http/version.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
RSpec.describe HTTP::Options do
|
2
2
|
subject { described_class.new(:response => :body) }
|
3
3
|
|
4
|
-
it "
|
5
|
-
expect(subject
|
6
|
-
expect(subject[:nosuchone]).to be nil
|
4
|
+
it "has reader methods for attributes" do
|
5
|
+
expect(subject.response).to eq(:body)
|
7
6
|
end
|
8
7
|
|
9
8
|
it "coerces to a Hash" do
|
@@ -34,8 +34,8 @@ RSpec.describe HTTP::Response::Status do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
describe "#
|
38
|
-
subject { described_class.new(code).
|
37
|
+
describe "#to_sym" do
|
38
|
+
subject { described_class.new(code).to_sym }
|
39
39
|
|
40
40
|
context "with unknown code" do
|
41
41
|
let(:code) { 1024 }
|
data/spec/lib/http_spec.rb
CHANGED
@@ -201,12 +201,12 @@ RSpec.describe HTTP do
|
|
201
201
|
describe ".auth" do
|
202
202
|
it "sets Authorization header to the given value" do
|
203
203
|
client = HTTP.auth "abc"
|
204
|
-
expect(client.
|
204
|
+
expect(client.default_options.headers[:authorization]).to eq "abc"
|
205
205
|
end
|
206
206
|
|
207
207
|
it "accepts any #to_s object" do
|
208
208
|
client = HTTP.auth double :to_s => "abc"
|
209
|
-
expect(client.
|
209
|
+
expect(client.default_options.headers[:authorization]).to eq "abc"
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
@@ -225,7 +225,7 @@ RSpec.describe HTTP do
|
|
225
225
|
|
226
226
|
it "sets Authorization header with proper BasicAuth value" do
|
227
227
|
client = HTTP.basic_auth :user => "foo", :pass => "bar"
|
228
|
-
expect(client.
|
228
|
+
expect(client.default_options.headers[:authorization]).
|
229
229
|
to match(%r{^Basic [A-Za-z0-9+/]+=*$})
|
230
230
|
end
|
231
231
|
end
|
@@ -93,6 +93,9 @@ RSpec.shared_context "HTTP handling" do
|
|
93
93
|
let(:read_timeout) { 2.5 }
|
94
94
|
|
95
95
|
it "does not timeout" do
|
96
|
+
# TODO: investigate sporadic JRuby timeouts on CI
|
97
|
+
skip if defined?(JRUBY_VERSION)
|
98
|
+
|
96
99
|
client.get("#{server.endpoint}/sleep").body.to_s
|
97
100
|
client.get("#{server.endpoint}/sleep").body.to_s
|
98
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2015-12-05 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: http_parser.rb
|
@@ -179,12 +179,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
179
|
version: '0'
|
180
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
181
|
requirements:
|
182
|
-
- - "
|
182
|
+
- - ">"
|
183
183
|
- !ruby/object:Gem::Version
|
184
|
-
version:
|
184
|
+
version: 1.3.1
|
185
185
|
requirements: []
|
186
186
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.
|
187
|
+
rubygems_version: 2.4.8
|
188
188
|
signing_key:
|
189
189
|
specification_version: 4
|
190
190
|
summary: HTTP should be easy
|