sorry, my implementation of websocket subprotocols has a mistake, i.e. the spec says:
The server selects one or none of the acceptable protocols and echoes that value in its handshake to indicate that it has selected that protocol.
so instead of a Bad Request exception, we should send back no Sec-WebSocket-Protocol header at all and leave it to the client to drop the connection or carry on without protocol (however dumb that sounds).