Sha256: 11ad52847137ded2bbad948ff19d08d476e1fc96141e988f09fb452a94253d13

Contents?: true

Size: 1.71 KB

Versions: 3

Compression:

Stored size: 1.71 KB

Contents

# frozen_string_literal: true

module HTTPX
  module Plugins
    #
    # This plugin makes all HTTP/1.1 requests with a body send the "Expect: 100-continue".
    #
    # https://gitlab.com/honeyryderchuck/httpx/wikis/Expect#expect
    #
    module Expect
      EXPECT_TIMEOUT = 2

      def self.extra_options(options)
        Class.new(options.class) do
          def_option(:expect_timeout) do |seconds|
            seconds = Integer(seconds)
            raise Error, ":expect_timeout must be positive" unless seconds.positive?

            seconds
          end
        end.new(options).merge(expect_timeout: EXPECT_TIMEOUT)
      end

      module RequestBodyMethods
        def initialize(*)
          super
          return if @body.nil?

          @headers["expect"] = "100-continue"
        end
      end

      module ConnectionMethods
        def send(request)
          request.once(:expects) do
            @timers.after(@options.expect_timeout) do
              if request.state == :expects && !request.expects?
                request.headers.delete("expect")
                handle(request)
              end
            end
          end
          super
        end
      end

      module InstanceMethods
        def fetch_response(request, connections, options)
          response = @responses.delete(request)
          return unless response

          if response.status == 417 && request.headers.key?("expect")
            request.headers.delete("expect")
            request.transition(:idle)
            connection = find_connection(request, connections, options)
            connection.send(request)
            return
          end

          response
        end
      end
    end
    register_plugin :expect, Expect
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
httpx-0.8.1 lib/httpx/plugins/expect.rb
httpx-0.8.0 lib/httpx/plugins/expect.rb
httpx-0.7.0 lib/httpx/plugins/expect.rb