From 7af78aff5ac1f0a76d3aa62f08e642558d8e58fc Mon Sep 17 00:00:00 2001 From: ipknHama Date: Thu, 15 Sep 2016 17:29:08 +0900 Subject: [PATCH] Fix bugs in websocket - `Upgrade: websocket` should be case-insensitive - Using network byte order for length field --- include/websocket.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/websocket.h b/include/websocket.h index 2873e45d4..5b82046b5 100644 --- a/include/websocket.h +++ b/include/websocket.h @@ -1,4 +1,5 @@ #pragma once +#include #include "socket_adaptors.h" #include "http_request.h" #include "TinySHA1.hpp" @@ -41,7 +42,7 @@ namespace crow std::function error_handler) : adaptor_(std::move(adaptor)), open_handler_(std::move(open_handler)), message_handler_(std::move(message_handler)), close_handler_(std::move(close_handler)), error_handler_(std::move(error_handler)) { - if (req.get_header_value("upgrade") != "websocket") + if (!boost::iequals(req.get_header_value("upgrade"), "websocket")) { adaptor.close(); delete this; @@ -131,13 +132,13 @@ namespace crow else if (size < 0x10000) { buf[1] += 126; - *(uint16_t*)(buf+2) = (uint16_t)size; + *(uint16_t*)(buf+2) = htons((uint16_t)size); return {buf, buf+4}; } else { buf[1] += 127; - *(uint64_t*)(buf+2) = (uint64_t)size; + *(uint64_t*)(buf+2) = ((1==htonl(1)) ? (uint64_t)size : ((uint64_t)htonl((size) & 0xFFFFFFFF) << 32) | htonl((size) >> 32)); return {buf, buf+10}; } }