Data structures¶
WebSocket events¶
- class websockets.frames.Frame(opcode, data, fin=True, rsv1=False, rsv2=False, rsv3=False)¶
WebSocket frame.
- opcode¶
Opcode.
- Type:
- data¶
Payload data.
- Type:
bytes | bytearray | memoryview
Only these fields are needed. The MASK bit, payload length and masking-key are handled on the fly when parsing and serializing frames.
- class websockets.frames.Opcode(*values)¶
Opcode values for WebSocket frames.
- CONT = 0¶
- TEXT = 1¶
- BINARY = 2¶
- CLOSE = 8¶
- PING = 9¶
- PONG = 10¶
- class websockets.frames.Close(code, reason)¶
Code and reason for WebSocket close frames.
- code¶
Close code.
- Type:
- class websockets.frames.CloseCode(*values)¶
Close code values for WebSocket close frames.
- NORMAL_CLOSURE = 1000¶
- GOING_AWAY = 1001¶
- PROTOCOL_ERROR = 1002¶
- UNSUPPORTED_DATA = 1003¶
- NO_STATUS_RCVD = 1005¶
- ABNORMAL_CLOSURE = 1006¶
- INVALID_DATA = 1007¶
- POLICY_VIOLATION = 1008¶
- MESSAGE_TOO_BIG = 1009¶
- MANDATORY_EXTENSION = 1010¶
- INTERNAL_ERROR = 1011¶
- SERVICE_RESTART = 1012¶
- TRY_AGAIN_LATER = 1013¶
- BAD_GATEWAY = 1014¶
- TLS_HANDSHAKE = 1015¶
HTTP events¶
- class websockets.http11.Request(path, headers, method='GET', protocol='HTTP/1.1', _exception=None)¶
WebSocket handshake request.
methodandpathmust contain only ASCII characters.headersshould contain only ASCII characters; however, non-ASCII header values are tolerated and encoded as ISO-8859-1.- headers¶
Request headers.
- class websockets.http11.Response(status_code, reason_phrase, headers, body=b'', _exception=None)¶
WebSocket handshake response.
reason_phraseandheadersshould contain only ASCII characters; however, non-ASCII reason phrases and header values are tolerated and encoded as ISO-8859-1.- headers¶
Response headers.
- class websockets.datastructures.Headers(*args, **kwargs)¶
Efficient data structure for manipulating HTTP headers.
A
listof(name, values)is inefficient for lookups.A
dictdoesn’t suffice because header names are case-insensitive and multiple occurrences of headers with the same name are possible.Headersstores HTTP headers in a hybrid data structure to provide efficient insertions and lookups while preserving the original data.In order to account for multiple values with minimal hassle,
Headersfollows this logic:- When getting a header with
headers[name]: if there’s no value,
KeyErroris raised;if there’s exactly one value, it’s returned;
if there’s more than one value,
MultipleValuesErroris raised.
- When getting a header with
When setting a header with
headers[name] = value, the value is appended to the list of values for that header.When deleting a header with
del headers[name], all values for that header are removed (this is slow).
Other methods for manipulating headers are consistent with this logic.
As long as no header occurs multiple times,
Headersbehaves likedict, except keys are lower-cased to provide case-insensitivity.Two methods support manipulating multiple values explicitly:
get_all()returns a list of all values for a header;raw_items()returns an iterator of(name, values)pairs.
Header names and values are expected to contain only ASCII text. However, non-ASCII values happen in practice, even though there is no standard for transmitting non-ASCII data in HTTP headers.
Headerssupports it by treating it as ISO-8859-1 data. This is a safe and reversible encoding to represent arbitrary data in astr.When reading headers from the network, if the actual encoding isn’t ISO-8859-1, you must re-encode and decode, e.g.:
value = headers[key].encode("iso-8859-1").decode("utf-8")
Conversely, when sending headers to the network, if you need to use a different encoding, you can encode and decode, e.g.:
headers[key] = value.encode("utf-8").decode("iso-8859-1")
When assigning a value to a header, as a security hardening measure, the value is checked for unsafe characters. The name isn’t checked because it’s usually a constant in code, unlikely to be tainted by user input.
- get_all(key)¶
Return the (possibly empty) list of all values for a header.
- Parameters:
key – Header name.
- raw_items()¶
Return an iterator of all values as
(name, value)pairs.
URIs¶
- websockets.uri.parse_uri(uri)¶
Parse and validate a WebSocket URI.
- Parameters:
uri – WebSocket URI.
- Returns:
Parsed WebSocket URI.
- Raises:
InvalidURI – If
uriisn’t a valid WebSocket URI.
- class websockets.uri.WebSocketURI(secure, host, port, path, query, username=None, password=None)¶
WebSocket URI.
- username¶
Available when the URI contains User Information.
- password¶
Available when the URI contains User Information.