Merge branch 'master' of github.com:machinezone/IXWebSocket
This commit is contained in:
@ -133,16 +133,20 @@ namespace ix
|
||||
if (headers.find("Content-Length") != headers.end())
|
||||
{
|
||||
int contentLength = 0;
|
||||
try
|
||||
{
|
||||
contentLength = std::stoi(headers["Content-Length"]);
|
||||
const char* p = headers["Content-Length"].c_str();
|
||||
char* p_end{};
|
||||
errno = 0;
|
||||
long val = std::strtol(p, &p_end, 10);
|
||||
if (p_end == p // invalid argument
|
||||
|| errno == ERANGE // out of range
|
||||
|| val < std::numeric_limits<int>::min()
|
||||
|| val > std::numeric_limits<int>::max()) {
|
||||
return std::make_tuple(
|
||||
false, "Error parsing HTTP Header 'Content-Length'", httpRequest);
|
||||
}
|
||||
contentLength = val;
|
||||
}
|
||||
catch (const std::exception&)
|
||||
{
|
||||
return std::make_tuple(
|
||||
false, "Error parsing HTTP Header 'Content-Length'", httpRequest);
|
||||
}
|
||||
|
||||
if (contentLength < 0)
|
||||
{
|
||||
return std::make_tuple(
|
||||
|
@ -34,8 +34,12 @@ namespace ix
|
||||
|
||||
SelectInterruptPipe::~SelectInterruptPipe()
|
||||
{
|
||||
::close(_fildes[kPipeReadIndex]);
|
||||
::close(_fildes[kPipeWriteIndex]);
|
||||
if (-1 != _fildes[kPipeReadIndex]) {
|
||||
::close(_fildes[kPipeReadIndex]);
|
||||
}
|
||||
if (-1 != _fildes[kPipeWriteIndex]) {
|
||||
::close(_fildes[kPipeWriteIndex]);
|
||||
}
|
||||
_fildes[kPipeReadIndex] = -1;
|
||||
_fildes[kPipeWriteIndex] = -1;
|
||||
}
|
||||
|
@ -352,6 +352,11 @@ namespace ix
|
||||
return res;
|
||||
}
|
||||
|
||||
if (res == 0)
|
||||
{
|
||||
errno = ECONNRESET;
|
||||
}
|
||||
|
||||
if (res == MBEDTLS_ERR_SSL_WANT_READ || res == MBEDTLS_ERR_SSL_WANT_WRITE)
|
||||
{
|
||||
errno = EWOULDBLOCK;
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
// For manipulating the certificate store
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#endif
|
||||
|
||||
@ -293,10 +294,16 @@ namespace ix
|
||||
*/
|
||||
bool SocketOpenSSL::checkHost(const std::string& host, const char* pattern)
|
||||
{
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||
return true;
|
||||
#else
|
||||
|
||||
#ifdef _WIN32
|
||||
return PathMatchSpecA(host.c_str(), pattern);
|
||||
#else
|
||||
return fnmatch(pattern, host.c_str(), 0) != FNM_NOMATCH;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -180,7 +180,7 @@ namespace
|
||||
bHasUserName = true;
|
||||
break;
|
||||
}
|
||||
else if (*LocalString == '/')
|
||||
else if (*LocalString == '/' || *LocalString == '?')
|
||||
{
|
||||
// end of <host>:<port> specification
|
||||
bHasUserName = false;
|
||||
@ -242,7 +242,7 @@ namespace
|
||||
LocalString++;
|
||||
break;
|
||||
}
|
||||
else if (!bHasBracket && (*LocalString == ':' || *LocalString == '/'))
|
||||
else if (!bHasBracket && (*LocalString == ':' || *LocalString == '/' || *LocalString == '?'))
|
||||
{
|
||||
// port number is specified
|
||||
break;
|
||||
@ -280,12 +280,14 @@ namespace
|
||||
}
|
||||
|
||||
// skip '/'
|
||||
if (*CurrentString != '/')
|
||||
if (*CurrentString != '/' && *CurrentString != '?')
|
||||
{
|
||||
return clParseURL(LUrlParserError_NoSlash);
|
||||
}
|
||||
|
||||
CurrentString++;
|
||||
if (*CurrentString != '?') {
|
||||
CurrentString++;
|
||||
}
|
||||
|
||||
// parse the path
|
||||
LocalString = CurrentString;
|
||||
|
@ -57,7 +57,7 @@ namespace ix
|
||||
server.setOnConnectionCallback(
|
||||
[remoteUrl, remoteUrlsMapping](std::weak_ptr<ix::WebSocket> webSocket,
|
||||
std::shared_ptr<ConnectionState> connectionState) {
|
||||
auto state = std::dynamic_pointer_cast<ProxyConnectionState>(connectionState);
|
||||
auto state = std::static_pointer_cast<ProxyConnectionState>(connectionState);
|
||||
auto remoteIp = connectionState->getRemoteIp();
|
||||
|
||||
// Server connection
|
||||
|
@ -19,17 +19,20 @@ namespace ix
|
||||
{
|
||||
const int WebSocketServer::kDefaultHandShakeTimeoutSecs(3); // 3 seconds
|
||||
const bool WebSocketServer::kDefaultEnablePong(true);
|
||||
const int WebSocketServer::kPingIntervalSeconds(-1); // disable heartbeat
|
||||
|
||||
WebSocketServer::WebSocketServer(int port,
|
||||
const std::string& host,
|
||||
int backlog,
|
||||
size_t maxConnections,
|
||||
int handshakeTimeoutSecs,
|
||||
int addressFamily)
|
||||
int addressFamily,
|
||||
int pingIntervalSeconds)
|
||||
: SocketServer(port, host, backlog, maxConnections, addressFamily)
|
||||
, _handshakeTimeoutSecs(handshakeTimeoutSecs)
|
||||
, _enablePong(kDefaultEnablePong)
|
||||
, _enablePerMessageDeflate(true)
|
||||
, _pingIntervalSeconds(pingIntervalSeconds)
|
||||
{
|
||||
}
|
||||
|
||||
@ -93,6 +96,7 @@ namespace ix
|
||||
auto webSocket = std::make_shared<WebSocket>();
|
||||
|
||||
webSocket->setAutoThreadName(false);
|
||||
webSocket->setPingInterval(_pingIntervalSeconds);
|
||||
|
||||
if (_onConnectionCallback)
|
||||
{
|
||||
|
@ -33,7 +33,8 @@ namespace ix
|
||||
int backlog = SocketServer::kDefaultTcpBacklog,
|
||||
size_t maxConnections = SocketServer::kDefaultMaxConnections,
|
||||
int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs,
|
||||
int addressFamily = SocketServer::kDefaultAddressFamily);
|
||||
int addressFamily = SocketServer::kDefaultAddressFamily,
|
||||
int pingIntervalSeconds = WebSocketServer::kPingIntervalSeconds);
|
||||
virtual ~WebSocketServer();
|
||||
virtual void stop() final;
|
||||
|
||||
@ -61,6 +62,7 @@ namespace ix
|
||||
int _handshakeTimeoutSecs;
|
||||
bool _enablePong;
|
||||
bool _enablePerMessageDeflate;
|
||||
int _pingIntervalSeconds;
|
||||
|
||||
OnConnectionCallback _onConnectionCallback;
|
||||
OnClientMessageCallback _onClientMessageCallback;
|
||||
@ -69,6 +71,7 @@ namespace ix
|
||||
std::set<std::shared_ptr<WebSocket>> _clients;
|
||||
|
||||
const static bool kDefaultEnablePong;
|
||||
const static int kPingIntervalSeconds;
|
||||
|
||||
// Methods
|
||||
virtual void handleConnection(std::unique_ptr<Socket> socket,
|
||||
|
Reference in New Issue
Block a user