From e29a91e7f7c2699cf13157803d346eec4ab8bec2 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Sun, 5 Nov 2023 00:36:13 +0000 Subject: [PATCH] move session callbacks to plugin --- lib/httpx/chainable.rb | 19 --------- lib/httpx/plugins/callbacks.rb | 67 ++++++++++++++++++++++++++++++ lib/httpx/plugins/proxy/socks4.rb | 2 +- lib/httpx/plugins/proxy/socks5.rb | 2 +- lib/httpx/session.rb | 41 +++--------------- sig/chainable.rbs | 1 + sig/plugins/callbacks.rbs | 31 ++++++++++++++ sig/session.rbs | 2 + test/support/requests/callbacks.rb | 12 +++--- 9 files changed, 116 insertions(+), 61 deletions(-) create mode 100644 lib/httpx/plugins/callbacks.rb create mode 100644 sig/plugins/callbacks.rbs diff --git a/lib/httpx/chainable.rb b/lib/httpx/chainable.rb index a440df96..1a7e8554 100644 --- a/lib/httpx/chainable.rb +++ b/lib/httpx/chainable.rb @@ -10,19 +10,6 @@ module HTTPX MOD end - %i[ - connection_opened connection_closed - request_error - request_started request_body_chunk request_completed - response_started response_body_chunk response_completed - ].each do |meth| - class_eval(<<-MOD, __FILE__, __LINE__ + 1) - def on_#{meth}(&blk) # def on_connection_opened(&blk) - on(:#{meth}, &blk) # on(:connection_opened, &blk) - end # end - MOD - end - def request(*args, **options) branch(default_options).request(*args, **options) end @@ -46,12 +33,6 @@ module HTTPX branch(default_options.merge(options), &blk) end - protected - - def on(*args, &blk) - branch(default_options).on(*args, &blk) - end - private def default_options diff --git a/lib/httpx/plugins/callbacks.rb b/lib/httpx/plugins/callbacks.rb new file mode 100644 index 00000000..9ce4fed6 --- /dev/null +++ b/lib/httpx/plugins/callbacks.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +module HTTPX + module Plugins + module Callbacks + module InstanceMethods + include HTTPX::Callbacks + + %i[ + connection_opened connection_closed + request_error + request_started request_body_chunk request_completed + response_started response_body_chunk response_completed + ].each do |meth| + class_eval(<<-MOD, __FILE__, __LINE__ + 1) + def on_#{meth}(&blk) # def on_connection_opened(&blk) + on(:#{meth}, &blk) # on(:connection_opened, &blk) + end # end + MOD + end + + private + + def init_connection(type, uri, options) + connection = super + connection.on(:open) do + emit(:connection_opened, connection.origin, connection.io.socket) + end + connection.on(:close) do + emit(:connection_closed, connection.origin) if connection.used? + end + + connection + end + + def set_request_callbacks(request) + super + + request.on(:headers) do + emit(:request_started, request) + end + request.on(:body_chunk) do |chunk| + emit(:request_body_chunk, request, chunk) + end + request.on(:done) do + emit(:request_completed, request) + end + + request.on(:response_started) do |res| + if res.is_a?(Response) + emit(:response_started, request, res) + res.on(:chunk_received) do |chunk| + emit(:response_body_chunk, request, res, chunk) + end + else + emit(:request_error, request, res.error) + end + end + request.on(:response) do |res| + emit(:response_completed, request, res) + end + end + end + end + register_plugin :callbacks, Callbacks + end +end diff --git a/lib/httpx/plugins/proxy/socks4.rb b/lib/httpx/plugins/proxy/socks4.rb index d5435a18..e6688202 100644 --- a/lib/httpx/plugins/proxy/socks4.rb +++ b/lib/httpx/plugins/proxy/socks4.rb @@ -85,7 +85,7 @@ module HTTPX end class SocksParser - include Callbacks + include HTTPX::Callbacks def initialize(buffer, options) @buffer = buffer diff --git a/lib/httpx/plugins/proxy/socks5.rb b/lib/httpx/plugins/proxy/socks5.rb index cf7f0b1c..7e72823e 100644 --- a/lib/httpx/plugins/proxy/socks5.rb +++ b/lib/httpx/plugins/proxy/socks5.rb @@ -137,7 +137,7 @@ module HTTPX end class SocksParser - include Callbacks + include HTTPX::Callbacks def initialize(buffer, options) @buffer = buffer diff --git a/lib/httpx/session.rb b/lib/httpx/session.rb index adc93415..29715993 100644 --- a/lib/httpx/session.rb +++ b/lib/httpx/session.rb @@ -8,7 +8,6 @@ module HTTPX class Session include Loggable include Chainable - include Callbacks EMPTY_HASH = {}.freeze @@ -85,33 +84,7 @@ module HTTPX options = @options.merge(options) unless options.is_a?(Options) request = rklass.new(verb, uri, options) request.persistent = @persistent - request.on(:response, &method(:on_response).curry(2)[request]) - request.on(:promise, &method(:on_promise)) - - request.on(:headers) do - emit(:request_started, request) - end - request.on(:body_chunk) do |chunk| - emit(:request_body_chunk, request, chunk) - end - request.on(:done) do - emit(:request_completed, request) - end - - request.on(:response_started) do |res| - if res.is_a?(Response) - emit(:response_started, request, res) - res.on(:chunk_received) do |chunk| - emit(:response_body_chunk, request, res, chunk) - end - else - emit(:request_error, request, res.error) - end - end - request.on(:response) do |res| - emit(:response_completed, request, res) - end - + set_request_callbacks(request) request end @@ -236,6 +209,11 @@ module HTTPX requests end + def set_request_callbacks(request) + request.on(:response, &method(:on_response).curry(2)[request]) + request.on(:promise, &method(:on_promise)) + end + # returns a new HTTPX::Connection object for the given +uri+ and set of +options+. def build_connection(uri, options) type = options.transport || begin @@ -253,13 +231,6 @@ module HTTPX def init_connection(type, uri, options) connection = options.connection_class.new(type, uri, options) - connection.on(:open) do - emit(:connection_opened, connection.origin, connection.io.socket) - # only run close callback if it opened - end - connection.on(:close) do - emit(:connection_closed, connection.origin, connection.io.socket) if connection.used? - end catch(:coalesced) do pool.init_connection(connection, options) connection diff --git a/sig/chainable.rbs b/sig/chainable.rbs index 11b8f067..76ea7e5f 100644 --- a/sig/chainable.rbs +++ b/sig/chainable.rbs @@ -34,6 +34,7 @@ module HTTPX | (:response_cache, ?options) -> Plugins::sessionResponseCache | (:circuit_breaker, ?options) -> Plugins::sessionCircuitBreaker | (:oauth, ?options) -> Plugins::sessionOAuth + | (:callbacks, ?options) -> Plugins::sessionCallbacks | (Symbol | Module, ?options) { (Class) -> void } -> Session | (Symbol | Module, ?options) -> Session diff --git a/sig/plugins/callbacks.rbs b/sig/plugins/callbacks.rbs new file mode 100644 index 00000000..816d8afd --- /dev/null +++ b/sig/plugins/callbacks.rbs @@ -0,0 +1,31 @@ +module HTTPX + module Plugins + module Callbacks + module InstanceMethods + include HTTPX::Callbacks + + type socket = TCPSocket | SSLSocket | UNIXSocket + + def on_connection_opened: () { (http_uri origin, socket sock) -> void } -> self + + def on_connection_opened: () { (http_uri origin) -> void } -> self + + def on_request_error: () { (Request request, StandardError error) -> void } -> self + + def on_request_started: () { (Request request) -> void } -> self + + def on_request_body_chunk: () { (Request request, String chunk) -> void } -> self + + def on_request_completed: () { (Request request) -> void } -> self + + def on_response_started: () { (Request request, Response response) -> void } -> self + + def on_response_body_chunk: () { (Request request, Response response, String chunk) -> void } -> self + + def on_response_completed: () { (Request request, response response) -> void } -> self + end + end + + type sessionCallbacks = Session & Callbacks::InstanceMethods + end +end diff --git a/sig/session.rbs b/sig/session.rbs index 4ff98b49..95c53952 100644 --- a/sig/session.rbs +++ b/sig/session.rbs @@ -33,6 +33,8 @@ module HTTPX def set_connection_callbacks: (Connection connection, Array[Connection] connections, Options options) -> void + def set_request_callbacks: (Request request) -> void + def build_altsvc_connection: (Connection existing_connection, Array[Connection] connections, URI::Generic alt_origin, String origin, Hash[String, String] alt_params, Options options) -> (Connection & AltSvc::ConnectionMixin)? def build_requests: (verb, uri, options) -> Array[Request] diff --git a/test/support/requests/callbacks.rb b/test/support/requests/callbacks.rb index 260a2bac..f9e18c72 100644 --- a/test/support/requests/callbacks.rb +++ b/test/support/requests/callbacks.rb @@ -10,7 +10,7 @@ module Requests origin = ip = nil opened = 0 - response = HTTPX.plugin(SessionWithPool).on_connection_opened do |o, sock| + response = HTTPX.plugin(SessionWithPool).plugin(:callbacks).on_connection_opened do |o, sock| origin = o ip = sock.to_io.remote_address.ip_address opened += 1 @@ -30,7 +30,7 @@ module Requests origin = nil closed = 0 - response = HTTPX.plugin(SessionWithPool).on_connection_closed do |o| + response = HTTPX.plugin(SessionWithPool).plugin(:callbacks).on_connection_closed do |o| origin = o closed += 1 end.get(uri) @@ -45,7 +45,7 @@ module Requests uri = URI(build_uri("/get")) error = nil - http = HTTPX.on_request_error { |_, err| error = err } + http = HTTPX.plugin(:callbacks).on_request_error { |_, err| error = err } response = http.get(uri) verify_status(response, 200) @@ -66,7 +66,8 @@ module Requests started = completed = false chunks = 0 - http = HTTPX.on_request_started { |_| started = true } + http = HTTPX.plugin(:callbacks) + .on_request_started { |_| started = true } .on_request_body_chunk { |_, _chunk| chunks += 1 } .on_request_completed { |_| completed = true } @@ -83,7 +84,8 @@ module Requests started = completed = false chunks = 0 - http = HTTPX.on_response_started { |_, _| started = true } + http = HTTPX.plugin(:callbacks) + .on_response_started { |_, _| started = true } .on_response_body_chunk { |_, _, _chunk| chunks += 1 } .on_response_completed { |_, _| completed = true }