Compare commits
	
		
			1 Commits
		
	
	
		
			v7.9.6
			...
			feature/ss
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 22118d68d2 | 
| @@ -20,6 +20,7 @@ | ||||
| #include <sys/time.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
| #include <sstream> | ||||
| #define socketerrno errno | ||||
|  | ||||
| #include <Security/SecureTransport.h> | ||||
| @@ -31,12 +32,17 @@ namespace ix | ||||
|         , _sslContext(nullptr) | ||||
|         , _tlsOptions(tlsOptions) | ||||
|     { | ||||
|         ; | ||||
|         _sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType); | ||||
|         SSLSetIOFuncs( | ||||
|             _sslContext, SocketAppleSSL::readFromSocket, SocketAppleSSL::writeToSocket); | ||||
|     } | ||||
|  | ||||
|     SocketAppleSSL::~SocketAppleSSL() | ||||
|     { | ||||
|         SocketAppleSSL::close(); | ||||
|         CFRelease(_sslContext); | ||||
|         _sslContext = nullptr; | ||||
|  | ||||
|         Socket::close(); | ||||
|     } | ||||
|  | ||||
|     std::string SocketAppleSSL::getSSLErrorDescription(OSStatus status) | ||||
| @@ -177,14 +183,16 @@ namespace ix | ||||
|             _sockfd = SocketConnect::connect(host, port, errMsg, isCancellationRequested); | ||||
|             if (_sockfd == -1) return false; | ||||
|  | ||||
|             _sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType); | ||||
|  | ||||
|             SSLSetIOFuncs( | ||||
|                 _sslContext, SocketAppleSSL::readFromSocket, SocketAppleSSL::writeToSocket); | ||||
|             SSLSetConnection(_sslContext, (SSLConnectionRef)(long) _sockfd); | ||||
|             SSLSetProtocolVersionMin(_sslContext, kTLSProtocol12); | ||||
|             SSLSetPeerDomainName(_sslContext, host.c_str(), host.size()); | ||||
|  | ||||
|             // Record a peer id, which speed up SSL connection when reconnecting to the same host | ||||
|             std::stringstream ss; | ||||
|             ss << host << ":" << port; | ||||
|             _peerId = ss.str(); | ||||
|             SSLSetPeerID(_sslContext, (void*) _peerId.c_str(), _peerId.size()); | ||||
|  | ||||
|             if (_tlsOptions.isPeerVerifyDisabled()) | ||||
|             { | ||||
|                 Boolean option(1); | ||||
| @@ -227,12 +235,7 @@ namespace ix | ||||
|     { | ||||
|         std::lock_guard<std::mutex> lock(_mutex); | ||||
|  | ||||
|         if (_sslContext == nullptr) return; | ||||
|  | ||||
|         SSLClose(_sslContext); | ||||
|         CFRelease(_sslContext); | ||||
|         _sslContext = nullptr; | ||||
|  | ||||
|         Socket::close(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -41,6 +41,8 @@ namespace ix | ||||
|         mutable std::mutex _mutex; // AppleSSL routines are not thread-safe | ||||
|  | ||||
|         SocketTLSOptions _tlsOptions; | ||||
|  | ||||
|         std::string _peerId; | ||||
|     }; | ||||
|  | ||||
| } // namespace ix | ||||
|   | ||||
| @@ -19,10 +19,12 @@ | ||||
| #include <linux/tcp.h> | ||||
| #endif | ||||
|  | ||||
| #include <iostream> | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     // | ||||
|     // This function can be cancelled every 50 ms | ||||
|     // This function can be cancelled every 10 ms | ||||
|     // This is important so that we don't block the main UI thread when shutting down a | ||||
|     // connection which is already trying to reconnect, and can be blocked waiting for | ||||
|     // ::connect to respond. | ||||
| @@ -44,8 +46,15 @@ namespace ix | ||||
|         // block us for too long | ||||
|         SocketConnect::configure(fd); | ||||
|  | ||||
|         auto start = std::chrono::system_clock::now(); | ||||
|  | ||||
|         int res = ::connect(fd, address->ai_addr, address->ai_addrlen); | ||||
|  | ||||
|         auto now = std::chrono::system_clock::now(); | ||||
|         auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now - start); | ||||
|         auto ms = milliseconds.count(); | ||||
|         std::cout << "tcp connection completed in " << ms << "ms" << std::endl; | ||||
|  | ||||
|         if (res == -1 && !Socket::isWaitNeeded()) | ||||
|         { | ||||
|             errMsg = strerror(Socket::getErrno()); | ||||
| @@ -98,11 +107,19 @@ namespace ix | ||||
|                                std::string& errMsg, | ||||
|                                const CancellationRequest& isCancellationRequested) | ||||
|     { | ||||
|         auto start = std::chrono::system_clock::now(); | ||||
|  | ||||
|         // | ||||
|         // First do DNS resolution | ||||
|         // | ||||
|         auto dnsLookup = std::make_shared<DNSLookup>(hostname, port); | ||||
|         struct addrinfo* res = dnsLookup->resolve(errMsg, isCancellationRequested); | ||||
|  | ||||
|         auto now = std::chrono::system_clock::now(); | ||||
|         auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now - start); | ||||
|         auto ms = milliseconds.count(); | ||||
|         std::cout << "dns resolution completed in " << ms << "ms" << std::endl; | ||||
|  | ||||
|         if (res == nullptr) | ||||
|         { | ||||
|             return -1; | ||||
|   | ||||
| @@ -15,6 +15,9 @@ | ||||
| #include <random> | ||||
| #include <sstream> | ||||
|  | ||||
| #include <iostream> | ||||
| #include <chrono> | ||||
|  | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
| @@ -97,8 +100,16 @@ namespace ix | ||||
|         auto isCancellationRequested = | ||||
|             makeCancellationRequestWithTimeout(timeoutSecs, _requestInitCancellation); | ||||
|  | ||||
|         auto start = std::chrono::system_clock::now(); | ||||
|  | ||||
|         std::string errMsg; | ||||
|         bool success = _socket->connect(host, port, errMsg, isCancellationRequested); | ||||
|  | ||||
|         auto now = std::chrono::system_clock::now(); | ||||
|         auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now - start); | ||||
|         auto ms = milliseconds.count(); | ||||
|         std::cout << "connection completed in " << ms << "ms" << std::endl; | ||||
|  | ||||
|         if (!success) | ||||
|         { | ||||
|             std::stringstream ss; | ||||
|   | ||||
| @@ -151,7 +151,18 @@ namespace ix | ||||
|  | ||||
|         std::string errorMsg; | ||||
|         bool tls = protocol == "wss"; | ||||
|  | ||||
|         if (_host == host) | ||||
|         { | ||||
|             _socket->close(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             _socket = createSocket(tls, -1, errorMsg, _socketTLSOptions); | ||||
|         } | ||||
|  | ||||
|         // Record the host for later | ||||
|         _host = host; | ||||
|  | ||||
|         if (!_socket) | ||||
|         { | ||||
|   | ||||
| @@ -107,7 +107,7 @@ namespace ix | ||||
|         size_t bufferedAmount() const; | ||||
|  | ||||
|     private: | ||||
|         std::string _url; | ||||
|         std::string _host; | ||||
|  | ||||
|         struct wsheader_type | ||||
|         { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user