Compare commits
	
		
			5 Commits
		
	
	
		
			feature/ht
			...
			feature/co
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c36dc0e16a | ||
|  | 7e45659377 | ||
|  | 788c92487c | ||
|  | 0999073435 | ||
|  | 2cae6f4cf8 | 
| @@ -39,6 +39,7 @@ set( IXWEBSOCKET_SOURCES | ||||
|     ixwebsocket/IXSelectInterrupt.cpp | ||||
|     ixwebsocket/IXSelectInterruptPipe.cpp | ||||
|     ixwebsocket/IXSelectInterruptFactory.cpp | ||||
|     ixwebsocket/IXConnectionState.cpp | ||||
| ) | ||||
|  | ||||
| set( IXWEBSOCKET_HEADERS | ||||
| @@ -66,6 +67,7 @@ set( IXWEBSOCKET_HEADERS | ||||
|     ixwebsocket/IXSelectInterrupt.h | ||||
|     ixwebsocket/IXSelectInterruptPipe.h | ||||
|     ixwebsocket/IXSelectInterruptFactory.h | ||||
|     ixwebsocket/IXConnectionState.h | ||||
| ) | ||||
|  | ||||
| # Platform specific code | ||||
|   | ||||
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
								
							| @@ -10,7 +10,7 @@ communication channels over a single TCP connection. *IXWebSocket* is a C++ libr | ||||
| * macOS | ||||
| * iOS | ||||
| * Linux | ||||
| * Android  | ||||
| * Android | ||||
|  | ||||
| ## Examples | ||||
|  | ||||
| @@ -63,10 +63,11 @@ Here is what the server API looks like. Note that server support is very recent | ||||
| ix::WebSocketServer server(port); | ||||
|  | ||||
| server.setOnConnectionCallback( | ||||
|     [&server](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|     [&server](std::shared_ptr<WebSocket> webSocket, | ||||
|               std::shared_ptr<ConnectionState> connectionState) | ||||
|     { | ||||
|         webSocket->setOnMessageCallback( | ||||
|             [webSocket, &server](ix::WebSocketMessageType messageType, | ||||
|             [webSocket, connectionState, &server](ix::WebSocketMessageType messageType, | ||||
|                const std::string& str, | ||||
|                size_t wireSize, | ||||
|                const ix::WebSocketErrorInfo& error, | ||||
| @@ -77,6 +78,12 @@ server.setOnConnectionCallback( | ||||
|                 { | ||||
|                     std::cerr << "New connection" << std::endl; | ||||
|  | ||||
|                     // A connection state object is available, and has a default id | ||||
|                     // You can subclass ConnectionState and pass an alternate factory | ||||
|                     // to override it. It is useful if you want to store custom | ||||
|                     // attributes per connection (authenticated bool flag, attributes, etc...) | ||||
|                     std::cerr << "id: " << connectionState->getId() << std::endl; | ||||
|  | ||||
|                     // The uri the client did connect to. | ||||
|                     std::cerr << "Uri: " << openInfo.uri << std::endl; | ||||
|  | ||||
| @@ -223,13 +230,13 @@ Here is a simplistic diagram which explains how the code is structured in term o | ||||
| +-----------------------+ --- Public | ||||
| |                       | Start the receiving Background thread. Auto reconnection. Simple websocket Ping. | ||||
| |  IXWebSocket          | Interface used by C++ test clients. No IX dependencies. | ||||
| |                       |  | ||||
| |                       | | ||||
| +-----------------------+ | ||||
| |                       | | ||||
| |  IXWebSocketServer    | Run a server and give each connections its own WebSocket object. | ||||
| |                       | Each connection is handled in a new OS thread. | ||||
| |                       | | ||||
| +-----------------------+ --- Private  | ||||
| +-----------------------+ --- Private | ||||
| |                       | | ||||
| |  IXWebSocketTransport | Low level websocket code, framing, managing raw socket. Adapted from easywsclient. | ||||
| |                       | | ||||
|   | ||||
							
								
								
									
										37
									
								
								ixwebsocket/IXConnectionState.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ixwebsocket/IXConnectionState.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  *  IXConnectionState.cpp | ||||
|  *  Author: Benjamin Sergeant | ||||
|  *  Copyright (c) 2019 Machine Zone, Inc. All rights reserved. | ||||
|  */ | ||||
|  | ||||
| #include "IXConnectionState.h" | ||||
|  | ||||
| #include <sstream> | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     std::atomic<uint64_t> ConnectionState::_globalId(0); | ||||
|  | ||||
|     ConnectionState::ConnectionState() | ||||
|     { | ||||
|         computeId(); | ||||
|     } | ||||
|  | ||||
|     void ConnectionState::computeId() | ||||
|     { | ||||
|         std::stringstream ss; | ||||
|         ss << _globalId++; | ||||
|         _id = ss.str(); | ||||
|     } | ||||
|  | ||||
|     const std::string& ConnectionState::getId() const | ||||
|     { | ||||
|         return _id; | ||||
|     } | ||||
|  | ||||
|     std::shared_ptr<ConnectionState> ConnectionState::createConnectionState() | ||||
|     { | ||||
|         return std::make_shared<ConnectionState>(); | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										33
									
								
								ixwebsocket/IXConnectionState.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								ixwebsocket/IXConnectionState.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  *  IXConnectionState.h | ||||
|  *  Author: Benjamin Sergeant | ||||
|  *  Copyright (c) 2019 Machine Zone, Inc. All rights reserved. | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string> | ||||
| #include <atomic> | ||||
| #include <memory> | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     class ConnectionState { | ||||
|     public: | ||||
|         ConnectionState(); | ||||
|         virtual ~ConnectionState() = default; | ||||
|  | ||||
|         virtual void computeId(); | ||||
|         virtual const std::string& getId() const; | ||||
|  | ||||
|         static std::shared_ptr<ConnectionState> createConnectionState(); | ||||
|  | ||||
|     protected: | ||||
|         std::string _id; | ||||
|  | ||||
|         static std::atomic<uint64_t> _globalId; | ||||
|     }; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -21,6 +21,7 @@ | ||||
| namespace ix | ||||
| { | ||||
|     std::atomic<bool> SocketOpenSSL::_openSSLInitializationSuccessful(false); | ||||
|     std::once_flag SocketOpenSSL::_openSSLInitFlag; | ||||
|  | ||||
|     SocketOpenSSL::SocketOpenSSL(int fd) : Socket(fd), | ||||
|         _ssl_connection(nullptr), | ||||
|   | ||||
| @@ -50,7 +50,7 @@ namespace ix | ||||
|         const SSL_METHOD* _ssl_method; | ||||
|         mutable std::mutex _mutex;  // OpenSSL routines are not thread-safe | ||||
|  | ||||
|         std::once_flag _openSSLInitFlag; | ||||
|         static std::once_flag _openSSLInitFlag; | ||||
|         static std::atomic<bool> _openSSLInitializationSuccessful; | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,8 @@ namespace ix | ||||
|         _host(host), | ||||
|         _backlog(backlog), | ||||
|         _maxConnections(maxConnections), | ||||
|         _stop(false) | ||||
|         _stop(false), | ||||
|         _connectionStateFactory(&ConnectionState::createConnectionState) | ||||
|     { | ||||
|  | ||||
|     } | ||||
| @@ -145,6 +146,12 @@ namespace ix | ||||
|         ::close(_serverFd); | ||||
|     } | ||||
|  | ||||
|     void SocketServer::setConnectionStateFactory( | ||||
|         const ConnectionStateFactory& connectionStateFactory) | ||||
|     { | ||||
|         _connectionStateFactory = connectionStateFactory; | ||||
|     } | ||||
|  | ||||
|     void SocketServer::run() | ||||
|     { | ||||
|         // Set the socket to non blocking mode, so that accept calls are not blocking | ||||
| @@ -214,6 +221,12 @@ namespace ix | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             std::shared_ptr<ConnectionState> connectionState; | ||||
|             if (_connectionStateFactory) | ||||
|             { | ||||
|                 connectionState = _connectionStateFactory(); | ||||
|             } | ||||
|  | ||||
|             // Launch the handleConnection work asynchronously in its own thread. | ||||
|             // | ||||
|             // the destructor of a future returned by std::async blocks, | ||||
| @@ -221,7 +234,8 @@ namespace ix | ||||
|             f = std::async(std::launch::async, | ||||
|                            &SocketServer::handleConnection, | ||||
|                            this, | ||||
|                            clientFd); | ||||
|                            clientFd, | ||||
|                            connectionState); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -6,6 +6,8 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "IXConnectionState.h" | ||||
|  | ||||
| #include <utility> // pair | ||||
| #include <string> | ||||
| #include <set> | ||||
| @@ -20,6 +22,8 @@ namespace ix | ||||
| { | ||||
|     class SocketServer { | ||||
|     public: | ||||
|         using ConnectionStateFactory = std::function<std::shared_ptr<ConnectionState>()>; | ||||
|  | ||||
|         SocketServer(int port = SocketServer::kDefaultPort, | ||||
|                      const std::string& host = SocketServer::kDefaultHost, | ||||
|                      int backlog = SocketServer::kDefaultTcpBacklog, | ||||
| @@ -27,6 +31,8 @@ namespace ix | ||||
|         virtual ~SocketServer(); | ||||
|         virtual void stop(); | ||||
|  | ||||
|         void setConnectionStateFactory(const ConnectionStateFactory& connectionStateFactory); | ||||
|  | ||||
|         const static int kDefaultPort; | ||||
|         const static std::string kDefaultHost; | ||||
|         const static int kDefaultTcpBacklog; | ||||
| @@ -60,9 +66,13 @@ namespace ix | ||||
|         std::condition_variable _conditionVariable; | ||||
|         std::mutex _conditionVariableMutex; | ||||
|  | ||||
|         // | ||||
|         ConnectionStateFactory _connectionStateFactory; | ||||
|  | ||||
|         // Methods | ||||
|         void run(); | ||||
|         virtual void handleConnection(int fd) = 0; | ||||
|         virtual void handleConnection(int fd, | ||||
|                                       std::shared_ptr<ConnectionState> connectionState) = 0; | ||||
|         virtual size_t getConnectedClientsCount() = 0; | ||||
|     }; | ||||
| } | ||||
|   | ||||
| @@ -49,10 +49,12 @@ namespace ix | ||||
|         _onConnectionCallback = callback; | ||||
|     } | ||||
|  | ||||
|     void WebSocketServer::handleConnection(int fd) | ||||
|     void WebSocketServer::handleConnection( | ||||
|         int fd, | ||||
|         std::shared_ptr<ConnectionState> connectionState) | ||||
|     { | ||||
|         auto webSocket = std::make_shared<WebSocket>(); | ||||
|         _onConnectionCallback(webSocket); | ||||
|         _onConnectionCallback(webSocket, connectionState); | ||||
|  | ||||
|         webSocket->disableAutomaticReconnection(); | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,8 @@ | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     using OnConnectionCallback = std::function<void(std::shared_ptr<WebSocket>)>; | ||||
|     using OnConnectionCallback = std::function<void(std::shared_ptr<WebSocket>, | ||||
|                                                     std::shared_ptr<ConnectionState>)>; | ||||
|  | ||||
|     class WebSocketServer : public SocketServer { | ||||
|     public: | ||||
| @@ -49,7 +50,8 @@ namespace ix | ||||
|         const static int kDefaultHandShakeTimeoutSecs; | ||||
|  | ||||
|         // Methods | ||||
|         virtual void handleConnection(int fd) final; | ||||
|         virtual void handleConnection(int fd, | ||||
|                                       std::shared_ptr<ConnectionState> connectionState) final; | ||||
|         virtual size_t getConnectedClientsCount() final; | ||||
|     }; | ||||
| } | ||||
|   | ||||
| @@ -148,7 +148,7 @@ namespace ix | ||||
|         mutable std::mutex _lastSendTimePointMutex; | ||||
|         std::chrono::time_point<std::chrono::steady_clock> _lastSendTimePoint; | ||||
|  | ||||
|         // No data was send through the socket for longer that the heartbeat period | ||||
|         // No data was send through the socket for longer than the heartbeat period | ||||
|         bool heartBeatPeriodExceeded(); | ||||
|  | ||||
|         void sendOnSocket(); | ||||
|   | ||||
| @@ -128,10 +128,11 @@ namespace | ||||
|     { | ||||
|         // A dev/null server | ||||
|         server.setOnConnectionCallback( | ||||
|             [&server, &receivedPingMessages](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [&server, &receivedPingMessages](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                                              std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket, &server, &receivedPingMessages](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState, &server, &receivedPingMessages](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -141,6 +142,7 @@ namespace | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             Logger() << "New server connection"; | ||||
|                             Logger() << "id: " << connectionState->getId(); | ||||
|                             Logger() << "Uri: " << openInfo.uri; | ||||
|                             Logger() << "Headers:"; | ||||
|                             for (auto it : openInfo.headers) | ||||
|   | ||||
| @@ -18,13 +18,32 @@ using namespace ix; | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     bool startServer(ix::WebSocketServer& server) | ||||
|     // Test that we can override the connectionState impl to provide our own | ||||
|     class ConnectionStateCustom : public ConnectionState | ||||
|     { | ||||
|         void computeId() | ||||
|         { | ||||
|             // a very boring invariant id that we can test against in the unittest | ||||
|             _id = "foobarConnectionId"; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     bool startServer(ix::WebSocketServer& server, | ||||
|                      std::string& connectionId) | ||||
|     { | ||||
|         auto factory = []() -> std::shared_ptr<ConnectionState> | ||||
|         { | ||||
|             return std::make_shared<ConnectionStateCustom>(); | ||||
|         }; | ||||
|         server.setConnectionStateFactory(factory); | ||||
|  | ||||
|         server.setOnConnectionCallback( | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [&server, &connectionId](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                                      std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket, &server](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState, | ||||
|                      &connectionId, &server](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -33,13 +52,18 @@ namespace ix | ||||
|                     { | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             connectionState->computeId(); | ||||
|  | ||||
|                             Logger() << "New connection"; | ||||
|                             Logger() << "id: " << connectionState->getId(); | ||||
|                             Logger() << "Uri: " << openInfo.uri; | ||||
|                             Logger() << "Headers:"; | ||||
|                             for (auto it : openInfo.headers) | ||||
|                             { | ||||
|                                 Logger() << it.first << ": " << it.second; | ||||
|                             } | ||||
|  | ||||
|                             connectionId = connectionState->getId(); | ||||
|                         } | ||||
|                         else if (messageType == ix::WebSocket_MessageType_Close) | ||||
|                         { | ||||
| @@ -78,7 +102,8 @@ TEST_CASE("Websocket_server", "[websocket_server]") | ||||
|     { | ||||
|         int port = getFreePort(); | ||||
|         ix::WebSocketServer server(port); | ||||
|         REQUIRE(startServer(server)); | ||||
|         std::string connectionId; | ||||
|         REQUIRE(startServer(server, connectionId)); | ||||
|  | ||||
|         std::string errMsg; | ||||
|         bool tls = false; | ||||
| @@ -111,7 +136,8 @@ TEST_CASE("Websocket_server", "[websocket_server]") | ||||
|     { | ||||
|         int port = getFreePort(); | ||||
|         ix::WebSocketServer server(port); | ||||
|         REQUIRE(startServer(server)); | ||||
|         std::string connectionId; | ||||
|         REQUIRE(startServer(server, connectionId)); | ||||
|  | ||||
|         std::string errMsg; | ||||
|         bool tls = false; | ||||
| @@ -147,7 +173,8 @@ TEST_CASE("Websocket_server", "[websocket_server]") | ||||
|     { | ||||
|         int port = getFreePort(); | ||||
|         ix::WebSocketServer server(port); | ||||
|         REQUIRE(startServer(server)); | ||||
|         std::string connectionId; | ||||
|         REQUIRE(startServer(server, connectionId)); | ||||
|  | ||||
|         std::string errMsg; | ||||
|         bool tls = false; | ||||
| @@ -178,6 +205,8 @@ TEST_CASE("Websocket_server", "[websocket_server]") | ||||
|         // Give us 500ms for the server to notice that clients went away | ||||
|         ix::msleep(500); | ||||
|  | ||||
|         REQUIRE(connectionId == "foobarConnectionId"); | ||||
|  | ||||
|         server.stop(); | ||||
|         REQUIRE(server.getClients().size() == 0); | ||||
|     } | ||||
|   | ||||
| @@ -217,10 +217,11 @@ namespace | ||||
|     bool startServer(ix::WebSocketServer& server) | ||||
|     { | ||||
|         server.setOnConnectionCallback( | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                       std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket, &server](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState, &server](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -230,6 +231,7 @@ namespace | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             Logger() << "New connection"; | ||||
|                             Logger() << "id: " << connectionState->getId(); | ||||
|                             Logger() << "Uri: " << openInfo.uri; | ||||
|                             Logger() << "Headers:"; | ||||
|                             for (auto it : openInfo.headers) | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class Command(object): | ||||
|         thread.join(timeout) | ||||
|  | ||||
|         if thread.is_alive(): | ||||
|             print 'Command timeout, kill it: ' + self.cmd | ||||
|             print('Command timeout, kill it: ' + self.cmd) | ||||
|             self.process.terminate() | ||||
|             thread.join() | ||||
|             return False, 255 | ||||
|   | ||||
							
								
								
									
										1
									
								
								third_party/remote_trailing_whitespaces.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								third_party/remote_trailing_whitespaces.sh
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | ||||
| find . -type f -name '*.cpp' -exec sed -i '' 's/[[:space:]]*$//' {} \+ | ||||
| find . -type f -name '*.h' -exec sed -i '' 's/[[:space:]]*$//' {} \+ | ||||
| find . -type f -name '*.md' -exec sed -i '' 's/[[:space:]]*$//' {} \+ | ||||
|   | ||||
| @@ -114,7 +114,7 @@ namespace ix | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // The first line of the response describe the return type,  | ||||
|             // The first line of the response describe the return type, | ||||
|             // => *3 (an array of 3 elements) | ||||
|             auto lineResult = _socket->readLine(nullptr); | ||||
|             auto lineValid = lineResult.first; | ||||
|   | ||||
| @@ -29,7 +29,7 @@ Subcommands: | ||||
| ws transfer # running on port 8080. | ||||
|  | ||||
| # Start receiver first | ||||
| ws receive ws://localhost:8080  | ||||
| ws receive ws://localhost:8080 | ||||
|  | ||||
| # Then send a file. File will be received and written to disk by the receiver process | ||||
| ws send ws://localhost:8080 /file/to/path | ||||
|   | ||||
| @@ -17,10 +17,11 @@ namespace ix | ||||
|         ix::WebSocketServer server(port, hostname); | ||||
|  | ||||
|         server.setOnConnectionCallback( | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [&server](std::shared_ptr<WebSocket> webSocket, | ||||
|                       std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket, &server](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState, &server](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -30,6 +31,7 @@ namespace ix | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             std::cerr << "New connection" << std::endl; | ||||
|                             std::cerr << "id: " << connectionState->getId() << std::endl; | ||||
|                             std::cerr << "Uri: " << openInfo.uri << std::endl; | ||||
|                             std::cerr << "Headers:" << std::endl; | ||||
|                             for (auto it : openInfo.headers) | ||||
|   | ||||
| @@ -17,10 +17,11 @@ namespace ix | ||||
|         ix::WebSocketServer server(port, hostname); | ||||
|  | ||||
|         server.setOnConnectionCallback( | ||||
|             [](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -30,6 +31,7 @@ namespace ix | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             std::cerr << "New connection" << std::endl; | ||||
|                             std::cerr << "id: " << connectionState->getId() << std::endl; | ||||
|                             std::cerr << "Uri: " << openInfo.uri << std::endl; | ||||
|                             std::cerr << "Headers:" << std::endl; | ||||
|                             for (auto it : openInfo.headers) | ||||
|   | ||||
| @@ -17,10 +17,11 @@ namespace ix | ||||
|         ix::WebSocketServer server(port, hostname); | ||||
|  | ||||
|         server.setOnConnectionCallback( | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket) | ||||
|             [&server](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                       std::shared_ptr<ConnectionState> connectionState) | ||||
|             { | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [webSocket, &server](ix::WebSocketMessageType messageType, | ||||
|                     [webSocket, connectionState, &server](ix::WebSocketMessageType messageType, | ||||
|                        const std::string& str, | ||||
|                        size_t wireSize, | ||||
|                        const ix::WebSocketErrorInfo& error, | ||||
| @@ -30,6 +31,7 @@ namespace ix | ||||
|                         if (messageType == ix::WebSocket_MessageType_Open) | ||||
|                         { | ||||
|                             std::cerr << "New connection" << std::endl; | ||||
|                             std::cerr << "id: " << connectionState->getId() << std::endl; | ||||
|                             std::cerr << "Uri: " << openInfo.uri << std::endl; | ||||
|                             std::cerr << "Headers:" << std::endl; | ||||
|                             for (auto it : openInfo.headers) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user