http 4.4.1 → 5.0.0.pre

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
  SHA256:
3
- metadata.gz: cce9a8685f3b60f994e77174f79c2306f607d62016bf64b74fcebc4f86377ec0
4
- data.tar.gz: 353702b62a1b9d3b2ea86ac5ac3ad88e9efa734c77e180128fa06c6c301895d3
3
+ metadata.gz: 2825a470cfdf9fd2d231cfe42a5d9aa54286a5cd13e402a5988f9ebfccd5fea9
4
+ data.tar.gz: ae9fbde0feda802b51bdb9926179d5c449d8ef9694d2c131eaf3226899236a7e
5
5
  SHA512:
6
- metadata.gz: 84ddc4cf98e603d175a9ecb8db03abd32187888070abd96a437c4121750ac2b86b6cada5d00d527b398ff4a403c2b6448d45bed61c45dbd3be8658f4ad38b121
7
- data.tar.gz: 750edced9ae715483d750f0b18777f84a4ee24848ec761c67d2c5b89d00ebbc99fbc1e02932d3d30a33eaea43e1d081ba97bcacaf2231f6693e50d218ee24e87
6
+ metadata.gz: 7734a21527150dcf3e987d37c815930470e7a2620ceee1177b0885e6a23c10a571b040e16d1b2c6153c6a35c8e54aa89be1737a7e3d00c9e306caf33e4d199a2
7
+ data.tar.gz: 1ce3516a9928a62f852d3e995686a44c9ad1cd837e63c4862d7680a70b3d435b05f153f8a602f6f555dfadb431bd6567649512e596e56f54ba5c19fa040408ff
@@ -20,8 +20,7 @@ Metrics/AbcSize:
20
20
 
21
21
  Metrics/BlockLength:
22
22
  Exclude:
23
- - "spec/**/*"
24
- - "**/*.gemspec"
23
+ - spec/**/*
25
24
 
26
25
  Metrics/BlockNesting:
27
26
  Max: 2
@@ -6,7 +6,7 @@ cache: bundler
6
6
  before_install:
7
7
  - gem update --system
8
8
  - gem --version
9
- - gem install bundler --no-document
9
+ - gem install bundler
10
10
  - bundle --version
11
11
 
12
12
  install: bundle install --without development doc
@@ -17,23 +17,20 @@ env: JRUBY_OPTS="$JRUBY_OPTS --debug"
17
17
 
18
18
  rvm:
19
19
  # Include JRuby first because it takes the longest
20
- - jruby-9.2.5.0
20
+ - jruby-9.1.16.0
21
21
  - 2.3
22
22
  - 2.4
23
23
  - 2.5
24
- - 2.6
25
- - 2.7
26
24
 
27
25
  matrix:
28
26
  fast_finish: true
29
27
  include:
30
28
  # Only run RuboCop and Yardstick metrics on the latest Ruby
31
- - rvm: 2.7
29
+ - rvm: 2.5
32
30
  env: SUITE="rubocop"
33
- - rvm: 2.7
31
+ - rvm: 2.5
34
32
  env: SUITE="yardstick"
35
33
 
36
34
  branches:
37
35
  only:
38
36
  - master
39
- - 4-x-stable
data/.yardopts CHANGED
@@ -1,2 +1,2 @@
1
- --markup-provider=redcarpet
1
+ --markup-provider=kramdown
2
2
  --markup=markdown
data/CHANGES.md CHANGED
@@ -1,60 +1,10 @@
1
- ## 4.4.1 (2020-03-29)
1
+ ## future is unwritten (master)
2
2
 
3
- * Backport [#590](https://github.com/httprb/http/pull/590)
4
- Fix parser failing on some edge cases.
5
- ([@ixti])
6
-
7
- ## 4.4.0 (2020-03-25)
8
-
9
- * Backport [#587](https://github.com/httprb/http/pull/587)
10
- Fix redirections when server responds with multiple Location headers.
11
- ([@ixti])
12
-
13
- * Backport [#599](https://github.com/httprb/http/pull/599)
14
- Allow passing HTTP::FormData::{Multipart,UrlEncoded} object directly.
15
- ([@ixti])
16
-
17
- ## 4.3.0 (2020-01-09)
18
-
19
- * Backport [#581](https://github.com/httprb/http/pull/581)
20
- Add Ruby-2.7 compatibility.
21
- ([@ixti], [@janko])
22
-
23
-
24
- ## 4.2.0 (2019-10-22)
25
-
26
- * Backport [#489](https://github.com/httprb/http/pull/489)
3
+ * [#489](https://github.com/httprb/http/pull/489)
27
4
  Fix HTTP parser.
28
5
  ([@ixti], [@fxposter])
29
6
 
30
7
 
31
- ## 4.1.1 (2019-03-12)
32
-
33
- * Add `HTTP::Headers::ACCEPT_ENCODING` constant.
34
- ([@ixti])
35
-
36
-
37
- ## 4.1.0 (2019-03-11)
38
-
39
- * [#533](https://github.com/httprb/http/pull/533)
40
- Add URI normalizer feature that allows to swap default URI normalizer.
41
- ([@mamoonraja])
42
-
43
-
44
- ## 4.0.5 (2019-02-15)
45
-
46
- * Backport [#532](https://github.com/httprb/http/pull/532) from master.
47
- Fix pipes support in request bodies.
48
- ([@ixti])
49
-
50
-
51
- ## 4.0.4 (2019-02-12)
52
-
53
- * Backport [#506](https://github.com/httprb/http/pull/506) from master.
54
- Skip auto-deflate when there is no body.
55
- ([@Bonias])
56
-
57
-
58
8
  ## 4.0.3 (2019-01-18)
59
9
 
60
10
  * Fix missing URL in response wrapped by auto inflate.
@@ -802,4 +752,3 @@ end
802
752
  [@paul]: https://github.com/paul
803
753
  [@RickCSong]: https://github.com/RickCSong
804
754
  [@fxposter]: https://github.com/fxposter
805
- [@mamoonraja]: https://github.com/mamoonraja
data/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # ![http.rb](https://raw.github.com/httprb/http.rb/master/logo.png)
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/http.svg)](https://rubygems.org/gems/http)
4
- [![Build Status](https://secure.travis-ci.org/httprb/http.svg?branch=4-x-stable)](https://travis-ci.org/httprb/http)
5
- [![Code Climate](https://codeclimate.com/github/httprb/http.svg?branch=4-x-stable)](https://codeclimate.com/github/httprb/http)
6
- [![Coverage Status](https://coveralls.io/repos/httprb/http/badge.svg?branch=4-x-stable)](https://coveralls.io/r/httprb/http)
7
- [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/httprb/http/blob/4-x-stable/LICENSE.txt)
4
+ [![Build Status](https://secure.travis-ci.org/httprb/http.svg?branch=master)](https://travis-ci.org/httprb/http)
5
+ [![Code Climate](https://codeclimate.com/github/httprb/http.svg?branch=master)](https://codeclimate.com/github/httprb/http)
6
+ [![Coverage Status](https://coveralls.io/repos/httprb/http/badge.svg?branch=master)](https://coveralls.io/r/httprb/http)
7
+ [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/httprb/http/blob/master/LICENSE.txt)
8
8
 
9
9
  [Documentation]
10
10
 
11
- _NOTE: This is the 4.x **stable** branch. For the 3.x **stable** branch, please see:_
11
+ _NOTE: This is the 5.x **development** branch. For the 4.x **stable** branch, please see:_
12
12
 
13
- https://github.com/httprb/http/tree/3-x-stable
13
+ https://github.com/httprb/http/tree/4-x-stable
14
14
 
15
15
  ## About
16
16
 
@@ -167,8 +167,7 @@ versions:
167
167
  * Ruby 2.3.x
168
168
  * Ruby 2.4.x
169
169
  * Ruby 2.5.x
170
- * Ruby 2.6.x
171
- * JRuby 9.2.x.x
170
+ * JRuby 9.1.x.x
172
171
 
173
172
  If something doesn't work on one of these versions, it's a bug.
174
173
 
@@ -198,5 +197,5 @@ dropped.
198
197
 
199
198
  ## Copyright
200
199
 
201
- Copyright (c) 2011-2019 Tony Arcieri, Alexey V. Zapparov, Erik Michaels-Ober, Zachary Anker.
200
+ Copyright (c) 2011-2018 Tony Arcieri, Alexey V. Zapparov, Erik Michaels-Ober, Zachary Anker.
202
201
  See LICENSE.txt for further details.
@@ -27,17 +27,10 @@ Gem::Specification.new do |gem|
27
27
 
28
28
  gem.required_ruby_version = ">= 2.3"
29
29
 
30
- gem.add_runtime_dependency "addressable", "~> 2.3"
31
- gem.add_runtime_dependency "http-cookie", "~> 1.0"
32
- gem.add_runtime_dependency "http-form_data", "~> 2.2"
33
30
  gem.add_runtime_dependency "http-parser", "~> 1.2.0"
31
+ gem.add_runtime_dependency "http-form_data", "~> 2.0"
32
+ gem.add_runtime_dependency "http-cookie", "~> 1.0"
33
+ gem.add_runtime_dependency "addressable", "~> 2.3"
34
34
 
35
35
  gem.add_development_dependency "bundler", "~> 2.0"
36
-
37
- gem.metadata = {
38
- "source_code_uri" => "https://github.com/httprb/http",
39
- "wiki_uri" => "https://github.com/httprb/http/wiki",
40
- "bug_tracker_uri" => "https://github.com/httprb/http/issues",
41
- "changelog_uri" => "https://github.com/httprb/http/blob/v#{HTTP::VERSION}/CHANGES.md"
42
- }
43
36
  end
@@ -42,14 +42,14 @@ module HTTP
42
42
  uri = make_request_uri(uri, opts)
43
43
  headers = make_request_headers(opts)
44
44
  body = make_request_body(opts, headers)
45
+ proxy = opts.proxy
45
46
 
46
47
  req = HTTP::Request.new(
47
- :verb => verb,
48
- :uri => uri,
49
- :uri_normalizer => opts.feature(:normalize_uri)&.normalizer,
50
- :proxy => opts.proxy,
51
- :headers => headers,
52
- :body => body
48
+ :verb => verb,
49
+ :uri => uri,
50
+ :headers => headers,
51
+ :proxy => proxy,
52
+ :body => body
53
53
  )
54
54
 
55
55
  opts.features.inject(req) do |request, (_name, feature)|
@@ -160,6 +160,14 @@ module HTTP
160
160
  headers[Headers::COOKIE] = cookies
161
161
  end
162
162
 
163
+ if (auto_deflate = opts.feature(:auto_deflate))
164
+ # We need to delete Content-Length header. It will be set automatically
165
+ # by HTTP::Request::Writer
166
+ headers.delete(Headers::CONTENT_LENGTH)
167
+
168
+ headers[Headers::CONTENT_ENCODING] = auto_deflate.method
169
+ end
170
+
163
171
  headers
164
172
  end
165
173
 
@@ -169,7 +177,7 @@ module HTTP
169
177
  when opts.body
170
178
  opts.body
171
179
  when opts.form
172
- form = make_form_data(opts.form)
180
+ form = HTTP::FormData.create opts.form
173
181
  headers[Headers::CONTENT_TYPE] ||= form.content_type
174
182
  form
175
183
  when opts.json
@@ -178,12 +186,5 @@ module HTTP
178
186
  body
179
187
  end
180
188
  end
181
-
182
- def make_form_data(form)
183
- return form if form.is_a? HTTP::FormData::Multipart
184
- return form if form.is_a? HTTP::FormData::Urlencoded
185
-
186
- HTTP::FormData.create(form)
187
- end
188
189
  end
189
190
  end
@@ -93,7 +93,7 @@ module HTTP
93
93
  chunk = @parser.read(size)
94
94
  finish_response if finished
95
95
 
96
- chunk || "".b
96
+ chunk.to_s
97
97
  end
98
98
 
99
99
  # Reads data from socket up until headers are loaded
@@ -20,4 +20,3 @@ require "http/features/auto_inflate"
20
20
  require "http/features/auto_deflate"
21
21
  require "http/features/logging"
22
22
  require "http/features/instrumentation"
23
- require "http/features/normalize_uri"
@@ -10,7 +10,7 @@ module HTTP
10
10
  class AutoDeflate < Feature
11
11
  attr_reader :method
12
12
 
13
- def initialize(**)
13
+ def initialize(*)
14
14
  super
15
15
 
16
16
  @method = @opts.key?(:method) ? @opts[:method].to_s : "gzip"
@@ -20,11 +20,6 @@ module HTTP
20
20
 
21
21
  def wrap_request(request)
22
22
  return request unless method
23
- return request if request.body.size.zero?
24
-
25
- # We need to delete Content-Length header. It will be set automatically by HTTP::Request::Writer
26
- request.headers.delete(Headers::CONTENT_LENGTH)
27
- request.headers[Headers::CONTENT_ENCODING] = method
28
23
 
29
24
  Request.new(
30
25
  :version => request.version,
@@ -32,8 +27,7 @@ module HTTP
32
27
  :uri => request.uri,
33
28
  :headers => request.headers,
34
29
  :proxy => request.proxy,
35
- :body => deflated_body(request.body),
36
- :uri_normalizer => request.uri_normalizer
30
+ :body => deflated_body(request.body)
37
31
  )
38
32
  end
39
33
 
@@ -5,9 +5,6 @@ module HTTP
5
5
  # Content-Types that are acceptable for the response.
6
6
  ACCEPT = "Accept"
7
7
 
8
- # Content-codings that are acceptable in the response.
9
- ACCEPT_ENCODING = "Accept-Encoding"
10
-
11
8
  # The age the object has been in a proxy cache in seconds.
12
9
  AGE = "Age"
13
10
 
@@ -114,7 +114,7 @@ module HTTP
114
114
  unless (feature = self.class.available_features[name])
115
115
  argument_error! "Unsupported feature: #{name}"
116
116
  end
117
- feature.new(**opts_or_feature)
117
+ feature.new(opts_or_feature)
118
118
  end
119
119
  end
120
120
  end
@@ -58,8 +58,7 @@ module HTTP
58
58
 
59
59
  @response.flush
60
60
 
61
- # XXX(ixti): using `Array#inject` to return `nil` if no Location header.
62
- @request = redirect_to(@response.headers.get(Headers::LOCATION).inject(:+))
61
+ @request = redirect_to @response.headers[Headers::LOCATION]
63
62
  @response = yield @request
64
63
  end
65
64
 
@@ -66,8 +66,6 @@ module HTTP
66
66
  # Scheme is normalized to be a lowercase symbol e.g. :http, :https
67
67
  attr_reader :scheme
68
68
 
69
- attr_reader :uri_normalizer
70
-
71
69
  # "Request URI" as per RFC 2616
72
70
  # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
73
71
  attr_reader :uri
@@ -75,25 +73,25 @@ module HTTP
75
73
 
76
74
  # @option opts [String] :version
77
75
  # @option opts [#to_s] :verb HTTP request method
78
- # @option opts [#call] :uri_normalizer (HTTP::URI::NORMALIZER)
79
76
  # @option opts [HTTP::URI, #to_s] :uri
80
77
  # @option opts [Hash] :headers
81
78
  # @option opts [Hash] :proxy
82
79
  # @option opts [String, Enumerable, IO, nil] :body
83
80
  def initialize(opts)
84
- @verb = opts.fetch(:verb).to_s.downcase.to_sym
85
- @uri_normalizer = opts[:uri_normalizer] || HTTP::URI::NORMALIZER
86
-
87
- @uri = @uri_normalizer.call(opts.fetch(:uri))
81
+ @verb = opts.fetch(:verb).to_s.downcase.to_sym
82
+ @uri = normalize_uri(opts.fetch(:uri))
88
83
  @scheme = @uri.scheme.to_s.downcase.to_sym if @uri.scheme
89
84
 
90
85
  raise(UnsupportedMethodError, "unknown method: #{verb}") unless METHODS.include?(@verb)
91
86
  raise(UnsupportedSchemeError, "unknown scheme: #{scheme}") unless SCHEMES.include?(@scheme)
92
87
 
93
88
  @proxy = opts[:proxy] || {}
89
+ @body = (body = opts[:body]).is_a?(Request::Body) ? body : Request::Body.new(body)
94
90
  @version = opts[:version] || "1.1"
95
- @headers = prepare_headers(opts[:headers])
96
- @body = prepare_body(opts[:body])
91
+ @headers = HTTP::Headers.coerce(opts[:headers] || {})
92
+
93
+ @headers[Headers::HOST] ||= default_host_header_value
94
+ @headers[Headers::USER_AGENT] ||= USER_AGENT
97
95
  end
98
96
 
99
97
  # Returns new Request with updated uri
@@ -102,13 +100,12 @@ module HTTP
102
100
  headers.delete(Headers::HOST)
103
101
 
104
102
  self.class.new(
105
- :verb => verb,
106
- :uri => @uri.join(uri),
107
- :headers => headers,
108
- :proxy => proxy,
109
- :body => body.source,
110
- :version => version,
111
- :uri_normalizer => uri_normalizer
103
+ :verb => verb,
104
+ :uri => @uri.join(uri),
105
+ :headers => headers,
106
+ :proxy => proxy,
107
+ :body => body.source,
108
+ :version => version
112
109
  )
113
110
  end
114
111
 
@@ -216,17 +213,17 @@ module HTTP
216
213
  PORTS[@scheme] != port ? "#{host}:#{port}" : host
217
214
  end
218
215
 
219
- def prepare_body(body)
220
- body.is_a?(Request::Body) ? body : Request::Body.new(body)
221
- end
216
+ # @return [HTTP::URI] URI with all componentes but query being normalized.
217
+ def normalize_uri(uri)
218
+ uri = HTTP::URI.parse uri
222
219
 
223
- def prepare_headers(headers)
224
- headers = HTTP::Headers.coerce(headers || {})
225
-
226
- headers[Headers::HOST] ||= default_host_header_value
227
- headers[Headers::USER_AGENT] ||= USER_AGENT
228
-
229
- headers
220
+ HTTP::URI.new(
221
+ :scheme => uri.normalized_scheme,
222
+ :authority => uri.normalized_authority,
223
+ :path => uri.normalized_path,
224
+ :query => uri.query,
225
+ :fragment => uri.normalized_fragment
226
+ )
230
227
  end
231
228
  end
232
229
  end
@@ -35,12 +35,10 @@ module HTTP
35
35
  yield @source
36
36
  elsif @source.respond_to?(:read)
37
37
  IO.copy_stream(@source, ProcIO.new(block))
38
- rewind(@source)
38
+ @source.rewind if @source.respond_to?(:rewind)
39
39
  elsif @source.is_a?(Enumerable)
40
40
  @source.each(&block)
41
41
  end
42
-
43
- self
44
42
  end
45
43
 
46
44
  # Request bodies are equivalent when they have the same source.
@@ -50,28 +48,6 @@ module HTTP
50
48
 
51
49
  private
52
50
 
53
- def rewind(io)
54
- io.rewind if io.respond_to? :rewind
55
- rescue Errno::ESPIPE, Errno::EPIPE
56
- # Pipe IOs respond to `:rewind` but fail when you call it.
57
- #
58
- # Calling `IO#rewind` on a pipe, fails with *ESPIPE* on MRI,
59
- # but *EPIPE* on jRuby.
60
- #
61
- # - **ESPIPE** -- "Illegal seek."
62
- # Invalid seek operation (such as on a pipe).
63
- #
64
- # - **EPIPE** -- "Broken pipe."
65
- # There is no process reading from the other end of a pipe. Every
66
- # library function that returns this error code also generates
67
- # a SIGPIPE signal; this signal terminates the program if not handled
68
- # or blocked. Thus, your program will never actually see EPIPE unless
69
- # it has handled or blocked SIGPIPE.
70
- #
71
- # See: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html
72
- nil
73
- end
74
-
75
51
  def validate_source_type!
76
52
  return if @source.is_a?(String)
77
53
  return if @source.respond_to?(:read)
@@ -49,17 +49,14 @@ module HTTP
49
49
  #
50
50
 
51
51
  def on_header_field(_response, field)
52
- append_header if @reading_header_value
53
- @field << field
52
+ @field = field
54
53
  end
55
54
 
56
55
  def on_header_value(_response, value)
57
- @reading_header_value = true
58
- @field_value << value
56
+ @headers.add(@field, value) if @field
59
57
  end
60
58
 
61
59
  def on_headers_complete(_reposse)
62
- append_header if @reading_header_value
63
60
  @finished[:headers] = true
64
61
  end
65
62
 
@@ -92,26 +89,15 @@ module HTTP
92
89
  def reset
93
90
  @state.reset!
94
91
 
95
- @finished = Hash.new(false)
96
- @headers = HTTP::Headers.new
97
- @reading_header_value = false
98
- @field = +""
99
- @field_value = +""
100
- @chunk = nil
92
+ @finished = Hash.new(false)
93
+ @headers = HTTP::Headers.new
94
+ @field = nil
95
+ @chunk = nil
101
96
  end
102
97
 
103
98
  def finished?
104
99
  @finished[:message]
105
100
  end
106
-
107
- private
108
-
109
- def append_header
110
- @headers.add(@field, @field_value)
111
- @reading_header_value = false
112
- @field_value = +""
113
- @field = +""
114
- end
115
101
  end
116
102
  end
117
103
  end
@@ -26,19 +26,6 @@ module HTTP
26
26
  # @private
27
27
  HTTPS_SCHEME = "https"
28
28
 
29
- # @private
30
- NORMALIZER = lambda do |uri|
31
- uri = HTTP::URI.parse uri
32
-
33
- HTTP::URI.new(
34
- :scheme => uri.normalized_scheme,
35
- :authority => uri.normalized_authority,
36
- :path => uri.normalized_path,
37
- :query => uri.query,
38
- :fragment => uri.normalized_fragment
39
- )
40
- end
41
-
42
29
  # Parse the given URI string, returning an HTTP::URI object
43
30
  #
44
31
  # @param [HTTP::URI, String, #to_str] uri to parse
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTP
4
- VERSION = "4.4.1"
4
+ VERSION = "5.0.0.pre"
5
5
  end
@@ -98,8 +98,9 @@ RSpec.describe HTTP::Client do
98
98
  end
99
99
 
100
100
  it "works like a charm in real world" do
101
- expect(HTTP.follow.get("https://bit.ly/2UaBT4R").parse(:json)).
102
- to include("url" => "https://httpbin.org/anything/könig")
101
+ url = "http://git.io/jNeY"
102
+ client = HTTP.follow
103
+ expect(client.get(url).to_s).to include "support for non-ascii URIs"
103
104
  end
104
105
  end
105
106
  end
@@ -189,22 +190,6 @@ RSpec.describe HTTP::Client do
189
190
 
190
191
  client.get("http://example.com/", :form => {:foo => HTTP::FormData::Part.new("content")})
191
192
  end
192
-
193
- context "when passing an HTTP::FormData object directly" do
194
- it "creates url encoded form data object" do
195
- client = HTTP::Client.new
196
- form_data = HTTP::FormData::Multipart.new(:foo => "bar")
197
-
198
- allow(client).to receive(:perform)
199
-
200
- expect(HTTP::Request).to receive(:new) do |opts|
201
- expect(opts[:body]).to be form_data
202
- expect(opts[:body].to_s).to match(/^Content-Disposition: form-data; name="foo"\r\n\r\nbar\r\n/m)
203
- end
204
-
205
- client.get("http://example.com/", :form => form_data)
206
- end
207
- end
208
193
  end
209
194
 
210
195
  describe "passing json" do
@@ -228,9 +213,9 @@ RSpec.describe HTTP::Client do
228
213
  end
229
214
 
230
215
  it "works like a charm in real world" do
231
- url = "https://httpbin.org/anything/ö無"
232
-
233
- expect(HTTP.follow.get(url).parse(:json)).to include("url" => url)
216
+ url = "https://github.com/httprb/http.rb/pull/197/ö無"
217
+ client = HTTP.follow
218
+ expect(client.get(url).to_s).to include "support for non-ascii URIs"
234
219
  end
235
220
  end
236
221
 
@@ -249,7 +234,7 @@ RSpec.describe HTTP::Client do
249
234
 
250
235
  context "when :auto_deflate was specified" do
251
236
  let(:headers) { {"Content-Length" => "12"} }
252
- let(:client) { described_class.new :headers => headers, :features => {:auto_deflate => {}}, :body => "foo" }
237
+ let(:client) { described_class.new :headers => headers, :features => {:auto_deflate => {}} }
253
238
 
254
239
  it "deletes Content-Length header" do
255
240
  expect(client).to receive(:perform) do |req, _|
@@ -266,18 +251,6 @@ RSpec.describe HTTP::Client do
266
251
 
267
252
  client.request(:get, "http://example.com/")
268
253
  end
269
-
270
- context "and there is no body" do
271
- let(:client) { described_class.new :headers => headers, :features => {:auto_deflate => {}} }
272
-
273
- it "doesn't set Content-Encoding header" do
274
- expect(client).to receive(:perform) do |req, _|
275
- expect(req.headers).not_to include "Content-Encoding"
276
- end
277
-
278
- client.request(:get, "http://example.com/")
279
- end
280
- end
281
254
  end
282
255
  end
283
256
 
@@ -75,19 +75,6 @@ RSpec.describe HTTP::Redirector do
75
75
  expect(res.to_s).to eq "foo"
76
76
  end
77
77
 
78
- it "concatenates multiple Location headers" do
79
- req = HTTP::Request.new :verb => :head, :uri => "http://example.com"
80
- headers = HTTP::Headers.new
81
-
82
- %w[http://example.com /123].each { |loc| headers.add("Location", loc) }
83
-
84
- res = redirector.perform(req, simple_response(301, "", headers)) do |redirect|
85
- simple_response(200, redirect.uri.to_s)
86
- end
87
-
88
- expect(res.to_s).to eq "http://example.com/123"
89
- end
90
-
91
78
  context "following 300 redirect" do
92
79
  context "with strict mode" do
93
80
  let(:options) { {:strict => true} }
@@ -125,28 +125,6 @@ RSpec.describe HTTP::Request::Body do
125
125
  end
126
126
  end
127
127
 
128
- context "when body is a pipe" do
129
- let(:ios) { IO.pipe }
130
- let(:body) { ios[0] }
131
-
132
- around do |example|
133
- writer = Thread.new(ios[1]) do |io|
134
- io << "abcdef"
135
- io.close
136
- end
137
-
138
- begin
139
- example.run
140
- ensure
141
- writer.join
142
- end
143
- end
144
-
145
- it "yields chunks of content" do
146
- expect(chunks.inject("", :+)).to eq("abcdef")
147
- end
148
- end
149
-
150
128
  context "when body is an Enumerable IO" do
151
129
  let(:data) { "a" * 16 * 1024 + "b" * 10 * 1024 }
152
130
  let(:body) { StringIO.new data }
@@ -430,26 +430,6 @@ RSpec.describe HTTP do
430
430
  expect(response.to_s).to eq("#{body}-deflated")
431
431
  end
432
432
  end
433
-
434
- context "with :normalize_uri" do
435
- it "normalizes URI" do
436
- response = HTTP.get "#{dummy.endpoint}/hello world"
437
- expect(response.to_s).to eq("hello world")
438
- end
439
-
440
- it "uses the custom URI Normalizer method" do
441
- client = HTTP.use(:normalize_uri => {:normalizer => :itself.to_proc})
442
- response = client.get("#{dummy.endpoint}/hello world")
443
- expect(response.status).to eq(400)
444
- end
445
-
446
- it "uses the default URI normalizer" do
447
- client = HTTP.use :normalize_uri
448
- expect(HTTP::URI::NORMALIZER).to receive(:call).and_call_original
449
- response = client.get("#{dummy.endpoint}/hello world")
450
- expect(response.to_s).to eq("hello world")
451
- end
452
- end
453
433
  end
454
434
 
455
435
  it "unifies socket errors into HTTP::ConnectionError" do
@@ -148,11 +148,6 @@ class DummyServer < WEBrick::HTTPServer
148
148
  res.body = req.body
149
149
  end
150
150
 
151
- get "/hello world" do |_req, res|
152
- res.status = 200
153
- res.body = "hello world"
154
- end
155
-
156
151
  post "/encoded-body" do |req, res|
157
152
  res.status = 200
158
153
 
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: 4.4.1
4
+ version: 5.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
@@ -11,64 +11,64 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-03-29 00:00:00.000000000 Z
14
+ date: 2019-02-04 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: addressable
17
+ name: http-parser
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
20
  - - "~>"
21
21
  - !ruby/object:Gem::Version
22
- version: '2.3'
22
+ version: 1.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '2.3'
29
+ version: 1.2.0
30
30
  - !ruby/object:Gem::Dependency
31
- name: http-cookie
31
+ name: http-form_data
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: '1.0'
36
+ version: '2.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '1.0'
43
+ version: '2.0'
44
44
  - !ruby/object:Gem::Dependency
45
- name: http-form_data
45
+ name: http-cookie
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - "~>"
49
49
  - !ruby/object:Gem::Version
50
- version: '2.2'
50
+ version: '1.0'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '2.2'
57
+ version: '1.0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: http-parser
59
+ name: addressable
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - "~>"
63
63
  - !ruby/object:Gem::Version
64
- version: 1.2.0
64
+ version: '2.3'
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - "~>"
70
70
  - !ruby/object:Gem::Version
71
- version: 1.2.0
71
+ version: '2.3'
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: bundler
74
74
  requirement: !ruby/object:Gem::Requirement
@@ -116,7 +116,6 @@ files:
116
116
  - lib/http/features/auto_inflate.rb
117
117
  - lib/http/features/instrumentation.rb
118
118
  - lib/http/features/logging.rb
119
- - lib/http/features/normalize_uri.rb
120
119
  - lib/http/headers.rb
121
120
  - lib/http/headers/known.rb
122
121
  - lib/http/headers/mixin.rb
@@ -163,7 +162,6 @@ files:
163
162
  - spec/lib/http/request/writer_spec.rb
164
163
  - spec/lib/http/request_spec.rb
165
164
  - spec/lib/http/response/body_spec.rb
166
- - spec/lib/http/response/parser_spec.rb
167
165
  - spec/lib/http/response/status_spec.rb
168
166
  - spec/lib/http/response_spec.rb
169
167
  - spec/lib/http/uri_spec.rb
@@ -183,11 +181,7 @@ files:
183
181
  homepage: https://github.com/httprb/http
184
182
  licenses:
185
183
  - MIT
186
- metadata:
187
- source_code_uri: https://github.com/httprb/http
188
- wiki_uri: https://github.com/httprb/http/wiki
189
- bug_tracker_uri: https://github.com/httprb/http/issues
190
- changelog_uri: https://github.com/httprb/http/blob/v4.4.1/CHANGES.md
184
+ metadata: {}
191
185
  post_install_message:
192
186
  rdoc_options: []
193
187
  require_paths:
@@ -199,11 +193,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
193
  version: '2.3'
200
194
  required_rubygems_version: !ruby/object:Gem::Requirement
201
195
  requirements:
202
- - - ">="
196
+ - - ">"
203
197
  - !ruby/object:Gem::Version
204
- version: '0'
198
+ version: 1.3.1
205
199
  requirements: []
206
- rubygems_version: 3.0.3
200
+ rubygems_version: 3.0.1
207
201
  signing_key:
208
202
  specification_version: 4
209
203
  summary: HTTP should be easy
@@ -231,7 +225,6 @@ test_files:
231
225
  - spec/lib/http/request/writer_spec.rb
232
226
  - spec/lib/http/request_spec.rb
233
227
  - spec/lib/http/response/body_spec.rb
234
- - spec/lib/http/response/parser_spec.rb
235
228
  - spec/lib/http/response/status_spec.rb
236
229
  - spec/lib/http/response_spec.rb
237
230
  - spec/lib/http/uri_spec.rb
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "http/uri"
4
-
5
- module HTTP
6
- module Features
7
- class NormalizeUri < Feature
8
- attr_reader :normalizer
9
-
10
- def initialize(normalizer: HTTP::URI::NORMALIZER)
11
- @normalizer = normalizer
12
- end
13
-
14
- HTTP::Options.register_feature(:normalize_uri, self)
15
- end
16
- end
17
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe HTTP::Response::Parser do
4
- subject(:parser) { described_class.new }
5
- let(:raw_response) do
6
- "HTTP/1.1 200 OK\r\nContent-Length: 2\r\nContent-Type: application/json\r\nMy-Header: val\r\nEmpty-Header: \r\n\r\n{}"
7
- end
8
- let(:expected_headers) do
9
- {
10
- "Content-Length" => "2",
11
- "Content-Type" => "application/json",
12
- "My-Header" => "val",
13
- "Empty-Header" => ""
14
- }
15
- end
16
- let(:expected_body) { "{}" }
17
-
18
- before do
19
- parts.each { |part| subject.add(part) }
20
- end
21
-
22
- context "whole response in one part" do
23
- let(:parts) { [raw_response] }
24
-
25
- it "parses headers" do
26
- expect(subject.headers.to_h).to eq(expected_headers)
27
- end
28
-
29
- it "parses body" do
30
- expect(subject.read(expected_body.size)).to eq(expected_body)
31
- end
32
- end
33
-
34
- context "response in many parts" do
35
- let(:parts) { raw_response.split(//) }
36
-
37
- it "parses headers" do
38
- expect(subject.headers.to_h).to eq(expected_headers)
39
- end
40
-
41
- it "parses body" do
42
- expect(subject.read(expected_body.size)).to eq(expected_body)
43
- end
44
- end
45
- end