http 0.9.9 → 1.0.0.pre1
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.
- 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
|
[](http://travis-ci.org/httprb/http)
|
5
5
|
[](https://codeclimate.com/github/httprb/http)
|
6
6
|
[](https://coveralls.io/r/httprb/http)
|
7
|
-
|
7
|
+
[](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
|