http 5.0.0 → 5.0.1
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 +25 -0
- data/LICENSE.txt +1 -1
- data/http.gemspec +1 -1
- data/lib/http/request.rb +15 -1
- data/lib/http/response.rb +2 -2
- data/lib/http/version.rb +1 -1
- data/spec/lib/http/redirector_spec.rb +44 -0
- data/spec/lib/http/response_spec.rb +20 -7
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afbab6dd50416f2205ca49ae54217bff2f35e3fcf7738a8a5288644e801b4d42
|
4
|
+
data.tar.gz: f4d7ee837eaeda6cd50ad6cd58dd1b7c125516a98e821d5e176a8591b2f6baff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94e587b821c4839152e67d31b704cc9a20ceae5e2bb168893786aeaea32edeee80967678b348f9b2051552ebe3a6e018e1b15ca67c3231bcd51553e78486cd8f
|
7
|
+
data.tar.gz: 1f0dc3544496196b8c1193509b0b3a7bf7152178488ebf071b692288caf44bc59e5edfe382f918b9f6cc4de1dfc43fdf2334ea16ce67787ef3a0ed03b1b5eb52
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## 5.0.1 (2021-06-26)
|
2
|
+
|
3
|
+
* [#670](https://github.com/httprb/http/pull/670)
|
4
|
+
Revert `Response#parse` behavior introduced in #540.
|
5
|
+
([@DannyBen])
|
6
|
+
|
7
|
+
* [#669](https://github.com/httprb/http/pull/669)
|
8
|
+
Prevent bodies from being resubmitted when following unsafe redirects.
|
9
|
+
([@odinhb])
|
10
|
+
|
11
|
+
* [#664](https://github.com/httprb/http/pull/664)
|
12
|
+
Bump llhttp-ffi to 0.3.0.
|
13
|
+
([@bryanp])
|
14
|
+
|
1
15
|
## 5.0.0 (2021-05-12)
|
2
16
|
|
3
17
|
* [#656](https://github.com/httprb/http/pull/656)
|
@@ -53,6 +67,12 @@
|
|
53
67
|
Preserve header names casing.
|
54
68
|
([@joshuaflanagan])
|
55
69
|
|
70
|
+
* [#540](https://github.com/httprb/http/pull/540)
|
71
|
+
[#538](https://github.com/httprb/http/issues/538)
|
72
|
+
**BREAKING CHANGE**
|
73
|
+
Require explicit MIME type for Response#parse
|
74
|
+
([@ixti])
|
75
|
+
|
56
76
|
* [#532](https://github.com/httprb/http/pull/532)
|
57
77
|
Fix pipes support in request bodies.
|
58
78
|
([@ixti])
|
@@ -79,6 +99,9 @@
|
|
79
99
|
Drop Ruby 2.3.x support.
|
80
100
|
([@ixti])
|
81
101
|
|
102
|
+
* [3ed0c31](https://github.com/httprb/http/commit/3ed0c318eab6a8c390654cda17bf6df9e963c7d6)
|
103
|
+
Drop Ruby 2.4.x support.
|
104
|
+
|
82
105
|
|
83
106
|
## 4.4.0 (2020-03-25)
|
84
107
|
|
@@ -887,3 +910,5 @@ end
|
|
887
910
|
[@semenyukdmitry]: https://github.com/semenyukdmitry
|
888
911
|
[@bryanp]: https://github.com/bryanp
|
889
912
|
[@meanphil]: https://github.com/meanphil
|
913
|
+
[@odinhb]: https://github.com/odinhb
|
914
|
+
[@DannyBen]: https://github.com/DannyBen
|
data/LICENSE.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2011-
|
1
|
+
Copyright (c) 2011-2021 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/http.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
|
|
30
30
|
gem.add_runtime_dependency "addressable", "~> 2.3"
|
31
31
|
gem.add_runtime_dependency "http-cookie", "~> 1.0"
|
32
32
|
gem.add_runtime_dependency "http-form_data", "~> 2.2"
|
33
|
-
gem.add_runtime_dependency "llhttp-ffi", "~> 0.0
|
33
|
+
gem.add_runtime_dependency "llhttp-ffi", "~> 0.3.0"
|
34
34
|
|
35
35
|
gem.add_development_dependency "bundler", "~> 2.0"
|
36
36
|
|
data/lib/http/request.rb
CHANGED
@@ -104,12 +104,26 @@ module HTTP
|
|
104
104
|
headers = self.headers.dup
|
105
105
|
headers.delete(Headers::HOST)
|
106
106
|
|
107
|
+
new_body = body.source
|
108
|
+
if verb == :get
|
109
|
+
# request bodies should not always be resubmitted when following a redirect
|
110
|
+
# some servers will close the connection after receiving the request headers
|
111
|
+
# which may cause Errno::ECONNRESET: Connection reset by peer
|
112
|
+
# see https://github.com/httprb/http/issues/649
|
113
|
+
# new_body = Request::Body.new(nil)
|
114
|
+
new_body = nil
|
115
|
+
# the CONTENT_TYPE header causes problems if set on a get request w/ an empty body
|
116
|
+
# the server might assume that there should be content if it is set to multipart
|
117
|
+
# rack raises EmptyContentError if this happens
|
118
|
+
headers.delete(Headers::CONTENT_TYPE)
|
119
|
+
end
|
120
|
+
|
107
121
|
self.class.new(
|
108
122
|
:verb => verb,
|
109
123
|
:uri => @uri.join(uri),
|
110
124
|
:headers => headers,
|
111
125
|
:proxy => proxy,
|
112
|
-
:body =>
|
126
|
+
:body => new_body,
|
113
127
|
:version => version,
|
114
128
|
:uri_normalizer => uri_normalizer
|
115
129
|
)
|
data/lib/http/response.rb
CHANGED
@@ -156,8 +156,8 @@ module HTTP
|
|
156
156
|
# @param type [#to_s] Parse as given MIME type.
|
157
157
|
# @raise (see MimeType.[])
|
158
158
|
# @return [Object]
|
159
|
-
def parse(type)
|
160
|
-
MimeType[type].decode to_s
|
159
|
+
def parse(type = nil)
|
160
|
+
MimeType[type || mime_type].decode to_s
|
161
161
|
end
|
162
162
|
|
163
163
|
# Inspect a response
|
data/lib/http/version.rb
CHANGED
@@ -396,5 +396,49 @@ RSpec.describe HTTP::Redirector do
|
|
396
396
|
end
|
397
397
|
end
|
398
398
|
end
|
399
|
+
|
400
|
+
describe "changing verbs during redirects" do
|
401
|
+
let(:options) { {:strict => false} }
|
402
|
+
let(:post_body) { HTTP::Request::Body.new("i might be way longer in real life") }
|
403
|
+
let(:cookie) { "dont eat my cookies" }
|
404
|
+
|
405
|
+
def a_dangerous_request(verb)
|
406
|
+
HTTP::Request.new(
|
407
|
+
:verb => verb, :uri => "http://example.com",
|
408
|
+
:body => post_body, :headers => {
|
409
|
+
"Content-Type" => "meme",
|
410
|
+
"Cookie" => cookie
|
411
|
+
}
|
412
|
+
)
|
413
|
+
end
|
414
|
+
|
415
|
+
def empty_body
|
416
|
+
HTTP::Request::Body.new(nil)
|
417
|
+
end
|
418
|
+
|
419
|
+
it "follows without body/content type if it has to change verb" do
|
420
|
+
req = a_dangerous_request(:post)
|
421
|
+
res = redirect_response 302, "http://example.com/1"
|
422
|
+
|
423
|
+
redirector.perform(req, res) do |prev_req, _|
|
424
|
+
expect(prev_req.body).to eq(empty_body)
|
425
|
+
expect(prev_req.headers["Cookie"]).to eq(cookie)
|
426
|
+
expect(prev_req.headers["Content-Type"]).to eq(nil)
|
427
|
+
simple_response 200
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
it "leaves body/content-type intact if it does not have to change verb" do
|
432
|
+
req = a_dangerous_request(:post)
|
433
|
+
res = redirect_response 307, "http://example.com/1"
|
434
|
+
|
435
|
+
redirector.perform(req, res) do |prev_req, _|
|
436
|
+
expect(prev_req.body).to eq(post_body)
|
437
|
+
expect(prev_req.headers["Cookie"]).to eq(cookie)
|
438
|
+
expect(prev_req.headers["Content-Type"]).to eq("meme")
|
439
|
+
simple_response 200
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
399
443
|
end
|
400
444
|
end
|
@@ -87,19 +87,32 @@ RSpec.describe HTTP::Response do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
describe "#parse" do
|
90
|
-
let(:headers) { {"Content-Type" =>
|
90
|
+
let(:headers) { {"Content-Type" => content_type} }
|
91
91
|
let(:body) { '{"foo":"bar"}' }
|
92
92
|
|
93
|
-
|
94
|
-
|
93
|
+
context "with known content type" do
|
94
|
+
let(:content_type) { "application/json" }
|
95
|
+
it "returns parsed body" do
|
96
|
+
expect(response.parse).to eq "foo" => "bar"
|
97
|
+
end
|
95
98
|
end
|
96
99
|
|
97
|
-
|
98
|
-
|
100
|
+
context "with unknown content type" do
|
101
|
+
let(:content_type) { "application/deadbeef" }
|
102
|
+
it "raises HTTP::Error" do
|
103
|
+
expect { response.parse }.to raise_error HTTP::Error
|
104
|
+
end
|
99
105
|
end
|
100
106
|
|
101
|
-
|
102
|
-
|
107
|
+
context "with explicitly given mime type" do
|
108
|
+
let(:content_type) { "application/deadbeef" }
|
109
|
+
it "ignores mime_type of response" do
|
110
|
+
expect(response.parse("application/json")).to eq "foo" => "bar"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "supports mime type aliases" do
|
114
|
+
expect(response.parse(:json)).to eq "foo" => "bar"
|
115
|
+
end
|
103
116
|
end
|
104
117
|
end
|
105
118
|
|
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: 5.0.
|
4
|
+
version: 5.0.1
|
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: 2021-
|
14
|
+
date: 2021-06-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: addressable
|
@@ -61,14 +61,14 @@ dependencies:
|
|
61
61
|
requirements:
|
62
62
|
- - "~>"
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 0.0
|
64
|
+
version: 0.3.0
|
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: 0.0
|
71
|
+
version: 0.3.0
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
73
|
name: bundler
|
74
74
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,7 +191,7 @@ metadata:
|
|
191
191
|
source_code_uri: https://github.com/httprb/http
|
192
192
|
wiki_uri: https://github.com/httprb/http/wiki
|
193
193
|
bug_tracker_uri: https://github.com/httprb/http/issues
|
194
|
-
changelog_uri: https://github.com/httprb/http/blob/v5.0.
|
194
|
+
changelog_uri: https://github.com/httprb/http/blob/v5.0.1/CHANGES.md
|
195
195
|
post_install_message:
|
196
196
|
rdoc_options: []
|
197
197
|
require_paths:
|