httpx 1.2.5 → 1.3.0
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/doc/release_notes/1_2_6.md +13 -0
- data/doc/release_notes/1_3_0.md +18 -0
- data/lib/httpx/adapters/datadog.rb +1 -1
- data/lib/httpx/adapters/faraday.rb +1 -0
- data/lib/httpx/adapters/webmock.rb +1 -1
- data/lib/httpx/connection/http1.rb +3 -2
- data/lib/httpx/connection/http2.rb +6 -6
- data/lib/httpx/connection.rb +11 -5
- data/lib/httpx/io/tcp.rb +1 -1
- data/lib/httpx/io/unix.rb +5 -3
- data/lib/httpx/options.rb +3 -7
- data/lib/httpx/parser/http1.rb +4 -0
- data/lib/httpx/plugins/aws_sigv4.rb +1 -1
- data/lib/httpx/plugins/cookies.rb +6 -6
- data/lib/httpx/plugins/follow_redirects.rb +44 -24
- data/lib/httpx/plugins/grpc.rb +3 -2
- data/lib/httpx/plugins/h2c.rb +1 -1
- data/lib/httpx/plugins/oauth.rb +1 -1
- data/lib/httpx/plugins/proxy/http.rb +2 -2
- data/lib/httpx/plugins/proxy/socks4.rb +1 -1
- data/lib/httpx/plugins/proxy/socks5.rb +1 -1
- data/lib/httpx/plugins/rate_limiter.rb +2 -0
- data/lib/httpx/plugins/ssrf_filter.rb +1 -1
- data/lib/httpx/request/body.rb +37 -41
- data/lib/httpx/request.rb +36 -10
- data/lib/httpx/resolver/https.rb +1 -1
- data/lib/httpx/resolver/native.rb +26 -8
- data/lib/httpx/resolver/resolver.rb +1 -1
- data/lib/httpx/response.rb +2 -2
- data/lib/httpx/session.rb +20 -17
- data/lib/httpx/timers.rb +1 -1
- data/lib/httpx/transcoder/multipart/encoder.rb +1 -1
- data/lib/httpx/version.rb +1 -1
- data/sig/chainable.rbs +2 -2
- data/sig/connection/http1.rbs +2 -2
- data/sig/connection/http2.rbs +17 -17
- data/sig/connection.rbs +7 -6
- data/sig/httpx.rbs +3 -3
- data/sig/io/ssl.rbs +1 -0
- data/sig/io/tcp.rbs +1 -1
- data/sig/io/unix.rbs +18 -1
- data/sig/options.rbs +5 -14
- data/sig/parser/http1.rbs +1 -1
- data/sig/plugins/callbacks.rbs +1 -1
- data/sig/plugins/follow_redirects.rbs +10 -5
- data/sig/plugins/grpc.rbs +5 -0
- data/sig/plugins/proxy/http.rbs +3 -0
- data/sig/plugins/proxy/socks4.rbs +5 -2
- data/sig/plugins/proxy/socks5.rbs +5 -2
- data/sig/plugins/push_promise.rbs +3 -3
- data/sig/plugins/rate_limiter.rbs +1 -1
- data/sig/plugins/retries.rbs +2 -0
- data/sig/request/body.rbs +1 -3
- data/sig/request.rbs +2 -1
- data/sig/resolver/https.rbs +1 -1
- data/sig/resolver/native.rbs +2 -0
- data/sig/resolver/resolver.rbs +1 -1
- data/sig/response.rbs +1 -1
- data/sig/session.rbs +10 -7
- data/sig/transcoder/multipart.rbs +11 -6
- data/sig/transcoder/xml.rbs +1 -0
- data/sig/utils.rbs +4 -0
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99138c8286fb426f6bd70a62357cbaf1b54f3ceb030f1ff3c78c9e2bffd8e75a
|
4
|
+
data.tar.gz: 59a28cbadff4830ed047eba007b5f71455b5a8d6aa3e111cfb5897b82b1350fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78b08826c993b9a2c5d1164a2bf6c7bb4123cb9599a1ddc44bd38b827c91da73abf4fee18ae39d67f9370834b3a8d04eb32999cf2c68f9fe654a0605e6d7ca5b
|
7
|
+
data.tar.gz: 6b22a1e473abc7967314785f6fb517bf5d663d87951a7a2cba5855913a348b95dc50e2fddaa801fbcf25aef96b4d7d9b4e4d0dda8388696c0b628ba0c5dd7c1b
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# 1.2.6
|
2
|
+
|
3
|
+
## Improvements
|
4
|
+
|
5
|
+
* `native` resolver: when timing out on DNS query for an alias, retry the DNS query for the alias (instead of the original hostname).
|
6
|
+
|
7
|
+
## Bugfixes
|
8
|
+
|
9
|
+
* `faraday` adapter: set `env` options on the request object, so they are available in the request object when yielded.
|
10
|
+
* `follow_redirects` plugin: remove body-related headers (`content-length`, `content-type`) on POST-to-GET redirects.
|
11
|
+
* `follow_redirects` plugin: maintain verb (and body) of original request when the response status code is 307.
|
12
|
+
* `native` resolver: when timing out on TCP-based name resolution, downgrade to UDP before retrying.
|
13
|
+
* `rate_limiter` plugin: do not try fetching the retry-after of error responses.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# 1.3.0
|
2
|
+
|
3
|
+
## Dependencies
|
4
|
+
|
5
|
+
`http-2` v1.0.0 is replacing `http-2-next` as the HTTP/2 parser.
|
6
|
+
|
7
|
+
`http-2-next` was forked from `http-2` 5 years ago; its improvements have been merged back to `http-2` recently though, so `http-2-next` willl therefore no longer be maintained.
|
8
|
+
|
9
|
+
## Improvements
|
10
|
+
|
11
|
+
Request-specific options (`:params`, `:form`, `:json` and `:xml`) are now separately kept by the request, which allows them to share `HTTPX::Options`, and reduce the number of copying / allocations.
|
12
|
+
|
13
|
+
This means that `HTTPX::Options` will throw an error if you initialize an object which such keys; this should not happen, as this class is considered internal and you should not be using it directly.
|
14
|
+
|
15
|
+
## Fixes
|
16
|
+
|
17
|
+
* support for the `datadog` gem v2.0.0 in its adapter has been unblocked, now that the gem has been released.
|
18
|
+
* loading the `:cookies` plugin was making the `Session#build_request` private.
|
@@ -142,7 +142,7 @@ module Datadog::Tracing
|
|
142
142
|
@configuration ||= Datadog.configuration.tracing[:httpx, @request.uri.host]
|
143
143
|
end
|
144
144
|
|
145
|
-
if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0
|
145
|
+
if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0")
|
146
146
|
def propagate_trace_http(digest, headers)
|
147
147
|
Datadog::Tracing::Contrib::HTTP.inject(digest, headers)
|
148
148
|
end
|
@@ -15,7 +15,7 @@ module HTTPX
|
|
15
15
|
attr_accessor :max_concurrent_requests
|
16
16
|
|
17
17
|
def initialize(buffer, options)
|
18
|
-
@options =
|
18
|
+
@options = options
|
19
19
|
@max_concurrent_requests = @options.max_concurrent_requests || MAX_REQUESTS
|
20
20
|
@max_requests = @options.max_requests
|
21
21
|
@parser = Parser::HTTP1.new(self)
|
@@ -146,7 +146,7 @@ module HTTPX
|
|
146
146
|
|
147
147
|
response << chunk
|
148
148
|
rescue StandardError => e
|
149
|
-
error_response = ErrorResponse.new(request, e
|
149
|
+
error_response = ErrorResponse.new(request, e)
|
150
150
|
request.response = error_response
|
151
151
|
dispatch
|
152
152
|
end
|
@@ -387,6 +387,7 @@ module HTTPX
|
|
387
387
|
UPCASED = {
|
388
388
|
"www-authenticate" => "WWW-Authenticate",
|
389
389
|
"http2-settings" => "HTTP2-Settings",
|
390
|
+
"content-md5" => "Content-MD5",
|
390
391
|
}.freeze
|
391
392
|
|
392
393
|
def capitalized(field)
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "securerandom"
|
4
|
-
require "http/2
|
4
|
+
require "http/2"
|
5
5
|
|
6
6
|
module HTTPX
|
7
7
|
class Connection::HTTP2
|
8
8
|
include Callbacks
|
9
9
|
include Loggable
|
10
10
|
|
11
|
-
MAX_CONCURRENT_REQUESTS =
|
11
|
+
MAX_CONCURRENT_REQUESTS = ::HTTP2::DEFAULT_MAX_CONCURRENT_STREAMS
|
12
12
|
|
13
13
|
class Error < Error
|
14
14
|
def initialize(id, code)
|
@@ -25,7 +25,7 @@ module HTTPX
|
|
25
25
|
attr_reader :streams, :pending
|
26
26
|
|
27
27
|
def initialize(buffer, options)
|
28
|
-
@options =
|
28
|
+
@options = options
|
29
29
|
@settings = @options.http2_settings
|
30
30
|
@pending = []
|
31
31
|
@streams = {}
|
@@ -111,7 +111,7 @@ module HTTPX
|
|
111
111
|
end
|
112
112
|
handle(request, stream)
|
113
113
|
true
|
114
|
-
rescue
|
114
|
+
rescue ::HTTP2::Error::StreamLimitExceeded
|
115
115
|
@pending.unshift(request)
|
116
116
|
end
|
117
117
|
|
@@ -168,7 +168,7 @@ module HTTPX
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def init_connection
|
171
|
-
@connection =
|
171
|
+
@connection = ::HTTP2::Client.new(@settings)
|
172
172
|
@connection.on(:frame, &method(:on_frame))
|
173
173
|
@connection.on(:frame_sent, &method(:on_frame_sent))
|
174
174
|
@connection.on(:frame_received, &method(:on_frame_received))
|
@@ -309,7 +309,7 @@ module HTTPX
|
|
309
309
|
if error
|
310
310
|
ex = Error.new(stream.id, error)
|
311
311
|
ex.set_backtrace(caller)
|
312
|
-
response = ErrorResponse.new(request, ex
|
312
|
+
response = ErrorResponse.new(request, ex)
|
313
313
|
request.response = response
|
314
314
|
emit(:response, request, response)
|
315
315
|
else
|
data/lib/httpx/connection.rb
CHANGED
@@ -48,6 +48,8 @@ module HTTPX
|
|
48
48
|
attr_accessor :family
|
49
49
|
|
50
50
|
def initialize(uri, options)
|
51
|
+
@origins = [uri.origin]
|
52
|
+
@origin = Utils.to_uri(uri.origin)
|
51
53
|
@options = Options.new(options)
|
52
54
|
@type = initialize_type(uri, @options)
|
53
55
|
@origins = [uri.origin]
|
@@ -337,7 +339,7 @@ module HTTPX
|
|
337
339
|
#
|
338
340
|
loop do
|
339
341
|
siz = @io.read(@window_size, @read_buffer)
|
340
|
-
log(level: 3, color: :cyan) { "IO READ: #{siz} bytes..." }
|
342
|
+
log(level: 3, color: :cyan) { "IO READ: #{siz} bytes... (wsize: #{@window_size}, rbuffer: #{@read_buffer.bytesize})" }
|
341
343
|
unless siz
|
342
344
|
ex = EOFError.new("descriptor closed")
|
343
345
|
ex.set_backtrace(caller)
|
@@ -504,7 +506,7 @@ module HTTPX
|
|
504
506
|
when MisdirectedRequestError
|
505
507
|
emit(:misdirected, request)
|
506
508
|
else
|
507
|
-
response = ErrorResponse.new(request, ex
|
509
|
+
response = ErrorResponse.new(request, ex)
|
508
510
|
request.response = response
|
509
511
|
request.emit(:response, response)
|
510
512
|
end
|
@@ -530,7 +532,7 @@ module HTTPX
|
|
530
532
|
connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, error) : handle_error(error)
|
531
533
|
@state = :closed
|
532
534
|
emit(:close)
|
533
|
-
rescue TLSError,
|
535
|
+
rescue TLSError, ::HTTP2::Error::ProtocolError, ::HTTP2::Error::HandshakeError => e
|
534
536
|
# connect errors, exit gracefully
|
535
537
|
handle_error(e)
|
536
538
|
connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, e) : handle_error(e)
|
@@ -626,7 +628,11 @@ module HTTPX
|
|
626
628
|
end
|
627
629
|
end
|
628
630
|
when "unix"
|
629
|
-
|
631
|
+
path = Array(addrs).first
|
632
|
+
|
633
|
+
path = String(path) if path
|
634
|
+
|
635
|
+
UNIX.new(@origin, path, @options)
|
630
636
|
else
|
631
637
|
raise Error, "unsupported transport (#{@type})"
|
632
638
|
end
|
@@ -653,7 +659,7 @@ module HTTPX
|
|
653
659
|
def handle_error(error)
|
654
660
|
parser.handle_error(error) if @parser && parser.respond_to?(:handle_error)
|
655
661
|
while (request = @pending.shift)
|
656
|
-
response = ErrorResponse.new(request, error
|
662
|
+
response = ErrorResponse.new(request, error)
|
657
663
|
request.response = response
|
658
664
|
request.emit(:response, response)
|
659
665
|
end
|
data/lib/httpx/io/tcp.rb
CHANGED
data/lib/httpx/io/unix.rb
CHANGED
@@ -8,11 +8,11 @@ module HTTPX
|
|
8
8
|
|
9
9
|
alias_method :host, :path
|
10
10
|
|
11
|
-
def initialize(origin,
|
11
|
+
def initialize(origin, path, options)
|
12
12
|
@addresses = []
|
13
13
|
@hostname = origin.host
|
14
14
|
@state = :idle
|
15
|
-
@options =
|
15
|
+
@options = options
|
16
16
|
@fallback_protocol = @options.fallback_protocol
|
17
17
|
if @options.io
|
18
18
|
@io = case @options.io
|
@@ -26,8 +26,10 @@ module HTTPX
|
|
26
26
|
@path = @io.path
|
27
27
|
@keep_open = true
|
28
28
|
@state = :connected
|
29
|
+
elsif path
|
30
|
+
@path = path
|
29
31
|
else
|
30
|
-
|
32
|
+
raise Error, "No path given where to store the socket"
|
31
33
|
end
|
32
34
|
@io ||= build_socket
|
33
35
|
end
|
data/lib/httpx/options.rb
CHANGED
@@ -91,7 +91,7 @@ module HTTPX
|
|
91
91
|
# :debug :: an object which log messages are written to (must respond to <tt><<</tt>)
|
92
92
|
# :debug_level :: the log level of messages (can be 1, 2, or 3).
|
93
93
|
# :ssl :: a hash of options which can be set as params of OpenSSL::SSL::SSLContext (see HTTPX::IO::SSL)
|
94
|
-
# :http2_settings :: a hash of options to be passed to a
|
94
|
+
# :http2_settings :: a hash of options to be passed to a HTTP2::Connection (ex: <tt>{ max_concurrent_streams: 2 }</tt>)
|
95
95
|
# :fallback_protocol :: version of HTTP protocol to use by default in the absence of protocol negotiation
|
96
96
|
# like ALPN (defaults to <tt>"http/1.1"</tt>)
|
97
97
|
# :supported_compression_formats :: list of compressions supported by the transcoder layer (defaults to <tt>%w[gzip deflate]</tt>).
|
@@ -124,10 +124,6 @@ module HTTPX
|
|
124
124
|
# :base_path :: path to prefix given relative paths with (ex: "/v2")
|
125
125
|
# :max_concurrent_requests :: max number of requests which can be set concurrently
|
126
126
|
# :max_requests :: max number of requests which can be made on socket before it reconnects.
|
127
|
-
# :params :: hash or array of key-values which will be encoded and set in the query string of request uris.
|
128
|
-
# :form :: hash of array of key-values which will be form-or-multipart-encoded in requests body payload.
|
129
|
-
# :json :: hash of array of key-values which will be JSON-encoded in requests body payload.
|
130
|
-
# :xml :: Nokogiri XML nodes which will be encoded in requests body payload.
|
131
127
|
#
|
132
128
|
# This list of options are enhanced with each loaded plugin, see the plugin docs for details.
|
133
129
|
def initialize(options = {})
|
@@ -216,7 +212,7 @@ module HTTPX
|
|
216
212
|
end
|
217
213
|
|
218
214
|
%i[
|
219
|
-
|
215
|
+
ssl http2_settings
|
220
216
|
request_class response_class headers_class request_body_class
|
221
217
|
response_body_class connection_class options_class
|
222
218
|
io fallback_protocol debug debug_level resolver_class resolver_options
|
@@ -228,7 +224,7 @@ module HTTPX
|
|
228
224
|
OUT
|
229
225
|
end
|
230
226
|
|
231
|
-
REQUEST_BODY_IVARS = %i[@headers
|
227
|
+
REQUEST_BODY_IVARS = %i[@headers].freeze
|
232
228
|
|
233
229
|
def ==(other)
|
234
230
|
super || options_equals?(other)
|
data/lib/httpx/parser/http1.rb
CHANGED
@@ -75,6 +75,7 @@ module HTTPX
|
|
75
75
|
buffer = @buffer
|
76
76
|
|
77
77
|
while (idx = buffer.index("\n"))
|
78
|
+
# @type var line: String
|
78
79
|
line = buffer.byteslice(0..idx)
|
79
80
|
raise Error, "wrong header format" if line.start_with?("\s", "\t")
|
80
81
|
|
@@ -101,9 +102,11 @@ module HTTPX
|
|
101
102
|
separator_index = line.index(":")
|
102
103
|
raise Error, "wrong header format" unless separator_index
|
103
104
|
|
105
|
+
# @type var key: String
|
104
106
|
key = line.byteslice(0..(separator_index - 1))
|
105
107
|
|
106
108
|
key.rstrip! # was lstripped previously!
|
109
|
+
# @type var value: String
|
107
110
|
value = line.byteslice((separator_index + 1)..-1)
|
108
111
|
value.strip!
|
109
112
|
raise Error, "wrong header format" if value.nil?
|
@@ -118,6 +121,7 @@ module HTTPX
|
|
118
121
|
@observer.on_data(chunk)
|
119
122
|
end
|
120
123
|
elsif @content_length
|
124
|
+
# @type var data: String
|
121
125
|
data = @buffer.byteslice(0, @content_length)
|
122
126
|
@buffer = @buffer.byteslice(@content_length..-1) || "".b
|
123
127
|
@content_length -= data.bytesize
|
@@ -40,6 +40,12 @@ module HTTPX
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def build_request(*)
|
44
|
+
request = super
|
45
|
+
request.headers.set_cookie(request.options.cookies[request.uri])
|
46
|
+
request
|
47
|
+
end
|
48
|
+
|
43
49
|
private
|
44
50
|
|
45
51
|
def on_response(_request, response)
|
@@ -52,12 +58,6 @@ module HTTPX
|
|
52
58
|
|
53
59
|
super
|
54
60
|
end
|
55
|
-
|
56
|
-
def build_request(*, _)
|
57
|
-
request = super
|
58
|
-
request.headers.set_cookie(request.options.cookies[request.uri])
|
59
|
-
request
|
60
|
-
end
|
61
61
|
end
|
62
62
|
|
63
63
|
module HeadersMethods
|
@@ -16,6 +16,7 @@ module HTTPX
|
|
16
16
|
module FollowRedirects
|
17
17
|
MAX_REDIRECTS = 3
|
18
18
|
REDIRECT_STATUS = (300..399).freeze
|
19
|
+
REQUEST_BODY_HEADERS = %w[transfer-encoding content-encoding content-type content-length content-language content-md5 trailer].freeze
|
19
20
|
|
20
21
|
using URIExtensions
|
21
22
|
|
@@ -60,7 +61,6 @@ module HTTPX
|
|
60
61
|
return response unless REDIRECT_STATUS.include?(response.status) && response.headers.key?("location")
|
61
62
|
return response unless max_redirects.positive?
|
62
63
|
|
63
|
-
# build redirect request
|
64
64
|
redirect_uri = __get_location_from_response(response)
|
65
65
|
|
66
66
|
if options.redirect_on
|
@@ -68,25 +68,43 @@ module HTTPX
|
|
68
68
|
return response unless redirect_allowed
|
69
69
|
end
|
70
70
|
|
71
|
+
# build redirect request
|
72
|
+
request_body = redirect_request.body
|
73
|
+
redirect_method = "GET"
|
74
|
+
redirect_params = {}
|
75
|
+
|
71
76
|
if response.status == 305 && options.respond_to?(:proxy)
|
77
|
+
request_body.rewind
|
72
78
|
# The requested resource MUST be accessed through the proxy given by
|
73
79
|
# the Location field. The Location field gives the URI of the proxy.
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
80
|
+
redirect_options = options.merge(headers: redirect_request.headers,
|
81
|
+
proxy: { uri: redirect_uri },
|
82
|
+
max_redirects: max_redirects - 1)
|
83
|
+
|
84
|
+
redirect_params[:body] = request_body
|
78
85
|
redirect_uri = redirect_request.uri
|
79
|
-
options =
|
86
|
+
options = redirect_options
|
80
87
|
else
|
81
88
|
redirect_headers = redirect_request_headers(redirect_request.uri, redirect_uri, request.headers, options)
|
89
|
+
redirect_opts = Hash[options]
|
90
|
+
redirect_params[:max_redirects] = max_redirects - 1
|
91
|
+
|
92
|
+
unless request_body.empty?
|
93
|
+
if response.status == 307
|
94
|
+
# The method and the body of the original request are reused to perform the redirected request.
|
95
|
+
redirect_method = redirect_request.verb
|
96
|
+
request_body.rewind
|
97
|
+
redirect_params[:body] = request_body
|
98
|
+
else
|
99
|
+
# redirects are **ALWAYS** GET, so remove body-related headers
|
100
|
+
REQUEST_BODY_HEADERS.each do |h|
|
101
|
+
redirect_headers.delete(h)
|
102
|
+
end
|
103
|
+
redirect_params[:body] = nil
|
104
|
+
end
|
105
|
+
end
|
82
106
|
|
83
|
-
|
84
|
-
retry_opts = Hash[options].merge(
|
85
|
-
headers: redirect_headers.to_h,
|
86
|
-
body: redirect_request.body,
|
87
|
-
max_redirects: max_redirects - 1
|
88
|
-
)
|
89
|
-
retry_options = options.class.new(retry_opts)
|
107
|
+
options = options.class.new(redirect_opts.merge(headers: redirect_headers.to_h))
|
90
108
|
end
|
91
109
|
|
92
110
|
redirect_uri = Utils.to_uri(redirect_uri)
|
@@ -96,26 +114,26 @@ module HTTPX
|
|
96
114
|
redirect_uri.scheme == "http"
|
97
115
|
error = InsecureRedirectError.new(redirect_uri.to_s)
|
98
116
|
error.set_backtrace(caller)
|
99
|
-
return ErrorResponse.new(request, error
|
117
|
+
return ErrorResponse.new(request, error)
|
100
118
|
end
|
101
119
|
|
102
|
-
retry_request = build_request(
|
120
|
+
retry_request = build_request(redirect_method, redirect_uri, redirect_params, options)
|
103
121
|
|
104
122
|
request.redirect_request = retry_request
|
105
123
|
|
106
|
-
|
124
|
+
redirect_after = response.headers["retry-after"]
|
107
125
|
|
108
|
-
if
|
126
|
+
if redirect_after
|
109
127
|
# Servers send the "Retry-After" header field to indicate how long the
|
110
128
|
# user agent ought to wait before making a follow-up request.
|
111
129
|
# When sent with any 3xx (Redirection) response, Retry-After indicates
|
112
130
|
# the minimum time that the user agent is asked to wait before issuing
|
113
131
|
# the redirected request.
|
114
132
|
#
|
115
|
-
|
133
|
+
redirect_after = Utils.parse_retry_after(redirect_after)
|
116
134
|
|
117
|
-
log { "redirecting after #{
|
118
|
-
pool.after(
|
135
|
+
log { "redirecting after #{redirect_after} secs..." }
|
136
|
+
pool.after(redirect_after) do
|
119
137
|
send_request(retry_request, connections, options)
|
120
138
|
end
|
121
139
|
else
|
@@ -125,19 +143,21 @@ module HTTPX
|
|
125
143
|
end
|
126
144
|
|
127
145
|
def redirect_request_headers(original_uri, redirect_uri, headers, options)
|
146
|
+
headers = headers.dup
|
147
|
+
|
128
148
|
return headers if options.allow_auth_to_other_origins
|
129
149
|
|
130
150
|
return headers unless headers.key?("authorization")
|
131
151
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
152
|
+
return headers if original_uri.origin == redirect_uri.origin
|
153
|
+
|
154
|
+
headers.delete("authorization")
|
136
155
|
|
137
156
|
headers
|
138
157
|
end
|
139
158
|
|
140
159
|
def __get_location_from_response(response)
|
160
|
+
# @type var location_uri: http_uri
|
141
161
|
location_uri = URI(response.headers["location"])
|
142
162
|
location_uri = response.uri.merge(location_uri) if location_uri.relative?
|
143
163
|
location_uri
|
data/lib/httpx/plugins/grpc.rb
CHANGED
@@ -110,10 +110,10 @@ module HTTPX
|
|
110
110
|
end
|
111
111
|
|
112
112
|
module RequestBodyMethods
|
113
|
-
def initialize(
|
113
|
+
def initialize(*, **)
|
114
114
|
super
|
115
115
|
|
116
|
-
if (compression = headers["grpc-encoding"])
|
116
|
+
if (compression = @headers["grpc-encoding"])
|
117
117
|
deflater_body = self.class.initialize_deflater_body(@body, compression)
|
118
118
|
@body = Transcoder::GRPCEncoding.encode(deflater_body || @body, compressed: !deflater_body.nil?)
|
119
119
|
else
|
@@ -124,6 +124,7 @@ module HTTPX
|
|
124
124
|
|
125
125
|
module InstanceMethods
|
126
126
|
def with_channel_credentials(ca_path, key = nil, cert = nil, **ssl_opts)
|
127
|
+
# @type var ssl_params: ::Hash[::Symbol, untyped]
|
127
128
|
ssl_params = {
|
128
129
|
**ssl_opts,
|
129
130
|
ca_file: ca_path,
|
data/lib/httpx/plugins/h2c.rb
CHANGED
@@ -39,7 +39,7 @@ module HTTPX
|
|
39
39
|
upgrade_request.headers.add("connection", "upgrade")
|
40
40
|
upgrade_request.headers.add("connection", "http2-settings")
|
41
41
|
upgrade_request.headers["upgrade"] = "h2c"
|
42
|
-
upgrade_request.headers["http2-settings"] =
|
42
|
+
upgrade_request.headers["http2-settings"] = ::HTTP2::Client.settings_header(upgrade_request.options.http2_settings)
|
43
43
|
|
44
44
|
super(upgrade_request, *remainder)
|
45
45
|
end
|
data/lib/httpx/plugins/oauth.rb
CHANGED
@@ -155,7 +155,7 @@ module HTTPX
|
|
155
155
|
with(oauth_session: oauth_session.merge(access_token: access_token, refresh_token: refresh_token))
|
156
156
|
end
|
157
157
|
|
158
|
-
def build_request(
|
158
|
+
def build_request(*)
|
159
159
|
request = super
|
160
160
|
|
161
161
|
return request if request.headers.key?("authorization")
|
@@ -100,7 +100,7 @@ module HTTPX
|
|
100
100
|
|
101
101
|
error = ServerSideRequestForgeryError.new("#{request.uri} URI scheme not allowed")
|
102
102
|
error.set_backtrace(caller)
|
103
|
-
response = ErrorResponse.new(request, error
|
103
|
+
response = ErrorResponse.new(request, error)
|
104
104
|
request.emit(:response, response)
|
105
105
|
response
|
106
106
|
end
|