Loading lib/httpx/plugins/circuit_breaker.rb +3 −2 Original line number Diff line number Diff line Loading @@ -51,13 +51,13 @@ module HTTPX # run all requests through the circuit breaker, see if the circuit is # open for any of them. real_requests = requests.each_with_object([]) do |req, real_reqs| real_requests = requests.each_with_index.with_object([]) do |(req, idx), real_reqs| short_circuit_response = @circuit_store.try_respond(req) if short_circuit_response.nil? real_reqs << req next end short_circuit_responses[requests.index(req)] = short_circuit_response short_circuit_responses[idx] = short_circuit_response end # run requests for the remainder Loading Loading @@ -90,6 +90,7 @@ module HTTPX @circuit_store.try_open(request.uri, response) else @circuit_store.try_close(request.uri) nil end end end Loading lib/httpx/plugins/circuit_breaker/circuit_store.rb +10 −7 Original line number Diff line number Diff line # frozen_string_literal: true require "mutex_m" module HTTPX::Plugins::CircuitBreaker using HTTPX::URIExtensions Loading @@ -13,18 +15,21 @@ module HTTPX::Plugins::CircuitBreaker options.circuit_breaker_half_open_drip_rate ) end @circuits.extend(Mutex_m) end def try_open(uri, response) circuit = get_circuit_for_uri(uri) circuit = @circuits.synchronize { get_circuit_for_uri(uri) } circuit.try_open(response) end def try_close(uri) circuit = @circuits.synchronize do return unless @circuits.key?(uri.origin) || @circuits.key?(uri.to_s) circuit = get_circuit_for_uri(uri) get_circuit_for_uri(uri) end circuit.try_close end Loading @@ -32,7 +37,7 @@ module HTTPX::Plugins::CircuitBreaker # if circuit is open, it'll respond with the stored response. # if not, nil. def try_respond(request) circuit = get_circuit_for_uri(request.uri) circuit = @circuits.synchronize { get_circuit_for_uri(request.uri) } circuit.respond end Loading @@ -40,9 +45,7 @@ module HTTPX::Plugins::CircuitBreaker private def get_circuit_for_uri(uri) uri = URI(uri) if @circuits.key?(uri.origin) if uri.respond_to?(:origin) && @circuits.key?(uri.origin) @circuits[uri.origin] else @circuits[uri.to_s] Loading sig/httpx.rbs +2 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ module HTTPX VERSION: String type uri = URI::HTTP | URI::HTTPS | string type http_uri = URI::HTTP | URI::HTTPS type uri = http_uri | string type generic_uri = String | URI::Generic type verb = "OPTIONS" | "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE" | "CONNECT" | Loading sig/io/unix.rbs +1 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,6 @@ module HTTPX alias host path def initialize: (URI::HTTP | URI::HTTPS origin, Array[String]? addresses, options options) -> void def initialize: (http_uri origin, Array[String]? addresses, options options) -> void end end sig/plugins/circuit_breaker.rbs +4 −4 Original line number Diff line number Diff line Loading @@ -3,17 +3,17 @@ module HTTPX module CircuitBreaker class CircuitStore @circuits: Hash[String, Circuit] @circuits: Hash[String, Circuit] & Mutex_m def try_open: (generic_uri uri, response response) -> response? def try_open: (uri uri, response response) -> response? def try_respond: (Request request) -> response? def try_close: (generic_uri uri) -> void def try_close: (http_uri uri) -> void private def get_circuit_for_uri: (generic_uri uri) -> Circuit def get_circuit_for_uri: (uri uri) -> Circuit def initialize: (Options & _CircuitOptions options) -> void end Loading Loading
lib/httpx/plugins/circuit_breaker.rb +3 −2 Original line number Diff line number Diff line Loading @@ -51,13 +51,13 @@ module HTTPX # run all requests through the circuit breaker, see if the circuit is # open for any of them. real_requests = requests.each_with_object([]) do |req, real_reqs| real_requests = requests.each_with_index.with_object([]) do |(req, idx), real_reqs| short_circuit_response = @circuit_store.try_respond(req) if short_circuit_response.nil? real_reqs << req next end short_circuit_responses[requests.index(req)] = short_circuit_response short_circuit_responses[idx] = short_circuit_response end # run requests for the remainder Loading Loading @@ -90,6 +90,7 @@ module HTTPX @circuit_store.try_open(request.uri, response) else @circuit_store.try_close(request.uri) nil end end end Loading
lib/httpx/plugins/circuit_breaker/circuit_store.rb +10 −7 Original line number Diff line number Diff line # frozen_string_literal: true require "mutex_m" module HTTPX::Plugins::CircuitBreaker using HTTPX::URIExtensions Loading @@ -13,18 +15,21 @@ module HTTPX::Plugins::CircuitBreaker options.circuit_breaker_half_open_drip_rate ) end @circuits.extend(Mutex_m) end def try_open(uri, response) circuit = get_circuit_for_uri(uri) circuit = @circuits.synchronize { get_circuit_for_uri(uri) } circuit.try_open(response) end def try_close(uri) circuit = @circuits.synchronize do return unless @circuits.key?(uri.origin) || @circuits.key?(uri.to_s) circuit = get_circuit_for_uri(uri) get_circuit_for_uri(uri) end circuit.try_close end Loading @@ -32,7 +37,7 @@ module HTTPX::Plugins::CircuitBreaker # if circuit is open, it'll respond with the stored response. # if not, nil. def try_respond(request) circuit = get_circuit_for_uri(request.uri) circuit = @circuits.synchronize { get_circuit_for_uri(request.uri) } circuit.respond end Loading @@ -40,9 +45,7 @@ module HTTPX::Plugins::CircuitBreaker private def get_circuit_for_uri(uri) uri = URI(uri) if @circuits.key?(uri.origin) if uri.respond_to?(:origin) && @circuits.key?(uri.origin) @circuits[uri.origin] else @circuits[uri.to_s] Loading
sig/httpx.rbs +2 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ module HTTPX VERSION: String type uri = URI::HTTP | URI::HTTPS | string type http_uri = URI::HTTP | URI::HTTPS type uri = http_uri | string type generic_uri = String | URI::Generic type verb = "OPTIONS" | "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE" | "CONNECT" | Loading
sig/io/unix.rbs +1 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,6 @@ module HTTPX alias host path def initialize: (URI::HTTP | URI::HTTPS origin, Array[String]? addresses, options options) -> void def initialize: (http_uri origin, Array[String]? addresses, options options) -> void end end
sig/plugins/circuit_breaker.rbs +4 −4 Original line number Diff line number Diff line Loading @@ -3,17 +3,17 @@ module HTTPX module CircuitBreaker class CircuitStore @circuits: Hash[String, Circuit] @circuits: Hash[String, Circuit] & Mutex_m def try_open: (generic_uri uri, response response) -> response? def try_open: (uri uri, response response) -> response? def try_respond: (Request request) -> response? def try_close: (generic_uri uri) -> void def try_close: (http_uri uri) -> void private def get_circuit_for_uri: (generic_uri uri) -> Circuit def get_circuit_for_uri: (uri uri) -> Circuit def initialize: (Options & _CircuitOptions options) -> void end Loading