/* * IXWebSocketHandshake.h * Author: Benjamin Sergeant * Copyright (c) 2019 Machine Zone, Inc. All rights reserved. */ #pragma once #include "IXCancellationRequest.h" #include "IXWebSocketHttpHeaders.h" #include "IXWebSocketPerMessageDeflate.h" #include "IXWebSocketPerMessageDeflateOptions.h" #include "IXSocket.h" #include #include #include #include #include namespace ix { struct WebSocketInitResult { bool success; int http_status; std::string errorStr; WebSocketHttpHeaders headers; std::string uri; WebSocketInitResult(bool s = false, int status = 0, const std::string& e = std::string(), WebSocketHttpHeaders h = WebSocketHttpHeaders(), const std::string& u = std::string()) { success = s; http_status = status; errorStr = e; headers = h; uri = u; } }; class WebSocketHandshake { public: WebSocketHandshake(std::atomic& requestInitCancellation, std::shared_ptr _socket, WebSocketPerMessageDeflate& perMessageDeflate, WebSocketPerMessageDeflateOptions& perMessageDeflateOptions, std::atomic& enablePerMessageDeflate); WebSocketInitResult clientHandshake(const std::string& url, const std::string& host, const std::string& path, int port, int timeoutSecs); WebSocketInitResult serverHandshake(int fd, int timeoutSecs); static bool parseUrl(const std::string& url, std::string& protocol, std::string& host, std::string& path, std::string& query, int& port); private: static void printUrl(const std::string& url); std::string genRandomString(const int len); // Parse HTTP headers std::pair parseHttpHeaders(const CancellationRequest& isCancellationRequested); WebSocketInitResult sendErrorResponse(int code, const std::string& reason); std::tuple parseRequestLine(const std::string& line); std::string trim(const std::string& str); std::atomic& _requestInitCancellation; std::shared_ptr _socket; WebSocketPerMessageDeflate& _perMessageDeflate; WebSocketPerMessageDeflateOptions& _perMessageDeflateOptions; std::atomic& _enablePerMessageDeflate; }; }