Commit fe2a95ea49ccb552d0587056d332562d44bf91bb
1 parent
411412f9
Use Sec-WebSocket-Protocol in websockets
Firefox worked without it. Chrome didn't.
Showing
1 changed file
with
6 additions
and
0 deletions
utils.cpp
| @@ -356,6 +356,7 @@ bool parseHttpHeader(CirBuf &buf, std::string &websocket_key, int &websocket_ver | @@ -356,6 +356,7 @@ bool parseHttpHeader(CirBuf &buf, std::string &websocket_key, int &websocket_ver | ||
| 356 | bool upgradeHeaderSeen = false; | 356 | bool upgradeHeaderSeen = false; |
| 357 | bool connectionHeaderSeen = false; | 357 | bool connectionHeaderSeen = false; |
| 358 | bool firstLine = true; | 358 | bool firstLine = true; |
| 359 | + bool subprotocol_seen = false; | ||
| 359 | 360 | ||
| 360 | std::string line; | 361 | std::string line; |
| 361 | while (std::getline(is, line)) | 362 | while (std::getline(is, line)) |
| @@ -396,12 +397,16 @@ bool parseHttpHeader(CirBuf &buf, std::string &websocket_key, int &websocket_ver | @@ -396,12 +397,16 @@ bool parseHttpHeader(CirBuf &buf, std::string &websocket_key, int &websocket_ver | ||
| 396 | websocket_key = value; | 397 | websocket_key = value; |
| 397 | else if (name == "sec-websocket-version") | 398 | else if (name == "sec-websocket-version") |
| 398 | websocket_version = stoi(value); | 399 | websocket_version = stoi(value); |
| 400 | + else if (name == "sec-websocket-protocol" && value_lower == "mqtt") | ||
| 401 | + subprotocol_seen = true; | ||
| 399 | } | 402 | } |
| 400 | 403 | ||
| 401 | if (doubleEmptyLine) | 404 | if (doubleEmptyLine) |
| 402 | { | 405 | { |
| 403 | if (!connectionHeaderSeen || !upgradeHeaderSeen) | 406 | if (!connectionHeaderSeen || !upgradeHeaderSeen) |
| 404 | throw BadHttpRequest("HTTP request is not a websocket upgrade request."); | 407 | throw BadHttpRequest("HTTP request is not a websocket upgrade request."); |
| 408 | + if (!subprotocol_seen) | ||
| 409 | + throw BadHttpRequest("HTTP header Sec-WebSocket-Protocol with value 'mqtt' must be present."); | ||
| 405 | } | 410 | } |
| 406 | 411 | ||
| 407 | return doubleEmptyLine; | 412 | return doubleEmptyLine; |
| @@ -491,6 +496,7 @@ std::string generateWebsocketAnswer(const std::string &acceptString) | @@ -491,6 +496,7 @@ std::string generateWebsocketAnswer(const std::string &acceptString) | ||
| 491 | oss << "Upgrade: websocket\r\n"; | 496 | oss << "Upgrade: websocket\r\n"; |
| 492 | oss << "Connection: Upgrade\r\n"; | 497 | oss << "Connection: Upgrade\r\n"; |
| 493 | oss << "Sec-WebSocket-Accept: " << acceptString << "\r\n"; | 498 | oss << "Sec-WebSocket-Accept: " << acceptString << "\r\n"; |
| 499 | + oss << "Sec-WebSocket-Protocol: mqtt\r\n"; | ||
| 494 | oss << "\r\n"; | 500 | oss << "\r\n"; |
| 495 | oss.flush(); | 501 | oss.flush(); |
| 496 | return oss.str(); | 502 | return oss.str(); |