From 29105854e34fd287e06f2b8b8ab005c938a0e376 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Wed, 4 Aug 2021 17:06:24 +0100 Subject: [PATCH] do not pass around options after requests get initialized, instead rely on rquest options --- .rubocop-2.1.yml | 3 +++ .rubocop-2.3.yml | 3 +++ lib/httpx/adapters/webmock.rb | 4 ++-- lib/httpx/plugins/digest_authentication.rb | 8 ++++---- lib/httpx/plugins/h2c.rb | 10 +++++++--- lib/httpx/plugins/ntlm_authentication.rb | 8 ++++---- lib/httpx/plugins/proxy/ssh.rb | 15 +++++++++++---- lib/httpx/plugins/stream.rb | 5 ++--- lib/httpx/request.rb | 2 +- lib/httpx/session.rb | 22 ++++++++++------------ sig/session.rbs | 6 +++--- 11 files changed, 50 insertions(+), 36 deletions(-) diff --git a/.rubocop-2.1.yml b/.rubocop-2.1.yml index 30f54cd7..419c7aff 100644 --- a/.rubocop-2.1.yml +++ b/.rubocop-2.1.yml @@ -13,6 +13,9 @@ Layout/IndentHeredoc: Style/HashSyntax: Enabled: false +Style/AndOr: + Enabled: False + Naming/UncommunicativeMethodParamName: Enabled: false diff --git a/.rubocop-2.3.yml b/.rubocop-2.3.yml index 446cb5c3..e44e61a3 100644 --- a/.rubocop-2.3.yml +++ b/.rubocop-2.3.yml @@ -6,6 +6,9 @@ require: rubocop-performance Style/HashSyntax: Enabled: false +Style/AndOr: + Enabled: False + Naming/MethodParameterName: Enabled: false diff --git a/lib/httpx/adapters/webmock.rb b/lib/httpx/adapters/webmock.rb index 26b7fe2c..c85de21b 100644 --- a/lib/httpx/adapters/webmock.rb +++ b/lib/httpx/adapters/webmock.rb @@ -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? diff --git a/lib/httpx/plugins/digest_authentication.rb b/lib/httpx/plugins/digest_authentication.rb index ea12f1c6..44fa13af 100644 --- a/lib/httpx/plugins/digest_authentication.rb +++ b/lib/httpx/plugins/digest_authentication.rb @@ -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 diff --git a/lib/httpx/plugins/h2c.rb b/lib/httpx/plugins/h2c.rb index 79487a86..bd7b84b0 100644 --- a/lib/httpx/plugins/h2c.rb +++ b/lib/httpx/plugins/h2c.rb @@ -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 diff --git a/lib/httpx/plugins/ntlm_authentication.rb b/lib/httpx/plugins/ntlm_authentication.rb index 9432cb61..5940bc61 100644 --- a/lib/httpx/plugins/ntlm_authentication.rb +++ b/lib/httpx/plugins/ntlm_authentication.rb @@ -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 diff --git a/lib/httpx/plugins/proxy/ssh.rb b/lib/httpx/plugins/proxy/ssh.rb index 9a003063..761ec2a9 100644 --- a/lib/httpx/plugins/proxy/ssh.rb +++ b/lib/httpx/plugins/proxy/ssh.rb @@ -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" diff --git a/lib/httpx/plugins/stream.rb b/lib/httpx/plugins/stream.rb index 1b20d9de..5888cdc7 100644 --- a/lib/httpx/plugins/stream.rb +++ b/lib/httpx/plugins/stream.rb @@ -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 diff --git a/lib/httpx/request.rb b/lib/httpx/request.rb index 310450e9..b4ddb385 100644 --- a/lib/httpx/request.rb +++ b/lib/httpx/request.rb @@ -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? diff --git a/lib/httpx/session.rb b/lib/httpx/session.rb index 0985f0b0..95041f67 100644 --- a/lib/httpx/session.rb +++ b/lib/httpx/session.rb @@ -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 diff --git a/sig/session.rbs b/sig/session.rbs index 8faa52e9..6be9fef9 100644 --- a/sig/session.rbs +++ b/sig/session.rbs @@ -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 \ No newline at end of file