http 1.0.1 → 1.0.2
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 +0 -1
- data/CHANGES.md +13 -4
- data/LICENSE.txt +1 -1
- data/README.md +51 -11
- data/lib/http/redirector.rb +2 -0
- data/lib/http/request/writer.rb +5 -2
- data/lib/http/version.rb +1 -1
- metadata +3 -5
- data/spec/support/connection_reuse_shared.rb +0 -95
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fa5394fed30d8eebd829ba4c79f6ac28b47fc16
|
4
|
+
data.tar.gz: d3654335bb11728650548423d57cb402eb3d5080
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 429071438fa4126402282e1d1258180626f3c181192fbc9a03517920af1284d76574d3802863fdd6ac57d42bf1ad79606932c06faee21856c89572861a98b4a9
|
7
|
+
data.tar.gz: b8db2ca9014d5fc387736f0c5efaba5287fc506ef8ab0ff2433bfe9dc996254e2d7c2fabf078df449962ddefd378a2d1a4a0ae7c1eab7bccfe7e31bac8810186
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,9 +1,17 @@
|
|
1
|
+
## 1.0.2 (2016-01-15)
|
2
|
+
|
3
|
+
* [#295](https://github.com/httprb/http/pull/295):
|
4
|
+
Fix redirect following when used with persistent mode.
|
5
|
+
([@ixti])
|
6
|
+
|
7
|
+
|
1
8
|
## 1.0.1 (2015-12-27)
|
2
9
|
|
3
10
|
* [#283](https://github.com/httprb/http/pull/283):
|
4
11
|
Use io/wait on supported platforms.
|
5
12
|
([@tarcieri])
|
6
13
|
|
14
|
+
|
7
15
|
## 1.0.0 (2015-12-25)
|
8
16
|
|
9
17
|
* [#265](https://github.com/httprb/http/pull/265/):
|
@@ -20,11 +28,11 @@
|
|
20
28
|
- HTTP::Response#status_code (use #status or #code)
|
21
29
|
- HTTP::Response::Status#symbolize (use #to_sym)
|
22
30
|
|
23
|
-
* [#269](https://github.com/httprb/http/pull/
|
31
|
+
* [#269](https://github.com/httprb/http/pull/269/):
|
24
32
|
Close connection in case of error during request.
|
25
33
|
([@ixti])
|
26
34
|
|
27
|
-
* [#271](https://github.com/httprb/http/pull/
|
35
|
+
* [#271](https://github.com/httprb/http/pull/271/):
|
28
36
|
High-level exception wrappers for low-level I/O errors.
|
29
37
|
([@ixti])
|
30
38
|
|
@@ -32,7 +40,7 @@
|
|
32
40
|
Add encoding option.
|
33
41
|
([@connorhd])
|
34
42
|
|
35
|
-
* [#275](https://github.com/httprb/http/pull/
|
43
|
+
* [#275](https://github.com/httprb/http/pull/275/):
|
36
44
|
Support for disabling Nagle's algorithm with `HTTP.nodelay`.
|
37
45
|
([@nerdrew])
|
38
46
|
|
@@ -53,9 +61,10 @@
|
|
53
61
|
Remove legacy 'Http' constant alias to 'HTTP'.
|
54
62
|
([@tarcieri])
|
55
63
|
|
64
|
+
|
56
65
|
## 0.9.8 (2015-09-29)
|
57
66
|
|
58
|
-
* [#260](https://github.com/httprb/http/pull/
|
67
|
+
* [#260](https://github.com/httprb/http/pull/260):
|
59
68
|
Fixed global timeout persisting time left across requests when reusing connections.
|
60
69
|
([@zanker])
|
61
70
|
|
data/LICENSE.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2011-
|
1
|
+
Copyright (c) 2011-2016 Tony Arcieri, Erik Michaels-Ober, Alexey V. Zapparov, Zachary Anker
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# 
|
2
2
|
|
3
|
-
[](
|
4
|
-
[](
|
3
|
+
[](https://rubygems.org/gems/http)
|
4
|
+
[](https://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)
|
@@ -73,7 +73,7 @@ You can join by email by sending a message to:
|
|
73
73
|
|
74
74
|
If you believe you've found a bug, please report it at:
|
75
75
|
|
76
|
-
https://github.com/httprb/http
|
76
|
+
https://github.com/httprb/http/issues
|
77
77
|
|
78
78
|
|
79
79
|
## Installation
|
@@ -268,19 +268,59 @@ HTTP.accept(:json).get("https://github.com/httprb/http/commit/HEAD")
|
|
268
268
|
This adds the appropriate Accept header for retrieving a JSON response for the
|
269
269
|
given resource.
|
270
270
|
|
271
|
+
|
271
272
|
### Reuse HTTP connection: HTTP Keep-Alive
|
272
273
|
|
273
|
-
If you
|
274
|
-
|
274
|
+
If you need to make many successive requests against the same host,
|
275
|
+
you can create client with persistent connection to the host:
|
275
276
|
|
276
|
-
```ruby
|
277
|
-
|
278
|
-
|
279
|
-
HTTP.persistent
|
280
|
-
|
277
|
+
``` ruby
|
278
|
+
begin
|
279
|
+
# create HTTP client with persistent connection to api.icndb.com:
|
280
|
+
http = HTTP.persistent "http://api.icndb.com"
|
281
|
+
|
282
|
+
# issue multiple requests using same connection:
|
283
|
+
jokes = 100.times.map { http.get("/jokes/random").to_s }
|
284
|
+
ensure
|
285
|
+
# close underlying connection when you don't need it anymore
|
286
|
+
http.close if http
|
287
|
+
end
|
288
|
+
|
289
|
+
```
|
290
|
+
|
291
|
+
If the optional code block is given, it will be passed the client with
|
292
|
+
persistent connection to the host as an argument and `client.close` will be
|
293
|
+
automatically called when the block terminates.
|
294
|
+
The value of the block will be returned:
|
295
|
+
|
296
|
+
``` ruby
|
297
|
+
jokes = HTTP.persistent "http://api.icndb.com" do |http|
|
298
|
+
100.times.map { http.get("/jokes/random").to_s }
|
281
299
|
end
|
282
300
|
```
|
283
301
|
|
302
|
+
##### NOTICE
|
303
|
+
|
304
|
+
You must consume response before sending next request via persistent connection.
|
305
|
+
That means you need to call `#to_s`, `#parse` or `#flush` on response object.
|
306
|
+
In the example above we used `http.get("/jokes/random").to_s` to get response
|
307
|
+
bodies. That works perfectly fine, because `#to_s` reads off the response.
|
308
|
+
|
309
|
+
Sometimes you don't need response body, or need whole response object to
|
310
|
+
access it's status, headers etc instead. You can either call `#to_s` to
|
311
|
+
make sure response was flushed and then use response object itself, or use
|
312
|
+
`#flush` (syntax sugar for `#tap(&:to_s)` that will do that for you:
|
313
|
+
|
314
|
+
|
315
|
+
``` ruby
|
316
|
+
contents = HTTP.persistent "http://en.wikipedia.org" do |http|
|
317
|
+
%w(Hypertext_Transfer_Protocol Git GitHub Linux Hurd).map do
|
318
|
+
http.get("/wiki/#{target}").flush
|
319
|
+
end
|
320
|
+
end
|
321
|
+
```
|
322
|
+
|
323
|
+
|
284
324
|
### Timeouts
|
285
325
|
|
286
326
|
By default, HTTP does not timeout on a request. You can enable per operation
|
@@ -352,5 +392,5 @@ dropped.
|
|
352
392
|
|
353
393
|
## Copyright
|
354
394
|
|
355
|
-
Copyright (c) 2011-
|
395
|
+
Copyright (c) 2011-2016 Tony Arcieri, Erik Michaels-Ober, Alexey V. Zapparov, Zachary Anker.
|
356
396
|
See LICENSE.txt for further details.
|
data/lib/http/redirector.rb
CHANGED
data/lib/http/request/writer.rb
CHANGED
@@ -68,6 +68,10 @@ module HTTP
|
|
68
68
|
def send_request
|
69
69
|
headers = join_headers
|
70
70
|
|
71
|
+
# It's important to send the request in a single write call when
|
72
|
+
# possible in order to play nicely with Nagle's algorithm. Making
|
73
|
+
# two writes in a row triggers a pathological case where Nagle is
|
74
|
+
# expecting a third write that never happens.
|
71
75
|
case @body
|
72
76
|
when NilClass
|
73
77
|
write(headers)
|
@@ -77,8 +81,7 @@ module HTTP
|
|
77
81
|
write(headers)
|
78
82
|
|
79
83
|
@body.each do |chunk|
|
80
|
-
write(chunk.bytesize.to_s(16) << CRLF)
|
81
|
-
write(chunk << CRLF)
|
84
|
+
write(chunk.bytesize.to_s(16) << CRLF << chunk << CRLF)
|
82
85
|
end
|
83
86
|
|
84
87
|
write(CHUNKED_END)
|
data/lib/http/version.rb
CHANGED
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: 1.0.
|
4
|
+
version: 1.0.2
|
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: 2016-01-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: http_parser.rb
|
@@ -155,7 +155,6 @@ files:
|
|
155
155
|
- spec/spec_helper.rb
|
156
156
|
- spec/support/black_hole.rb
|
157
157
|
- spec/support/capture_warning.rb
|
158
|
-
- spec/support/connection_reuse_shared.rb
|
159
158
|
- spec/support/dummy_server.rb
|
160
159
|
- spec/support/dummy_server/servlet.rb
|
161
160
|
- spec/support/http_handling_shared.rb
|
@@ -183,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
182
|
version: '0'
|
184
183
|
requirements: []
|
185
184
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
185
|
+
rubygems_version: 2.2.5
|
187
186
|
signing_key:
|
188
187
|
specification_version: 4
|
189
188
|
summary: HTTP should be easy
|
@@ -211,7 +210,6 @@ test_files:
|
|
211
210
|
- spec/spec_helper.rb
|
212
211
|
- spec/support/black_hole.rb
|
213
212
|
- spec/support/capture_warning.rb
|
214
|
-
- spec/support/connection_reuse_shared.rb
|
215
213
|
- spec/support/dummy_server.rb
|
216
214
|
- spec/support/dummy_server/servlet.rb
|
217
215
|
- spec/support/http_handling_shared.rb
|
@@ -1,95 +0,0 @@
|
|
1
|
-
RSpec.shared_context "handles shared connections" do
|
2
|
-
describe "connection reuse" do
|
3
|
-
let(:sockets_used) do
|
4
|
-
[
|
5
|
-
client.get("#{server.endpoint}/socket/1").body.to_s,
|
6
|
-
client.get("#{server.endpoint}/socket/2").body.to_s
|
7
|
-
]
|
8
|
-
end
|
9
|
-
|
10
|
-
context "when enabled" do
|
11
|
-
let(:reuse_conn) { server.endpoint }
|
12
|
-
|
13
|
-
context "without a host" do
|
14
|
-
it "infers host from persistent config" do
|
15
|
-
expect(client.get("/").body.to_s).to eq("<!doctype html>")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
it "re-uses the socket" do
|
20
|
-
expect(sockets_used).to_not include("")
|
21
|
-
expect(sockets_used.uniq.length).to eq(1)
|
22
|
-
end
|
23
|
-
|
24
|
-
context "when trying to read a stale body" do
|
25
|
-
it "errors" do
|
26
|
-
client.get("#{server.endpoint}/not-found")
|
27
|
-
expect { client.get(server.endpoint) }.to raise_error(HTTP::StateError, /Tried to send a request/)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when reading a cached body" do
|
32
|
-
it "succeeds" do
|
33
|
-
first_res = client.get(server.endpoint)
|
34
|
-
first_res.body.to_s
|
35
|
-
|
36
|
-
second_res = client.get(server.endpoint)
|
37
|
-
|
38
|
-
expect(first_res.body.to_s).to eq("<!doctype html>")
|
39
|
-
expect(second_res.body.to_s).to eq("<!doctype html>")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "with a socket issue" do
|
44
|
-
it "transparently reopens" do
|
45
|
-
skip "flaky environment" if flaky_env?
|
46
|
-
|
47
|
-
first_socket = client.get("#{server.endpoint}/socket").body.to_s
|
48
|
-
expect(first_socket).to_not eq("")
|
49
|
-
|
50
|
-
# Kill off the sockets we used
|
51
|
-
# rubocop:disable Style/RescueModifier
|
52
|
-
DummyServer::Servlet.sockets.each do |socket|
|
53
|
-
socket.close rescue nil
|
54
|
-
end
|
55
|
-
DummyServer::Servlet.sockets.clear
|
56
|
-
# rubocop:enable Style/RescueModifier
|
57
|
-
|
58
|
-
# Should error because we tried to use a bad socket
|
59
|
-
expect { client.get("#{server.endpoint}/socket").body.to_s }.to raise_error HTTP::ConnectionError
|
60
|
-
|
61
|
-
# Should succeed since we create a new socket
|
62
|
-
second_socket = client.get("#{server.endpoint}/socket").body.to_s
|
63
|
-
expect(second_socket).to_not eq(first_socket)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context "with a Keep-Alive timeout of 0" do
|
68
|
-
let(:keep_alive_timeout) { 0 }
|
69
|
-
|
70
|
-
it "automatically opens a new socket" do
|
71
|
-
first_socket = client.get("#{server.endpoint}/socket/1").body.to_s
|
72
|
-
sleep 0.1
|
73
|
-
second_socket = client.get("#{server.endpoint}/socket/2").body.to_s
|
74
|
-
|
75
|
-
expect(first_socket).to_not eq(second_socket)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "with a change in host" do
|
80
|
-
it "errors" do
|
81
|
-
expect { client.get("https://invalid.com/socket") }.to raise_error(/Persistence is enabled/i)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "when disabled" do
|
87
|
-
let(:reuse_conn) { nil }
|
88
|
-
|
89
|
-
it "opens new sockets" do
|
90
|
-
expect(sockets_used).to_not include("")
|
91
|
-
expect(sockets_used.uniq.length).to eq(2)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|