Commit 62868f64 authored by Tiago's avatar Tiago
Browse files

Merge branch 'c-breaker'

parents f8020b9c 09be632c
Loading
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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
@@ -90,6 +90,7 @@ module HTTPX
            @circuit_store.try_open(request.uri, response)
          else
            @circuit_store.try_close(request.uri)
            nil
          end
        end
      end
+10 −7
Original line number Diff line number Diff line
# frozen_string_literal: true

require "mutex_m"

module HTTPX::Plugins::CircuitBreaker
  using HTTPX::URIExtensions

@@ -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
@@ -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
@@ -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]
+2 −1
Original line number Diff line number Diff line
@@ -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" |
+1 −1
Original line number Diff line number Diff line
@@ -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
+4 −4
Original line number Diff line number Diff line
@@ -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