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,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();