http 0.8.0.pre → 0.8.0.pre2
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/CHANGES.md +3 -2
- data/lib/http/client.rb +7 -5
- data/lib/http/connection.rb +3 -5
- data/lib/http/response/body.rb +0 -12
- data/lib/http/version.rb +1 -1
- data/spec/support/connection_reuse_shared.rb +2 -21
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45b099ff52ab956294dec51a54255554865482cd
|
4
|
+
data.tar.gz: 3bb79e8bc7633787cbb7b8444d0a750d9709663e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3422f58b0d5d584c9ba8f88f20d24852a4b7aedd4e0f1e640b76e3b70a31c0c404036790ae3cc09991c34644dda22e031d5e5394c393d245b545d7c80c80219
|
7
|
+
data.tar.gz: 29e37aff0f285a68671ee35498a955c9b00abba6d39ed43877213db84598ac7c802662e1b2d5c6d98bfd9fa2772c2b34732b797511129d95fba96a55a421beb3
|
data/CHANGES.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
## 0.8.0.
|
1
|
+
## 0.8.0.pre2 (2015-03-27)
|
2
2
|
|
3
|
-
* Support for persistent HTTP connections
|
3
|
+
* Support for persistent HTTP connections (@zanker)
|
4
|
+
* Add caching support. See #77 and #177. (@Asmod4n, @pezra)
|
4
5
|
* Improve servers used in specs boot up. Issue was initially raised up
|
5
6
|
by @olegkovalenko. See #176.
|
6
7
|
* Reflect FormData rename changes (FormData -> HTTP::FormData). (@ixti)
|
data/lib/http/client.rb
CHANGED
@@ -75,14 +75,16 @@ module HTTP
|
|
75
75
|
# On any exception we reset the conn. This is a safety measure, to ensure
|
76
76
|
# we don't have conns in a bad state resulting in mixed requests/responses
|
77
77
|
rescue
|
78
|
-
if default_options.persistent?
|
79
|
-
@connection.close
|
80
|
-
@connection = nil
|
81
|
-
end
|
78
|
+
close if default_options.persistent?
|
82
79
|
|
83
80
|
raise
|
84
81
|
end
|
85
82
|
|
83
|
+
def close
|
84
|
+
@connection.close if @connection
|
85
|
+
@connection = nil
|
86
|
+
end
|
87
|
+
|
86
88
|
private
|
87
89
|
|
88
90
|
# Verify our request isn't going to be made against another URI
|
@@ -93,7 +95,7 @@ module HTTP
|
|
93
95
|
# We re-create the connection object because we want to let prior requests
|
94
96
|
# lazily load the body as long as possible, and this mimics prior functionality.
|
95
97
|
elsif !default_options.persistent? || (@connection && !@connection.keep_alive?)
|
96
|
-
|
98
|
+
close
|
97
99
|
end
|
98
100
|
end
|
99
101
|
|
data/lib/http/connection.rb
CHANGED
@@ -4,7 +4,7 @@ module HTTP
|
|
4
4
|
# A connection to the HTTP server
|
5
5
|
class Connection
|
6
6
|
attr_reader :socket, :parser, :persistent,
|
7
|
-
:pending_request, :pending_response
|
7
|
+
:pending_request, :pending_response
|
8
8
|
|
9
9
|
# Attempt to read this much data
|
10
10
|
BUFFER_SIZE = 16_384
|
@@ -13,7 +13,6 @@ module HTTP
|
|
13
13
|
@persistent = options.persistent?
|
14
14
|
|
15
15
|
@parser = Response::Parser.new
|
16
|
-
@sequence_id = 0
|
17
16
|
|
18
17
|
@socket = options[:socket_class].open(req.socket_host, req.socket_port)
|
19
18
|
|
@@ -22,14 +21,13 @@ module HTTP
|
|
22
21
|
|
23
22
|
# Send a request to the server
|
24
23
|
def send_request(req)
|
25
|
-
if
|
26
|
-
fail StateError, "Tried to send a request while one is pending already.
|
24
|
+
if pending_response
|
25
|
+
fail StateError, "Tried to send a request while one is pending already. Make sure you read off the body."
|
27
26
|
elsif pending_request
|
28
27
|
fail StateError, "Tried to send a request while a response is pending. Make sure you've fully read the body from the request."
|
29
28
|
end
|
30
29
|
|
31
30
|
@pending_request = true
|
32
|
-
@sequence_id += 1
|
33
31
|
|
34
32
|
req.stream socket
|
35
33
|
|
data/lib/http/response/body.rb
CHANGED
@@ -13,13 +13,10 @@ module HTTP
|
|
13
13
|
@client = client
|
14
14
|
@streaming = nil
|
15
15
|
@contents = nil
|
16
|
-
@active_seq = client.sequence_id
|
17
16
|
end
|
18
17
|
|
19
18
|
# (see HTTP::Client#readpartial)
|
20
19
|
def readpartial(*args)
|
21
|
-
check_sequence!
|
22
|
-
|
23
20
|
stream!
|
24
21
|
@client.readpartial(*args)
|
25
22
|
end
|
@@ -36,7 +33,6 @@ module HTTP
|
|
36
33
|
return @contents if @contents
|
37
34
|
|
38
35
|
fail StateError, "body is being streamed" unless @streaming.nil?
|
39
|
-
check_sequence!
|
40
36
|
|
41
37
|
begin
|
42
38
|
@streaming = false
|
@@ -53,14 +49,6 @@ module HTTP
|
|
53
49
|
end
|
54
50
|
alias_method :to_str, :to_s
|
55
51
|
|
56
|
-
def check_sequence!
|
57
|
-
return unless @active_seq != @client.sequence_id
|
58
|
-
|
59
|
-
fail StateError, "Sequence ID #{@active_seq} does not match #{@client.sequence_id}. You must read the entire request off."
|
60
|
-
end
|
61
|
-
|
62
|
-
private :check_sequence!
|
63
|
-
|
64
52
|
# Assert that the body is actively being streamed
|
65
53
|
def stream!
|
66
54
|
fail StateError, "body has already been consumed" if @streaming == false
|
data/lib/http/version.rb
CHANGED
@@ -23,14 +23,8 @@ RSpec.shared_context "handles shared connections" do
|
|
23
23
|
|
24
24
|
context "when trying to read a stale body" do
|
25
25
|
it "errors" do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# This should work, because it's the last request we made
|
30
|
-
expect(second_res.body.to_s).to eq("<!doctype html>")
|
31
|
-
|
32
|
-
# This should not work because we've not read anything
|
33
|
-
expect { first_res.body.to_s }.to raise_error(HTTP::StateError, /Sequence ID 1 does not match 2/i)
|
26
|
+
client.get("#{server.endpoint}/not-found")
|
27
|
+
expect { client.get(server.endpoint) }.to raise_error(HTTP::StateError, /Tried to send a request/)
|
34
28
|
end
|
35
29
|
end
|
36
30
|
|
@@ -46,19 +40,6 @@ RSpec.shared_context "handles shared connections" do
|
|
46
40
|
end
|
47
41
|
end
|
48
42
|
|
49
|
-
context "when streaming" do
|
50
|
-
it "errors with a stale response" do
|
51
|
-
first_res = client.get(server.endpoint)
|
52
|
-
second_res = client.get(server.endpoint)
|
53
|
-
|
54
|
-
# This should work, because it's the last request we made
|
55
|
-
expect(second_res.body.to_s).to eq("<!doctype html>")
|
56
|
-
|
57
|
-
# This should not work because we've not read anything
|
58
|
-
expect { first_res.body.each(&:to_s) }.to raise_error(HTTP::StateError, /Sequence ID 1 does not match 2/i)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
43
|
context "with a socket issue" do
|
63
44
|
it "transparently reopens" do
|
64
45
|
first_socket = client.get("#{server.endpoint}/socket").body.to_s
|
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.8.0.
|
4
|
+
version: 0.8.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-03-
|
13
|
+
date: 2015-03-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: http_parser.rb
|
@@ -161,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
161
|
version: 1.3.1
|
162
162
|
requirements: []
|
163
163
|
rubyforge_project:
|
164
|
-
rubygems_version: 2.4.
|
164
|
+
rubygems_version: 2.4.5
|
165
165
|
signing_key:
|
166
166
|
specification_version: 4
|
167
167
|
summary: HTTP should be easy
|