class HTTPS
A server that supports both HTTP1.0 and HTTP1.1 semantics by detecting the version of the request.
Definitions
HANDLERS = {...}
The protocol classes for each supported protocol.
Implementation
HANDLERS = {
"h2" => HTTP2,
"http/1.1" => HTTP11,
"http/1.0" => HTTP10,
nil => HTTP11,
}
def protocol_for(peer)
Determine the protocol of the peer and return the appropriate protocol class.
Use TLS Application Layer Protocol Negotiation (ALPN) to determine the protocol.
Signature
-
parameter
peer
IO
The peer to communicate with.
-
returns
Class
The protocol class to use.
Implementation
def protocol_for(peer)
# alpn_protocol is only available if openssl v1.0.2+
name = peer.alpn_protocol
Console.debug(self) {"Negotiating protocol #{name.inspect}..."}
if protocol = HANDLERS[name]
return protocol
else
raise ArgumentError, "Could not determine protocol for connection (#{name.inspect})."
end
end
def client(peer, **options)
Create a client for an outbound connection.
Signature
-
parameter
peer
IO
The peer to communicate with.
-
parameter
options
Hash
Options to pass to the client instance.
Implementation
def client(peer, **options)
protocol = protocol_for(peer)
options = options[protocol] || {}
protocol.client(peer, **options)
end
def server(peer, **options)
Create a server for an inbound connection.
Signature
-
parameter
peer
IO
The peer to communicate with.
-
parameter
options
Hash
Options to pass to the server instance.
Implementation
def server(peer, **options)
protocol = protocol_for(peer)
options = options[protocol] || {}
protocol.server(peer, **options)
end
def names
Signature
-
returns
Array
The names of the supported protocol, used for Application Layer Protocol Negotiation (ALPN).
Implementation
def names
@handlers.keys.compact
end