async-http 0.59.3 → 0.59.5
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
- checksums.yaml.gz.sig +0 -0
- data/lib/async/http/relative_location.rb +60 -7
- data/lib/async/http/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +5 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 173740367554634a3d29a3624b5750bad44e8f5f6e03bab869713c13757c3aa0
|
4
|
+
data.tar.gz: 331c000cd4e00ff460ad48b168781cf072e4bbde278da3c9af22f42ff0ff979d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a809094366e9758ff1a2c7325f5d0b3038521a17533b46a6c8715de8ba70c961a9d221a44d35a3d9ab7acf48f49cef2bed5c0b1337c024830490cd8e35d02604
|
7
|
+
data.tar.gz: c869fa3bac9c39a8d17ed4df89fe360cddf649d86135667ffce59d1402278e3e56eb14db2febf1f6e56899ce23c8d88e9339f4d10753e778a5df2036397a3145
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -23,6 +23,7 @@ require_relative 'endpoint'
|
|
23
23
|
require_relative 'reference'
|
24
24
|
|
25
25
|
require 'protocol/http/middleware'
|
26
|
+
require 'protocol/http/body/rewindable'
|
26
27
|
|
27
28
|
module Async
|
28
29
|
module HTTP
|
@@ -30,8 +31,28 @@ module Async
|
|
30
31
|
end
|
31
32
|
|
32
33
|
# A client wrapper which transparently handles both relative and absolute redirects to a given maximum number of hops.
|
34
|
+
#
|
35
|
+
# The best reference for these semantics is defined by the [Fetch specification](https://fetch.spec.whatwg.org/#http-redirect-fetch).
|
36
|
+
#
|
37
|
+
# | Redirect using GET | Permanent | Temporary |
|
38
|
+
# |:-----------------------------------------:|:---------:|:---------:|
|
39
|
+
# | Allowed | 301 | 302 |
|
40
|
+
# | Preserve original method | 308 | 307 |
|
41
|
+
#
|
42
|
+
# For the specific details of the redirect handling, see:
|
43
|
+
# - <https://datatracker.ietf.org/doc/html/rfc7231#section-6-4-2> 301 Moved Permanently.
|
44
|
+
# - <https://datatracker.ietf.org/doc/html/rfc7231#section-6-4-3> 302 Found.
|
45
|
+
# - <https://datatracker.ietf.org/doc/html/rfc7538 308 Permanent Redirect.
|
46
|
+
# - <https://datatracker.ietf.org/doc/html/rfc7231#section-6-4-7> 307 Temporary Redirect.
|
47
|
+
#
|
33
48
|
class RelativeLocation < ::Protocol::HTTP::Middleware
|
34
|
-
|
49
|
+
# Header keys which should be deleted when changing a request from a POST to a GET as defined by <https://fetch.spec.whatwg.org/#request-body-header-name>.
|
50
|
+
PROHIBITED_GET_HEADERS = [
|
51
|
+
'content-encoding',
|
52
|
+
'content-language',
|
53
|
+
'content-location',
|
54
|
+
'content-type',
|
55
|
+
]
|
35
56
|
|
36
57
|
# maximum_hops is the max number of redirects. Set to 0 to allow 1 request with no redirects.
|
37
58
|
def initialize(app, maximum_hops = 3)
|
@@ -43,20 +64,39 @@ module Async
|
|
43
64
|
# The maximum number of hops which will limit the number of redirects until an error is thrown.
|
44
65
|
attr :maximum_hops
|
45
66
|
|
67
|
+
def redirect_with_get?(request, response)
|
68
|
+
# We only want to switch to GET if the request method is something other than get, e.g. POST.
|
69
|
+
if request.method != GET
|
70
|
+
# According to the RFC, we should only switch to GET if the response is a 301 or 302:
|
71
|
+
return response.status == 301 || response.status == 302
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
46
75
|
def call(request)
|
47
|
-
|
76
|
+
# We don't want to follow redirects for HEAD requests:
|
77
|
+
return super if request.head?
|
78
|
+
|
79
|
+
if body = request.body
|
80
|
+
# We need to cache the body as it might be submitted multiple times if we get a response status of 307 or 308:
|
81
|
+
body = ::Protocol::HTTP::Body::Rewindable.new(body)
|
82
|
+
request.body = body
|
83
|
+
end
|
48
84
|
|
49
|
-
|
50
|
-
request.finish
|
85
|
+
hops = 0
|
51
86
|
|
52
87
|
while hops <= @maximum_hops
|
53
88
|
response = super(request)
|
54
89
|
|
55
90
|
if response.redirection?
|
56
91
|
hops += 1
|
92
|
+
|
93
|
+
# Get the redirect location:
|
94
|
+
unless location = response.headers['location']
|
95
|
+
return response
|
96
|
+
end
|
97
|
+
|
57
98
|
response.finish
|
58
99
|
|
59
|
-
location = response.headers['location']
|
60
100
|
uri = URI.parse(location)
|
61
101
|
|
62
102
|
if uri.absolute?
|
@@ -65,8 +105,21 @@ module Async
|
|
65
105
|
request.path = Reference[request.path] + location
|
66
106
|
end
|
67
107
|
|
68
|
-
|
69
|
-
|
108
|
+
if request.method == GET or response.preserve_method?
|
109
|
+
# We (might) need to rewind the body so that it can be submitted again:
|
110
|
+
body&.rewind
|
111
|
+
else
|
112
|
+
# We are changing the method to GET:
|
113
|
+
request.method = GET
|
114
|
+
|
115
|
+
# Clear the request body:
|
116
|
+
request.finish
|
117
|
+
body = nil
|
118
|
+
|
119
|
+
# Remove any headers which are not allowed in a GET request:
|
120
|
+
PROHIBITED_GET_HEADERS.each do |header|
|
121
|
+
request.headers.delete(header)
|
122
|
+
end
|
70
123
|
end
|
71
124
|
else
|
72
125
|
return response
|
data/lib/async/http/version.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.59.
|
4
|
+
version: 0.59.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -52,7 +52,7 @@ cert_chain:
|
|
52
52
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
53
53
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
54
54
|
-----END CERTIFICATE-----
|
55
|
-
date:
|
55
|
+
date: 2023-01-28 00:00:00.000000000 Z
|
56
56
|
dependencies:
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: async
|
@@ -102,14 +102,14 @@ dependencies:
|
|
102
102
|
requirements:
|
103
103
|
- - "~>"
|
104
104
|
- !ruby/object:Gem::Version
|
105
|
-
version: 0.23
|
105
|
+
version: '0.23'
|
106
106
|
type: :runtime
|
107
107
|
prerelease: false
|
108
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
110
|
- - "~>"
|
111
111
|
- !ruby/object:Gem::Version
|
112
|
-
version: 0.23
|
112
|
+
version: '0.23'
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: protocol-http1
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,7 +301,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
301
301
|
- !ruby/object:Gem::Version
|
302
302
|
version: '0'
|
303
303
|
requirements: []
|
304
|
-
rubygems_version: 3.
|
304
|
+
rubygems_version: 3.4.1
|
305
305
|
signing_key:
|
306
306
|
specification_version: 4
|
307
307
|
summary: A HTTP client and server library.
|
metadata.gz.sig
CHANGED
Binary file
|