do not pass around options after requests get initialized, instead rely on rquest options

This commit is contained in:
HoneyryderChuck 2021-08-04 17:06:24 +01:00
parent b126938a65
commit 29105854e3
11 changed files with 50 additions and 36 deletions

View File

@ -13,6 +13,9 @@ Layout/IndentHeredoc:
Style/HashSyntax:
Enabled: false
Style/AndOr:
Enabled: False
Naming/UncommunicativeMethodParamName:
Enabled: false

View File

@ -6,6 +6,9 @@ require: rubocop-performance
Style/HashSyntax:
Enabled: false
Style/AndOr:
Enabled: False
Naming/MethodParameterName:
Enabled: false

View File

@ -19,7 +19,7 @@ module WebMock
module InstanceMethods
private
def send_requests(*requests, options)
def send_requests(*requests)
request_signatures = requests.map do |request|
request_signature = _build_webmock_request_signature(request)
WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
@ -47,7 +47,7 @@ module WebMock
unless real_requests.empty?
reqs = real_requests.keys
reqs.zip(super(*reqs, options)).each do |req, res|
reqs.zip(super(*reqs)).each do |req, res|
idx = real_requests[req]
if WebMock::CallbackRegistry.any_callbacks?

View File

@ -40,12 +40,12 @@ module HTTPX
alias_method :digest_auth, :digest_authentication
def send_requests(*requests, options)
def send_requests(*requests)
requests.flat_map do |request|
digest = request.options.digest
if digest
probe_response = wrap { super(request, options).first }
probe_response = wrap { super(request).first }
if digest && !probe_response.is_a?(ErrorResponse) &&
probe_response.status == 401 && probe_response.headers.key?("www-authenticate") &&
@ -56,12 +56,12 @@ module HTTPX
token = digest.generate_header(request, probe_response)
request.headers["authorization"] = "Digest #{token}"
super(request, options)
super(request)
else
probe_response
end
else
super(request, options)
super(request)
end
end
end

View File

@ -24,15 +24,19 @@ module HTTPX
def call(connection, request, response)
connection.upgrade_to_h2c(request, response)
end
def extra_options(options)
options.merge(max_concurrent_requests: 1)
end
end
module InstanceMethods
def send_requests(*requests, options)
def send_requests(*requests)
upgrade_request, *remainder = requests
return super unless VALID_H2C_VERBS.include?(upgrade_request.verb) && upgrade_request.scheme == "http"
connection = pool.find_connection(upgrade_request.uri, @options.merge(options))
connection = pool.find_connection(upgrade_request.uri, upgrade_request.options)
return super if connection && connection.upgrade_protocol == :h2c
@ -42,7 +46,7 @@ module HTTPX
upgrade_request.headers["upgrade"] = "h2c"
upgrade_request.headers["http2-settings"] = HTTP2Next::Client.settings_header(upgrade_request.options.http2_settings)
super(upgrade_request, *remainder, options.merge(max_concurrent_requests: 1))
super(upgrade_request, *remainder)
end
end

View File

@ -34,13 +34,13 @@ module HTTPX
alias_method :ntlm_auth, :ntlm_authentication
def send_requests(*requests, options)
def send_requests(*requests)
requests.flat_map do |request|
ntlm = request.options.ntlm
if ntlm
request.headers["authorization"] = "NTLM #{NTLM.negotiate(domain: ntlm.domain).to_base64}"
probe_response = wrap { super(request, options).first }
probe_response = wrap { super(request).first }
if !probe_response.is_a?(ErrorResponse) && probe_response.status == 401 &&
probe_response.headers.key?("www-authenticate") &&
@ -52,12 +52,12 @@ module HTTPX
request.transition(:idle)
request.headers["authorization"] = "NTLM #{ntlm_challenge}"
super(request, options)
super(request)
else
probe_response
end
else
super(request, options)
super(request)
end
end
end

View File

@ -19,10 +19,14 @@ module HTTPX
end
module InstanceMethods
private
def request(*args, **options)
raise ArgumentError, "must perform at least one request" if args.empty?
def send_requests(*requests, options)
request_options = @options.merge(options)
requests = args.first.is_a?(Request) ? args : build_requests(*args, options)
request = requests.first or return super
request_options = request.options
return super unless request_options.proxy
@ -37,18 +41,21 @@ module HTTPX
if request_options.debug
ssh_options[:verbose] = request_options.debug_level == 2 ? :debug : :info
end
request_uri = URI(requests.first.uri)
@_gateway = Net::SSH::Gateway.new(ssh_uri.host, ssh_username, ssh_options)
begin
@_gateway.open(request_uri.host, request_uri.port) do |local_port|
io = build_gateway_socket(local_port, request_uri, request_options)
super(*requests, options.merge(io: io))
super(*args, **options.merge(io: io))
end
ensure
@_gateway.shutdown!
end
end
private
def build_gateway_socket(port, request_uri, options)
case request_uri.scheme
when "https"

View File

@ -6,7 +6,6 @@ module HTTPX
@request = request
@session = session
@connections = connections
@options = @request.options
end
def each(&block)
@ -72,7 +71,7 @@ module HTTPX
private
def response
@session.__send__(:receive_requests, [@request], @connections, @options) until @request.response
@session.__send__(:receive_requests, [@request], @connections) until @request.response
@request.response
end
@ -106,7 +105,7 @@ module HTTPX
request = requests.first
connections = _send_requests(requests, request.options)
connections = _send_requests(requests)
StreamResponse.new(request, self, connections)
end

View File

@ -223,7 +223,7 @@ module HTTPX
def unbounded_body?
return @unbounded_body if defined?(@unbounded_body)
@unbounded_body = (chunked? || @body.bytesize == Float::INFINITY)
@unbounded_body = !@body.nil? && (chunked? || @body.bytesize == Float::INFINITY)
end
def chunked?

View File

@ -32,7 +32,7 @@ module HTTPX
raise ArgumentError, "must perform at least one request" if args.empty?
requests = args.first.is_a?(Request) ? args : build_requests(*args, options)
responses = send_requests(*requests, options)
responses = send_requests(*requests)
return responses.first if responses.size == 1
responses
@ -174,37 +174,35 @@ module HTTPX
end
end
def send_requests(*requests, options)
request_options = @options.merge(options)
connections = _send_requests(requests, request_options)
receive_requests(requests, connections, request_options)
def send_requests(*requests)
connections = _send_requests(requests)
receive_requests(requests, connections)
end
def _send_requests(requests, options)
def _send_requests(requests)
connections = []
requests.each do |request|
error = catch(:resolve_error) do
connection = find_connection(request, connections, options)
connection = find_connection(request, connections, request.options)
connection.send(request)
end
next unless error.is_a?(ResolveError)
request.emit(:response, ErrorResponse.new(request, error, options))
request.emit(:response, ErrorResponse.new(request, error, request.options))
end
connections
end
def receive_requests(requests, connections, options)
def receive_requests(requests, connections)
responses = []
begin
# guarantee ordered responses
loop do
request = requests.first
pool.next_tick until (response = fetch_response(request, connections, options))
pool.next_tick until (response = fetch_response(request, connections, request.options))
responses << response
requests.shift
@ -218,7 +216,7 @@ module HTTPX
# opportunity to traverse the requests, hence we're returning only a fraction of the errors
# we were supposed to. This effectively fetches the existing responses and return them.
while (request = requests.shift)
responses << fetch_response(request, connections, options)
responses << fetch_response(request, connections, request.options)
end
break
end

View File

@ -49,10 +49,10 @@ module HTTPX
def build_connection: (URI::Generic, Options) -> Connection
def send_requests: (*Request, options) -> Array[response]
def send_requests: (*Request) -> Array[response]
def _send_requests: (Array[Request], Options) -> Array[Connection]
def _send_requests: (Array[Request]) -> Array[Connection]
def receive_requests: (Array[Request], Array[Connection], options) -> Array[response]
def receive_requests: (Array[Request], Array[Connection]) -> Array[response]
end
end