http 0.8.0.pre2 → 0.8.0.pre3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45b099ff52ab956294dec51a54255554865482cd
4
- data.tar.gz: 3bb79e8bc7633787cbb7b8444d0a750d9709663e
3
+ metadata.gz: 5758483fce79ce2698462f1ffedc148d01d75c25
4
+ data.tar.gz: ac44a7864edf119f4287c9304537982887cdcdcd
5
5
  SHA512:
6
- metadata.gz: b3422f58b0d5d584c9ba8f88f20d24852a4b7aedd4e0f1e640b76e3b70a31c0c404036790ae3cc09991c34644dda22e031d5e5394c393d245b545d7c80c80219
7
- data.tar.gz: 29e37aff0f285a68671ee35498a955c9b00abba6d39ed43877213db84598ac7c802662e1b2d5c6d98bfd9fa2772c2b34732b797511129d95fba96a55a421beb3
6
+ metadata.gz: 17cf0d470610ce06db0ff695674ae80a59b1fb1b3a6403f1851aaf15284ecdba86e1584bc99ae9bcdb3fe431909111fe02e45f586afdaed0866a7a867cf481f3
7
+ data.tar.gz: 76101412bb754229a66b1612c3ccb656265abde996c643a1b7021f47ba05760ac85d98ff20f3c1f517a99da7f445101928e3fe168c8cce8b64a7d76ef418cdea
data/CHANGES.md CHANGED
@@ -1,4 +1,4 @@
1
- ## 0.8.0.pre2 (2015-03-27)
1
+ ## 0.8.0.pre3 (2015-03-27)
2
2
 
3
3
  * Support for persistent HTTP connections (@zanker)
4
4
  * Add caching support. See #77 and #177. (@Asmod4n, @pezra)
data/lib/http/client.rb CHANGED
@@ -94,7 +94,7 @@ module HTTP
94
94
 
95
95
  # We re-create the connection object because we want to let prior requests
96
96
  # lazily load the body as long as possible, and this mimics prior functionality.
97
- elsif !default_options.persistent? || (@connection && !@connection.keep_alive?)
97
+ elsif @connection && (!@connection.keep_alive? || @connection.expired?)
98
98
  close
99
99
  end
100
100
  end
@@ -3,7 +3,7 @@ require "http/response/parser"
3
3
  module HTTP
4
4
  # A connection to the HTTP server
5
5
  class Connection
6
- attr_reader :socket, :parser, :persistent,
6
+ attr_reader :socket, :parser, :persistent, :keep_alive_timeout,
7
7
  :pending_request, :pending_response
8
8
 
9
9
  # Attempt to read this much data
@@ -12,11 +12,15 @@ module HTTP
12
12
  def initialize(req, options)
13
13
  @persistent = options.persistent?
14
14
 
15
+ @keep_alive_timeout = options[:keep_alive_timeout]
16
+
15
17
  @parser = Response::Parser.new
16
18
 
17
19
  @socket = options[:socket_class].open(req.socket_host, req.socket_port)
18
20
 
19
21
  start_tls(req.uri.host, options[:ssl_socket_class], options[:ssl_context]) if req.uri.is_a?(URI::HTTPS) && !req.using_proxy?
22
+
23
+ reset_timer
20
24
  end
21
25
 
22
26
  # Send a request to the server
@@ -71,6 +75,7 @@ module HTTP
71
75
  close unless keep_alive?
72
76
 
73
77
  parser.reset
78
+ reset_timer
74
79
 
75
80
  @pending_response = nil
76
81
  end
@@ -88,6 +93,17 @@ module HTTP
88
93
  !!@keep_alive && !socket.closed?
89
94
  end
90
95
 
96
+ # Whether our connection has expired
97
+ def expired?
98
+ !@conn_expires_at || @conn_expires_at < Time.now
99
+ end
100
+
101
+ def reset_timer
102
+ @conn_expires_at = Time.now + keep_alive_timeout if persistent
103
+ end
104
+
105
+ private :reset_timer
106
+
91
107
  # Store whether the connection should be kept alive.
92
108
  # Once we reset the parser, we lose all of this state.
93
109
  def set_keep_alive
data/lib/http/options.rb CHANGED
@@ -44,6 +44,7 @@ module HTTP
44
44
  :socket_class => self.class.default_socket_class,
45
45
  :ssl_socket_class => self.class.default_ssl_socket_class,
46
46
  :cache => self.class.default_cache,
47
+ :keep_alive_timeout => 5,
47
48
  :headers => {}}
48
49
 
49
50
  opts_w_defaults = defaults.merge(options)
@@ -58,7 +59,11 @@ module HTTP
58
59
  self.headers.merge(headers)
59
60
  end
60
61
 
61
- %w(proxy params form json body follow response socket_class ssl_socket_class ssl_context persistent).each do |method_name|
62
+ %w(
63
+ proxy params form json body follow response
64
+ socket_class ssl_socket_class ssl_context
65
+ persistent keep_alive_timeout
66
+ ).each do |method_name|
62
67
  def_option method_name
63
68
  end
64
69
 
data/lib/http/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module HTTP
2
- VERSION = "0.8.0.pre2"
2
+ VERSION = "0.8.0.pre3"
3
3
  end
@@ -169,16 +169,25 @@ RSpec.describe HTTP::Client do
169
169
 
170
170
  include_context "handles shared connections" do
171
171
  let(:reuse_conn) { nil }
172
+ let(:keep_alive_timeout) { 5 }
173
+
172
174
  let(:server) { dummy }
173
- let(:client) { described_class.new(:persistent => reuse_conn) }
175
+ let(:client) do
176
+ described_class.new(
177
+ :persistent => reuse_conn,
178
+ :keep_alive_timeout => keep_alive_timeout
179
+ )
180
+ end
174
181
  end
175
182
 
176
183
  describe "SSL" do
177
184
  let(:reuse_conn) { nil }
185
+ let(:keep_alive_timeout) { 5 }
178
186
 
179
187
  let(:client) do
180
188
  described_class.new(
181
189
  :persistent => reuse_conn,
190
+ :keep_alive_timeout => keep_alive_timeout,
182
191
  :ssl_context => OpenSSL::SSL::SSLContext.new.tap do |context|
183
192
  context.options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options]
184
193
 
@@ -32,6 +32,7 @@ RSpec.describe HTTP::Options, "merge" do
32
32
  :form => {:bar => "bar"},
33
33
  :body => "body-bar",
34
34
  :json => {:bar => "bar"},
35
+ :keep_alive_timeout => 10,
35
36
  :headers => {:accept => "xml", :bar => "bar"},
36
37
  :proxy => {:proxy_address => "127.0.0.1", :proxy_port => 8080})
37
38
 
@@ -42,6 +43,7 @@ RSpec.describe HTTP::Options, "merge" do
42
43
  :body => "body-bar",
43
44
  :json => {:bar => "bar"},
44
45
  :persistent => "https://www.googe.com",
46
+ :keep_alive_timeout => 10,
45
47
  :headers => {"Foo" => "foo", "Accept" => "xml", "Bar" => "bar"},
46
48
  :proxy => {:proxy_address => "127.0.0.1", :proxy_port => 8080},
47
49
  :follow => nil,
@@ -62,6 +62,18 @@ RSpec.shared_context "handles shared connections" do
62
62
  end
63
63
  end
64
64
 
65
+ context "with a Keep-Alive timeout of 0" do
66
+ let(:keep_alive_timeout) { 0 }
67
+
68
+ it "automatically opens a new socket" do
69
+ first_socket = client.get("#{server.endpoint}/socket/1").body.to_s
70
+ sleep 0.1
71
+ second_socket = client.get("#{server.endpoint}/socket/2").body.to_s
72
+
73
+ expect(first_socket).to_not eq(second_socket)
74
+ end
75
+ end
76
+
65
77
  context "with a change in host" do
66
78
  it "errors" do
67
79
  expect { client.get("https://invalid.com/socket") }.to raise_error(/Persistence is enabled/i)
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.pre2
4
+ version: 0.8.0.pre3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri