http 0.8.11 → 0.8.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ccf72f7e0ec682293d3f7b779753ac63ec02df76
4
- data.tar.gz: bb91b282c3603b0e5d3f5f068149ea331483aab0
3
+ metadata.gz: 2bb012bd8ce0fdf45a88171c20552f819279e316
4
+ data.tar.gz: 094be455227c7e42aba8157819b9336b9744b9d1
5
5
  SHA512:
6
- metadata.gz: 62b0ed844e8152f5b6fa3d46897993a22a3fdff4661e80761a7482efaae4ad7a8d7d1739e6b823fe1c20c2de1dfe7579399860ea616b9ad463382fa89f54d901
7
- data.tar.gz: 0c6bb166ab12fce3ffa7a871e9c26e19701609db68409617af217f59d4d3b13e61e4bace493bd21a2486608e08911cdbfc87a4d23bd6fb083ef1a5502a88e733
6
+ metadata.gz: 60ce4064cdafe70513e1749ace44afed30c9c08251d3d9ec0d0c1f205d243704403ca8643e96d7792fb23085e4ae755ab04db073c084142f7652f0ef5a594bdf
7
+ data.tar.gz: a7c7acda4cb5c67cb84ee300d42f5871a413066a78c44188fb8d51de96047124ba4b25ece259b0785c7a806f16e0d7bdc911572d7d6ab292cfd52b1afb4d612c
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.8.12 (2015-05-26)
2
+
3
+ * Fix `HTTP.timeout` API (was loosing previously defined options). (@ixti)
4
+
5
+
1
6
  ## 0.8.11 (2015-05-22)
2
7
 
3
8
  * SNI support for HTTPS connections. See #229. (@tarcieri)
data/lib/http.rb CHANGED
@@ -20,7 +20,7 @@ module HTTP
20
20
 
21
21
  class << self
22
22
  # HTTP[:accept => 'text/html'].get(...)
23
- alias_method :[], :with_headers
23
+ alias_method :[], :headers
24
24
  end
25
25
  end
26
26
 
data/lib/http/cache.rb CHANGED
@@ -51,8 +51,8 @@ module HTTP
51
51
  handle_response(cached_resp, actual_resp, req)
52
52
  end
53
53
 
54
- # @returns [Response] the most useful of the responses after
55
- # updating the cache as appropriate
54
+ # @return [Response] the most useful of the responses after
55
+ # updating the cache as appropriate
56
56
  def handle_response(cached_resp, actual_resp, req)
57
57
  if actual_resp.status.not_modified? && cached_resp
58
58
  logger.debug { "<#{req.uri}> not modified, using cached version." }
@@ -53,23 +53,23 @@ module HTTP
53
53
 
54
54
  # @return [Boolean] is the vary header set to '*'
55
55
  def vary_star?
56
- get("Vary").any? { |v| "*" == v.strip }
56
+ get(HTTP::Headers::VARY).any? { |v| "*" == v.strip }
57
57
  end
58
58
 
59
59
  private
60
60
 
61
61
  # @return [Boolean] true when cache-control header matches the pattern
62
62
  def matches?(pattern)
63
- get("Cache-Control").any? { |v| v =~ pattern }
63
+ get(HTTP::Headers::CACHE_CONTROL).any? { |v| v =~ pattern }
64
64
  end
65
65
 
66
66
  # @return [Numeric] number of seconds until the time in the
67
67
  # expires header is reached.
68
68
  #
69
69
  # ---
70
- # Some servers send a "Expire: -1" header which must be treated as expired
70
+ # Some servers send a "Expires: -1" header which must be treated as expired
71
71
  def seconds_til_expires
72
- get("Expires").
72
+ get(HTTP::Headers::EXPIRES).
73
73
  map { |e| http_date_to_ttl(e) }.
74
74
  max
75
75
  end
@@ -89,7 +89,7 @@ module HTTP
89
89
 
90
90
  # @return [Numeric] the value of the max-age component of cache control
91
91
  def explicit_max_age
92
- get("Cache-Control").
92
+ get(HTTP::Headers::CACHE_CONTROL).
93
93
  map { |v| (/max-age=(\d+)/i).match(v) }.
94
94
  compact.
95
95
  map { |m| m[1].to_i }.
@@ -1,5 +1,7 @@
1
1
  require "base64"
2
2
 
3
+ require "http/headers"
4
+
3
5
  module HTTP
4
6
  module Chainable
5
7
  # Request a get sans response body
@@ -95,7 +97,10 @@ module HTTP
95
97
  options["#{k}_timeout".to_sym] = options.delete k
96
98
  end
97
99
 
98
- branch :timeout_class => klass, :timeout_options => options
100
+ branch default_options.merge(
101
+ :timeout_class => klass,
102
+ :timeout_options => options
103
+ )
99
104
  end
100
105
 
101
106
  # @overload persistent(host)
@@ -195,7 +200,7 @@ module HTTP
195
200
  # Accept the given MIME type(s)
196
201
  # @param type
197
202
  def accept(type)
198
- with :accept => MimeType.normalize(type)
203
+ headers Headers::ACCEPT => MimeType.normalize(type)
199
204
  end
200
205
 
201
206
  # Make a request with the given Authorization header
@@ -204,7 +209,7 @@ module HTTP
204
209
  # shim for deprecated auth(:basic, opts).
205
210
  # will be removed in 0.8.0
206
211
  return basic_auth(opts) if :basic == value
207
- with :authorization => value.to_s
212
+ headers Headers::AUTHORIZATION => value.to_s
208
213
  end
209
214
 
210
215
  # Make a request with the given Basic authorization header
data/lib/http/client.rb CHANGED
@@ -16,7 +16,6 @@ module HTTP
16
16
  extend Forwardable
17
17
  include Chainable
18
18
 
19
- CONNECTION = "Connection".freeze
20
19
  KEEP_ALIVE = "Keep-Alive".freeze
21
20
  CLOSE = "close".freeze
22
21
 
@@ -36,13 +35,6 @@ module HTTP
36
35
  body = make_request_body(opts, headers)
37
36
  proxy = opts.proxy
38
37
 
39
- # Tell the server to keep the conn open
40
- if default_options.persistent?
41
- headers[CONNECTION] = KEEP_ALIVE
42
- else
43
- headers[CONNECTION] = CLOSE
44
- end
45
-
46
38
  req = HTTP::Request.new(verb, uri, headers, proxy, body)
47
39
  res = perform req, opts
48
40
 
@@ -147,11 +139,22 @@ module HTTP
147
139
 
148
140
  # Creates request headers with cookies (if any) merged in
149
141
  def make_request_headers(opts)
142
+ headers = opts.headers
143
+
144
+ # Tell the server to keep the conn open
145
+ if default_options.persistent?
146
+ headers[Headers::CONNECTION] = KEEP_ALIVE
147
+ else
148
+ headers[Headers::CONNECTION] = CLOSE
149
+ end
150
+
150
151
  cookies = opts.cookies.values
151
- return opts.headers if cookies.empty?
152
+ unless cookies.empty?
153
+ cookies = opts.headers.get(Headers::COOKIE).concat(cookies).join("; ")
154
+ headers[Headers::COOKIE] = cookies
155
+ end
152
156
 
153
- cookies = opts.headers.get(Headers::COOKIE).concat(cookies).join("; ")
154
- opts.headers.merge(Headers::COOKIE => cookies)
157
+ headers
155
158
  end
156
159
 
157
160
  # Create the request body object to send
@@ -161,11 +164,11 @@ module HTTP
161
164
  opts.body
162
165
  when opts.form
163
166
  form = HTTP::FormData.create opts.form
164
- headers["Content-Type"] ||= form.content_type
165
- headers["Content-Length"] ||= form.content_length
167
+ headers[Headers::CONTENT_TYPE] ||= form.content_type
168
+ headers[Headers::CONTENT_LENGTH] ||= form.content_length
166
169
  form.to_s
167
170
  when opts.json
168
- headers["Content-Type"] ||= "application/json"
171
+ headers[Headers::CONTENT_TYPE] ||= "application/json"
169
172
  MimeType[:json].encode opts.json
170
173
  end
171
174
  end
@@ -1,5 +1,7 @@
1
1
  require "forwardable"
2
2
 
3
+ require "http/client"
4
+ require "http/headers"
3
5
  require "http/response/parser"
4
6
 
5
7
  module HTTP
@@ -51,7 +53,7 @@ module HTTP
51
53
 
52
54
  # Send a request to the server
53
55
  #
54
- # @param [Request] Request to send to the server
56
+ # @param [Request] req Request to send to the server
55
57
  # @return [nil]
56
58
  def send_request(req)
57
59
  if @pending_response
@@ -186,9 +188,9 @@ module HTTP
186
188
 
187
189
  case @parser.http_version
188
190
  when HTTP_1_0 # HTTP/1.0 requires opt in for Keep Alive
189
- @keep_alive = @parser.headers[Client::CONNECTION] == HTTP::Client::KEEP_ALIVE
191
+ @keep_alive = @parser.headers[Headers::CONNECTION] == Client::KEEP_ALIVE
190
192
  when HTTP_1_1 # HTTP/1.1 is opt-out
191
- @keep_alive = @parser.headers[Client::CONNECTION] != HTTP::Client::CLOSE
193
+ @keep_alive = @parser.headers[Headers::CONNECTION] != Client::CLOSE
192
194
  else # Anything else we assume doesn't supportit
193
195
  @keep_alive = false
194
196
  end
data/lib/http/headers.rb CHANGED
@@ -2,6 +2,7 @@ require "forwardable"
2
2
 
3
3
  require "http/errors"
4
4
  require "http/headers/mixin"
5
+ require "http/headers/known"
5
6
 
6
7
  module HTTP
7
8
  # HTTP Headers container.
@@ -16,12 +17,6 @@ module HTTP
16
17
  # @see http://tools.ietf.org/html/rfc7230#section-3.2
17
18
  HEADER_NAME_RE = /^[A-Za-z0-9!#\$%&'*+\-.^_`|~]+$/
18
19
 
19
- # Set-Cookie (response) header name
20
- SET_COOKIE = "Set-Cookie".freeze
21
-
22
- # Cookie (request) header name
23
- COOKIE = "Cookie".freeze
24
-
25
20
  # Class constructor.
26
21
  def initialize
27
22
  @pile = []
@@ -0,0 +1,78 @@
1
+ module HTTP
2
+ class Headers
3
+ # Content-Types that are acceptable for the response.
4
+ ACCEPT = "Accept".freeze
5
+
6
+ # The age the object has been in a proxy cache in seconds.
7
+ AGE = "Age".freeze
8
+
9
+ # Authentication credentials for HTTP authentication.
10
+ AUTHORIZATION = "Authorization".freeze
11
+
12
+ # Used to specify directives that must be obeyed by all caching mechanisms
13
+ # along the request-response chain.
14
+ CACHE_CONTROL = "Cache-Control".freeze
15
+
16
+ # An HTTP cookie previously sent by the server with Set-Cookie.
17
+ COOKIE = "Cookie".freeze
18
+
19
+ # Control options for the current connection and list
20
+ # of hop-by-hop request fields.
21
+ CONNECTION = "Connection".freeze
22
+
23
+ # The length of the request body in octets (8-bit bytes).
24
+ CONTENT_LENGTH = "Content-Length".freeze
25
+
26
+ # The MIME type of the body of the request
27
+ # (used with POST and PUT requests).
28
+ CONTENT_TYPE = "Content-Type".freeze
29
+
30
+ # The date and time that the message was sent (in "HTTP-date" format as
31
+ # defined by RFC 7231 Date/Time Formats).
32
+ DATE = "Date".freeze
33
+
34
+ # An identifier for a specific version of a resource,
35
+ # often a message digest.
36
+ ETAG = "ETag".freeze
37
+
38
+ # Gives the date/time after which the response is considered stale (in
39
+ # "HTTP-date" format as defined by RFC 7231).
40
+ EXPIRES = "Expires".freeze
41
+
42
+ # The domain name of the server (for virtual hosting), and the TCP port
43
+ # number on which the server is listening. The port number may be omitted
44
+ # if the port is the standard port for the service requested.
45
+ HOST = "Host".freeze
46
+
47
+ # Allows a 304 Not Modified to be returned if content is unchanged.
48
+ IF_MODIFIED_SINCE = "If-Modified-Since".freeze
49
+
50
+ # Allows a 304 Not Modified to be returned if content is unchanged.
51
+ IF_NONE_MATCH = "If-None-Match".freeze
52
+
53
+ # The last modified date for the requested object (in "HTTP-date" format as
54
+ # defined by RFC 7231).
55
+ LAST_MODIFIED = "Last-Modified".freeze
56
+
57
+ # Used in redirection, or when a new resource has been created.
58
+ LOCATION = "Location".freeze
59
+
60
+ # Authorization credentials for connecting to a proxy.
61
+ PROXY_AUTHORIZATION = "Proxy-Authorization".freeze
62
+
63
+ # An HTTP cookie.
64
+ SET_COOKIE = "Set-Cookie".freeze
65
+
66
+ # The form of encoding used to safely transfer the entity to the user.
67
+ # Currently defined methods are: chunked, compress, deflate, gzip, identity.
68
+ TRANSFER_ENCODING = "Transfer-Encoding".freeze
69
+
70
+ # The user agent string of the user agent.
71
+ USER_AGENT = "User-Agent".freeze
72
+
73
+ # Tells downstream proxies how to match future request headers to decide
74
+ # whether the cached response can be used rather than requesting a fresh
75
+ # one from the origin server.
76
+ VARY = "Vary".freeze
77
+ end
78
+ end
@@ -1,5 +1,7 @@
1
1
  require "set"
2
2
 
3
+ require "http/headers"
4
+
3
5
  module HTTP
4
6
  class Redirector
5
7
  # Notifies that we reached max allowed redirect hops
@@ -35,9 +37,9 @@ module HTTP
35
37
  # @param [Hash] opts
36
38
  # @option opts [Boolean] :strict (true) redirector hops policy
37
39
  # @option opts [#to_i] :max_hops (5) maximum allowed amount of hops
38
- def initialize(options = {})
39
- @strict = options.fetch(:strict, true)
40
- @max_hops = options.fetch(:max_hops, 5).to_i
40
+ def initialize(opts = {})
41
+ @strict = opts.fetch(:strict, true)
42
+ @max_hops = opts.fetch(:max_hops, 5).to_i
41
43
  end
42
44
 
43
45
  # Follows redirects until non-redirect response found
@@ -52,7 +54,7 @@ module HTTP
52
54
  fail TooManyRedirectsError if too_many_hops?
53
55
  fail EndlessRedirectError if endless_loop?
54
56
 
55
- @request = redirect_to @response.headers["Location"]
57
+ @request = redirect_to @response.headers[Headers::LOCATION]
56
58
  @response = yield @request
57
59
  end
58
60
 
data/lib/http/request.rb CHANGED
@@ -79,14 +79,14 @@ module HTTP
79
79
 
80
80
  @headers = HTTP::Headers.coerce(headers || {})
81
81
 
82
- @headers["Host"] ||= default_host_header_value
83
- @headers["User-Agent"] ||= USER_AGENT
82
+ @headers[Headers::HOST] ||= default_host_header_value
83
+ @headers[Headers::USER_AGENT] ||= USER_AGENT
84
84
  end
85
85
 
86
86
  # Returns new Request with updated uri
87
87
  def redirect(uri, verb = @verb)
88
88
  req = self.class.new(verb, @uri.join(uri), headers, proxy, body, version)
89
- req["Host"] = req.uri.host
89
+ req[Headers::HOST] = req.uri.host
90
90
  req
91
91
  end
92
92
 
@@ -108,7 +108,7 @@ module HTTP
108
108
 
109
109
  # Compute and add the Proxy-Authorization header
110
110
  def include_proxy_authorization_header
111
- headers["Proxy-Authorization"] = proxy_authorization_header
111
+ headers[Headers::PROXY_AUTHORIZATION] = proxy_authorization_header
112
112
  end
113
113
 
114
114
  def proxy_authorization_header
@@ -138,10 +138,12 @@ module HTTP
138
138
  # Headers to send with proxy connect request
139
139
  def proxy_connect_headers
140
140
  connect_headers = HTTP::Headers.coerce(
141
- "Host" => headers["Host"],
142
- "User-Agent" => headers["User-Agent"]
141
+ Headers::HOST => headers[Headers::HOST],
142
+ Headers::USER_AGENT => headers[Headers::USER_AGENT]
143
143
  )
144
- connect_headers["Proxy-Authorization"] = proxy_authorization_header if using_authenticated_proxy?
144
+
145
+ connect_headers[Headers::PROXY_AUTHORIZATION] = proxy_authorization_header if using_authenticated_proxy?
146
+
145
147
  connect_headers
146
148
  end
147
149
 
@@ -1,3 +1,4 @@
1
+ require "http/headers"
1
2
  require "http/cache/headers"
2
3
 
3
4
  module HTTP
@@ -76,17 +77,16 @@ module HTTP
76
77
  private
77
78
 
78
79
  # @return [Headers] conditional request headers
79
- # @api private
80
80
  def conditional_headers_for(cached_response)
81
81
  headers = HTTP::Headers.new
82
82
 
83
- cached_response.headers.get("Etag").
84
- each { |etag| headers.add("If-None-Match", etag) }
83
+ cached_response.headers.get(HTTP::Headers::ETAG).
84
+ each { |etag| headers.add(HTTP::Headers::IF_NONE_MATCH, etag) }
85
85
 
86
- cached_response.headers.get("Last-Modified").
87
- each { |last_mod| headers.add("If-Modified-Since", last_mod) }
86
+ cached_response.headers.get(HTTP::Headers::LAST_MODIFIED).
87
+ each { |last_mod| headers.add(HTTP::Headers::IF_MODIFIED_SINCE, last_mod) }
88
88
 
89
- headers.add("Cache-Control", "max-age=0") if cache_headers.forces_revalidation?
89
+ headers.add(HTTP::Headers::CACHE_CONTROL, "max-age=0") if cache_headers.forces_revalidation?
90
90
 
91
91
  headers
92
92
  end
@@ -1,8 +1,16 @@
1
+ require "http/headers"
2
+
1
3
  module HTTP
2
4
  class Request
3
5
  class Writer
4
6
  # CRLF is the universal HTTP delimiter
5
- CRLF = "\r\n"
7
+ CRLF = "\r\n".freeze
8
+
9
+ # Chunked data termintaor.
10
+ ZERO = "0".freeze
11
+
12
+ # Chunked transfer encoding
13
+ CHUNKED = "chunked".freeze
6
14
 
7
15
  # Types valid to be used as body source
8
16
  VALID_BODY_TYPES = [String, NilClass, Enumerable]
@@ -38,9 +46,9 @@ module HTTP
38
46
  # Adds the headers to the header array for the given request body we are working
39
47
  # with
40
48
  def add_body_type_headers
41
- if @body.is_a?(String) && !@headers["Content-Length"]
42
- @request_header << "Content-Length: #{@body.bytesize}"
43
- elsif @body.is_a?(Enumerable) && "chunked" != @headers["Transfer-Encoding"]
49
+ if @body.is_a?(String) && !@headers[Headers::CONTENT_LENGTH]
50
+ @request_header << "#{Headers::CONTENT_LENGTH}: #{@body.bytesize}"
51
+ elsif @body.is_a?(Enumerable) && CHUNKED != @headers[Headers::TRANSFER_ENCODING]
44
52
  fail(RequestError, "invalid transfer encoding")
45
53
  end
46
54
  end
@@ -69,7 +77,7 @@ module HTTP
69
77
  @socket << chunk << CRLF
70
78
  end
71
79
 
72
- @socket << "0" << CRLF * 2
80
+ @socket << ZERO << CRLF << CRLF
73
81
  end
74
82
  end
75
83
 
data/lib/http/response.rb CHANGED
@@ -78,7 +78,7 @@ module HTTP
78
78
  #
79
79
  # @return [HTTP::ContentType]
80
80
  def content_type
81
- @content_type ||= ContentType.parse headers["Content-Type"]
81
+ @content_type ||= ContentType.parse headers[Headers::CONTENT_TYPE]
82
82
  end
83
83
 
84
84
  # MIME type of response (if any)
@@ -1,3 +1,4 @@
1
+ require "http/headers"
1
2
  require "http/cache/headers"
2
3
  require "http/response/string_body"
3
4
  require "http/response/io_body"
@@ -25,7 +26,7 @@ module HTTP
25
26
  expired? || cache_headers.must_revalidate?
26
27
  end
27
28
 
28
- # @returns [Boolean] true iff this response has expired
29
+ # @return [Boolean] true iff this response has expired
29
30
  def expired?
30
31
  current_age >= cache_headers.max_age
31
32
  end
@@ -52,7 +53,7 @@ module HTTP
52
53
  # Algo from https://tools.ietf.org/html/rfc2616#section-13.2.3
53
54
  def current_age
54
55
  now = Time.now
55
- age_value = headers.get("Age").map(&:to_i).max || 0
56
+ age_value = headers.get(HTTP::Headers::AGE).map(&:to_i).max || 0
56
57
 
57
58
  apparent_age = [0, received_at - server_response_time].max
58
59
  corrected_received_age = [apparent_age, age_value].max
@@ -116,18 +117,18 @@ module HTTP
116
117
  end
117
118
 
118
119
  def vary
119
- headers.get("Vary").first
120
+ headers.get(HTTP::Headers::VARY).first
120
121
  end
121
122
 
122
123
  protected
123
124
 
124
125
  # @return [Time] the time at which the server generated this response.
125
126
  def server_response_time
126
- headers.get("Date").
127
+ headers.get(HTTP::Headers::DATE).
127
128
  map(&method(:to_time_or_epoch)).
128
129
  max || begin
129
130
  # set it if it is not already set
130
- headers["Date"] = received_at.httpdate
131
+ headers[HTTP::Headers::DATE] = received_at.httpdate
131
132
  received_at
132
133
  end
133
134
  end
@@ -78,20 +78,28 @@ module HTTP
78
78
  REASONS[code]
79
79
  end
80
80
 
81
+ # @return [String] string representation of HTTP status
82
+ def to_s
83
+ "#{code} #{reason}".strip
84
+ end
85
+
81
86
  # Symbolized {#reason}
82
87
  #
83
88
  # @return [nil] unless code is well-known (see REASONS)
84
89
  # @return [Symbol]
85
- def symbolize
90
+ def to_sym
86
91
  SYMBOLS[code]
87
92
  end
88
93
 
94
+ # @deprecated Will be removed in 1.0.0
95
+ alias_method :symbolize, :to_sym
96
+
89
97
  # Printable version of HTTP Status, surrounded by quote marks,
90
98
  # with special characters escaped.
91
99
  #
92
100
  # (see String#inspect)
93
101
  def inspect
94
- "#{code} #{reason}".inspect
102
+ "#<#{self.class} #{self}>"
95
103
  end
96
104
 
97
105
  SYMBOLS.each do |code, symbol|
data/lib/http/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module HTTP
2
- VERSION = "0.8.11"
2
+ VERSION = "0.8.12".freeze
3
3
  end
@@ -55,7 +55,7 @@ RSpec.describe HTTP::Response::Status do
55
55
  describe "#inspect" do
56
56
  it "returns quoted code and reason phrase" do
57
57
  status = described_class.new 200
58
- expect(status.inspect).to eq '"200 OK"'
58
+ expect(status.inspect).to eq "#<HTTP::Response::Status 200 OK>"
59
59
  end
60
60
  end
61
61
 
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.11
4
+ version: 0.8.12
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: 2015-05-23 00:00:00.000000000 Z
14
+ date: 2015-05-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: http_parser.rb
@@ -116,6 +116,7 @@ files:
116
116
  - lib/http/content_type.rb
117
117
  - lib/http/errors.rb
118
118
  - lib/http/headers.rb
119
+ - lib/http/headers/known.rb
119
120
  - lib/http/headers/mixin.rb
120
121
  - lib/http/mime_type.rb
121
122
  - lib/http/mime_type/adapter.rb
@@ -195,45 +196,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
196
  version: '0'
196
197
  requirements: []
197
198
  rubyforge_project:
198
- rubygems_version: 2.4.6
199
+ rubygems_version: 2.2.3
199
200
  signing_key:
200
201
  specification_version: 4
201
202
  summary: HTTP should be easy
202
- test_files:
203
- - spec/lib/http/cache/headers_spec.rb
204
- - spec/lib/http/cache_spec.rb
205
- - spec/lib/http/client_spec.rb
206
- - spec/lib/http/content_type_spec.rb
207
- - spec/lib/http/headers/mixin_spec.rb
208
- - spec/lib/http/headers_spec.rb
209
- - spec/lib/http/options/body_spec.rb
210
- - spec/lib/http/options/form_spec.rb
211
- - spec/lib/http/options/headers_spec.rb
212
- - spec/lib/http/options/json_spec.rb
213
- - spec/lib/http/options/merge_spec.rb
214
- - spec/lib/http/options/new_spec.rb
215
- - spec/lib/http/options/proxy_spec.rb
216
- - spec/lib/http/options_spec.rb
217
- - spec/lib/http/redirector_spec.rb
218
- - spec/lib/http/request/caching_spec.rb
219
- - spec/lib/http/request/writer_spec.rb
220
- - spec/lib/http/request_spec.rb
221
- - spec/lib/http/response/body_spec.rb
222
- - spec/lib/http/response/caching_spec.rb
223
- - spec/lib/http/response/io_body_spec.rb
224
- - spec/lib/http/response/status_spec.rb
225
- - spec/lib/http/response/string_body_spec.rb
226
- - spec/lib/http/response_spec.rb
227
- - spec/lib/http_spec.rb
228
- - spec/spec_helper.rb
229
- - spec/support/black_hole.rb
230
- - spec/support/capture_warning.rb
231
- - spec/support/connection_reuse_shared.rb
232
- - spec/support/dummy_server.rb
233
- - spec/support/dummy_server/servlet.rb
234
- - spec/support/http_handling_shared.rb
235
- - spec/support/proxy_server.rb
236
- - spec/support/servers/config.rb
237
- - spec/support/servers/runner.rb
238
- - spec/support/ssl_helper.rb
203
+ test_files: []
239
204
  has_rdoc: