Features

Feature support matrices summarize which implementations support which features.

Both sides

asyncio (new)

threading

Sans-I/O

asyncio (legacy)

Perform the opening handshake

✅

✅

✅

✅

Enforce opening timeout

✅

✅

—

✅

Send a message

✅

✅

✅

✅

Broadcast a message

✅

❌

—

✅

Receive a message

✅

✅

✅

✅

Iterate over received messages

✅

✅

—

✅

Send a fragmented message

✅

✅

✅

✅

Receive a fragmented message frame by frame

✅

✅

✅

❌

Receive a fragmented message after reassembly

✅

✅

—

✅

Send a ping

✅

✅

✅

✅

Respond to pings automatically

✅

✅

✅

✅

Send a pong

✅

✅

✅

✅

Keepalive

✅

❌

—

✅

Heartbeat

✅

❌

—

✅

Measure latency

✅

❌

—

✅

Perform the closing handshake

✅

✅

✅

✅

Enforce closing timeout

✅

✅

—

✅

Report close codes and reasons from both sides

✅

✅

✅

❌

Compress messages (RFC 7692)

✅

✅

✅

✅

Tune memory usage for compression

✅

✅

✅

✅

Negotiate extensions

✅

✅

✅

✅

Implement custom extensions

✅

✅

✅

✅

Negotiate a subprotocol

✅

✅

✅

✅

Enforce security limits

✅

✅

✅

✅

Log events

✅

✅

✅

✅

Server

asyncio (new)

threading

Sans-I/O

asyncio (legacy)

Listen on a TCP socket

✅

✅

—

✅

Listen on a Unix socket

✅

✅

—

✅

Listen using a preexisting socket

✅

✅

—

✅

Encrypt connection with TLS

✅

✅

—

✅

Close server on context exit

✅

✅

—

✅

Close connection on handler exit

✅

✅

—

✅

Shut down server gracefully

✅

✅

—

✅

Check Origin header

✅

✅

✅

✅

Customize subprotocol selection

✅

✅

✅

✅

Configure Server header

✅

✅

✅

✅

Alter opening handshake request

✅

✅

✅

❌

Alter opening handshake response

✅

✅

✅

❌

Force an HTTP response

✅

✅

✅

✅

Perform HTTP Basic Authentication

✅

✅

❌

✅

Perform HTTP Digest Authentication

❌

❌

❌

❌

Client

asyncio (new)

threading

Sans-I/O

asyncio (legacy)

Connect to a TCP socket

✅

✅

—

✅

Connect to a Unix socket

✅

✅

—

✅

Connect using a preexisting socket

✅

✅

—

✅

Encrypt connection with TLS

✅

✅

—

✅

Close connection on context exit

✅

✅

—

✅

Reconnect automatically

✅

❌

—

✅

Configure Origin header

✅

✅

✅

✅

Configure User-Agent header

✅

✅

✅

✅

Modify opening handshake request

✅

✅

✅

✅

Modify opening handshake response

✅

✅

✅

❌

Connect to non-ASCII IRIs

✅

✅

✅

✅

Follow HTTP redirects

✅

❌

—

✅

Perform HTTP Basic Authentication

✅

✅

✅

✅

Perform HTTP Digest Authentication (#784)

❌

❌

❌

❌

Connect via HTTP proxy (#364)

❌

❌

—

❌

Connect via SOCKS5 proxy (#475)

❌

❌

—

❌

Known limitations

There is no way to control compression of outgoing frames on a per-frame basis (#538). If compression is enabled, all frames are compressed.

The server doesn’t check the Host header and doesn’t respond with HTTP 400 Bad Request if it is missing or invalid (#1246).

The client API doesn’t attempt to guarantee that there is no more than one connection to a given IP address in a CONNECTING state. This behavior is mandated by RFC 6455, section 4.1. However, connect() isn’t the right layer for enforcing this constraint. It’s the caller’s responsibility.