Protocol::HTTPSourceProtocolHTTPRequest

class Request

Represents an HTTP request which can be used both server and client-side.

require 'protocol/http'

# Long form:
Protocol::HTTP::Request.new("http", "example.com", "GET", "/index.html", "HTTP/1.1", Protocol::HTTP::Headers[["accept", "text/html"]])

# Short form:
Protocol::HTTP::Request["GET", "/index.html", {"accept" => "text/html"}]

Definitions

attr_accessor :scheme

Signature

attribute String

the request scheme, usually "http" or "https".

attr_accessor :authority

Signature

attribute String

the request authority, usually a hostname and port number, e.g. "example.com:80".

attr_accessor :method

Signature

attribute String

the request method, usually one of "GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT" or "OPTIONS", etc.

attr_accessor :path

Signature

attribute String

the request path, usually a path and query string, e.g. "/index.html", "/search?q=hello", however it can be any valid request target.

attr_accessor :version

Signature

attribute String

the request version, usually "http/1.0", "http/1.1", "h2", or "h3".

attr_accessor :headers

Signature

attribute Headers

the request headers, usually containing metadata associated with the request such as the "user-agent", "accept" (content type), "accept-language", etc.

attr_accessor :body

Signature

attribute Body::Readable

the request body. It should only be read once (it may not be idempotent).

attr_accessor :protocol

Signature

attribute String | Array(String) | Nil

the request protocol, usually empty, but occasionally "websocket" or "webtransport". In HTTP/1, it is used to request a connection upgrade, and in HTTP/2 it is used to indicate a specfic protocol for the stream.

attr_accessor :interim_response

Signature

attribute Proc

a callback which is called when an interim response is received.

def peer

A request that is generated by a server, may choose to include the peer (address) associated with the request. It should be implemented by a sub-class.

Signature

returns Peer | Nil

The peer (address) associated with the request.

Implementation

def peer
	nil
end

def call(connection)

Send the request to the given connection.

Implementation

def call(connection)
	connection.call(self)
end

def send_interim_response(status, headers)

Send an interim response back to the origin of this request, if possible.

Implementation

def send_interim_response(status, headers)
	@interim_response&.call(status, headers)
end

def head?

Whether this is a HEAD request: no body is expected in the response.

Implementation

def head?
	@method == Methods::HEAD
end

def connect?

Whether this is a CONNECT request: typically used to establish a tunnel.

Implementation

def connect?
	@method == Methods::CONNECT
end

def self.[](method, path, _headers = nil, _body = nil, scheme: nil, authority: nil, headers: _headers, body: _body, protocol: nil, interim_response: nil)

A short-cut method which exposes the main request variables that you'd typically care about.

Signature

parameter method String

The HTTP method, e.g. "GET", "POST", etc.

parameter path String

The path, e.g. "/index.html", "/search?q=hello", etc.

parameter headers Hash

The headers, e.g. {"accept" => "text/html"}, etc.

parameter body String | Array(String) | Body::Readable

The body, e.g. "Hello, World!", etc. See Protocol::HTTP::Body::Buffered.wrap for more information about .

Implementation

def self.[](method, path, _headers = nil, _body = nil, scheme: nil, authority: nil, headers: _headers, body: _body, protocol: nil, interim_response: nil)
	body = Body::Buffered.wrap(body)
	headers = Headers[headers]
	
	self.new(scheme, authority, method, path, nil, headers, body, protocol, interim_response)
end

def idempotent?

Whether the request can be replayed without side-effects.

Implementation

def idempotent?
	@method != Methods::POST && (@body.nil? || @body.empty?)
end