Fix bugs in websocket

- `Upgrade: websocket` should be case-insensitive
 - Using network byte order for length field
This commit is contained in:
ipknHama 2016-09-15 17:29:08 +09:00
parent 806ef51092
commit 7af78aff5a

View File

@ -1,4 +1,5 @@
#pragma once #pragma once
#include <boost/algorithm/string/predicate.hpp>
#include "socket_adaptors.h" #include "socket_adaptors.h"
#include "http_request.h" #include "http_request.h"
#include "TinySHA1.hpp" #include "TinySHA1.hpp"
@ -41,7 +42,7 @@ namespace crow
std::function<void(crow::websocket::connection&)> error_handler) std::function<void(crow::websocket::connection&)> 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)) : 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(); adaptor.close();
delete this; delete this;
@ -131,13 +132,13 @@ namespace crow
else if (size < 0x10000) else if (size < 0x10000)
{ {
buf[1] += 126; buf[1] += 126;
*(uint16_t*)(buf+2) = (uint16_t)size; *(uint16_t*)(buf+2) = htons((uint16_t)size);
return {buf, buf+4}; return {buf, buf+4};
} }
else else
{ {
buf[1] += 127; 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}; return {buf, buf+10};
} }
} }