class ReeHttp::ExecuteRequest
def call(request, **opts, &block)
def call(request, **opts, &block) opts = DEFAULTS.merge(opts) requester = build_request_executor( request.uri, **slice(opts, [:timeout, :force_ssl, :ca_certs, :proxy, :write_timeout]) ) ReeHttp.logger.debug( "Sending #{request.method} request: URI #{request.uri}\n BODY: #{request.body}\n" ) response = requester.start do |http| http.request(request, &block) end ReeHttp.logger.debug( "Got #{response.code} response on request URI #{request.uri}\n With BODY: #{response.body}\n" ) if response.is_a?(Net::HTTPRedirection) return process_redirect_response(response, request, opts, &block) end response end
def process_redirect_response(response, request, opts, &block)
def process_redirect_response(response, request, opts, &block) if opts[:redirects_count] == 0 raise TooManyRedirectsError, "Got too match redirects, if you want more redirects, use redirects_count" end if opts[:strict_redirect_mode] && STRICT_SENSITIVE_CODES.include?(response.code.to_i) && UNSAFE_VERBS.include?(request.method.to_sym) raise RedirectMethodError, "Got #{response.code.to_i} with strict_mode" end if (ALWAYS_GET_CODES.include?(response.code.to_i) || STRICT_SENSITIVE_CODES.include?(response.code.to_i)) && UNSAFE_VERBS.include?(request.method.downcase.to_sym) new_request_method = :get end new_request_method ||= request.method.downcase.to_sym new_uri = URI(response['Location'] || response['location']) new_request = build_request( new_request_method, new_uri.to_s, **slice(opts, [ :headers, :body, :form_data, :query_params, :force_ssl, :ca_certs, :basic_auth, :bearer_token ]) ) opts[:redirects_count] -= 1 call(new_request, **opts, &block) end