class HTTP::Request
Constants
- METHODS
- PORTS
Default ports of supported schemes
- SCHEMES
Allowed schemes
- USER_AGENT
Default User-Agent header value
Attributes
Scheme is normalized to be a lowercase symbol e.g. :http, :https
“Request URI” as per RFC 2616 www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
Method is given as a lowercase symbol e.g. :get, :post
Public Class Methods
@option opts [String] :version @option opts [#to_s] :verb HTTP
request method @option opts [HTTP::URI, to_s] :uri @option opts [Hash] :headers @option opts [Hash] :proxy @option opts [String, Enumerable, IO, nil] :body
# File lib/http/request.rb, line 80 def initialize(opts) @verb = opts.fetch(:verb).to_s.downcase.to_sym @uri = normalize_uri(opts.fetch(:uri)) @scheme = @uri.scheme.to_s.downcase.to_sym if @uri.scheme raise(UnsupportedMethodError, "unknown method: #{verb}") unless METHODS.include?(@verb) raise(UnsupportedSchemeError, "unknown scheme: #{scheme}") unless SCHEMES.include?(@scheme) @proxy = opts[:proxy] || {} @body = request_body(opts[:body], opts) @version = opts[:version] || "1.1" @headers = HTTP::Headers.coerce(opts[:headers] || {}) @headers[Headers::HOST] ||= default_host_header_value @headers[Headers::USER_AGENT] ||= USER_AGENT end
Public Instance Methods
Setup tunnel through proxy for SSL request
# File lib/http/request.rb, line 144 def connect_using_proxy(socket) Request::Writer.new(socket, nil, proxy_connect_headers, proxy_connect_header).connect_through_proxy end
Compute HTTP
request header for direct or proxy request
# File lib/http/request.rb, line 149 def headline request_uri = if using_proxy? && !uri.https? uri.omit(:fragment) else uri.request_uri end "#{verb.to_s.upcase} #{request_uri} HTTP/#{version}" end
# File lib/http/request.rb, line 128 def include_proxy_headers headers.merge!(proxy[:proxy_headers]) if proxy.key?(:proxy_headers) include_proxy_authorization_header if using_authenticated_proxy? end
Compute HTTP
request header SSL proxy connection
# File lib/http/request.rb, line 161 def proxy_connect_header "CONNECT #{host}:#{port} HTTP/#{version}" end
Headers
to send with proxy connect request
# File lib/http/request.rb, line 166 def proxy_connect_headers connect_headers = HTTP::Headers.coerce( Headers::HOST => headers[Headers::HOST], Headers::USER_AGENT => headers[Headers::USER_AGENT] ) connect_headers[Headers::PROXY_AUTHORIZATION] = proxy_authorization_header if using_authenticated_proxy? connect_headers.merge!(proxy[:proxy_headers]) if proxy.key?(:proxy_headers) connect_headers end
Returns new Request
with updated uri
# File lib/http/request.rb, line 98 def redirect(uri, verb = @verb) headers = self.headers.dup headers.delete(Headers::HOST) self.class.new( :verb => verb, :uri => @uri.join(uri), :headers => headers, :proxy => proxy, :body => body, :version => version ) end
Host for tcp socket
# File lib/http/request.rb, line 178 def socket_host using_proxy? ? proxy[:proxy_address] : host end
Port for tcp socket
# File lib/http/request.rb, line 183 def socket_port using_proxy? ? proxy[:proxy_port] : port end
Stream the request to a socket
# File lib/http/request.rb, line 113 def stream(socket) include_proxy_headers if using_proxy? && !@uri.https? Request::Writer.new(socket, body, headers, headline).stream end
Is this request using an authenticated proxy?
# File lib/http/request.rb, line 124 def using_authenticated_proxy? proxy && proxy.keys.size >= 4 end
Is this request using a proxy?
# File lib/http/request.rb, line 119 def using_proxy? proxy && proxy.keys.size >= 2 end
Private Instance Methods
@return [String] Default host (with port if needed) header value.
# File lib/http/request.rb, line 207 def default_host_header_value PORTS[@scheme] != port ? "#{host}:#{port}" : host end
@return [HTTP::URI] URI
with all componentes but query being normalized.
# File lib/http/request.rb, line 212 def normalize_uri(uri) uri = HTTP::URI.parse uri HTTP::URI.new( :scheme => uri.normalized_scheme, :authority => uri.normalized_authority, :path => uri.normalized_path, :query => uri.query, :fragment => uri.normalized_fragment ) end
@!attribute [r] port
@return [Fixnum]
# File lib/http/request.rb, line 202 def port @uri.port || @uri.default_port end
Transforms body to an object suitable for streaming.
# File lib/http/request.rb, line 190 def request_body(body, opts) body = Request::Body.new(body) unless body.is_a?(Request::Body) body = opts[:auto_deflate].deflated_body(body) if opts[:auto_deflate] body end