Commit fe2a95ea49ccb552d0587056d332562d44bf91bb

Authored by Wiebe Cazemier
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 356 bool upgradeHeaderSeen = false;
357 357 bool connectionHeaderSeen = false;
358 358 bool firstLine = true;
  359 + bool subprotocol_seen = false;
359 360  
360 361 std::string line;
361 362 while (std::getline(is, line))
... ... @@ -396,12 +397,16 @@ bool parseHttpHeader(CirBuf &buf, std::string &websocket_key, int &websocket_ver
396 397 websocket_key = value;
397 398 else if (name == "sec-websocket-version")
398 399 websocket_version = stoi(value);
  400 + else if (name == "sec-websocket-protocol" && value_lower == "mqtt")
  401 + subprotocol_seen = true;
399 402 }
400 403  
401 404 if (doubleEmptyLine)
402 405 {
403 406 if (!connectionHeaderSeen || !upgradeHeaderSeen)
404 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 412 return doubleEmptyLine;
... ... @@ -491,6 +496,7 @@ std::string generateWebsocketAnswer(const std::string &acceptString)
491 496 oss << "Upgrade: websocket\r\n";
492 497 oss << "Connection: Upgrade\r\n";
493 498 oss << "Sec-WebSocket-Accept: " << acceptString << "\r\n";
  499 + oss << "Sec-WebSocket-Protocol: mqtt\r\n";
494 500 oss << "\r\n";
495 501 oss.flush();
496 502 return oss.str();
... ...