Compare commits
	
		
			5 Commits
		
	
	
		
			v11.4.2
			...
			feature/zl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 5036e338c7 | ||
|  | 80fb8cfb59 | ||
|  | 43c0ae0812 | ||
|  | dcc447ec4a | ||
|  | 5127094f0e | 
							
								
								
									
										13
									
								
								.github/workflows/unittest_linux.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/workflows/unittest_linux.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,13 +0,0 @@ | ||||
| name: linux | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|     - 'docs/**' | ||||
|  | ||||
| jobs: | ||||
|   linux: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: make test_make | ||||
|       run: make test_make | ||||
							
								
								
									
										15
									
								
								.github/workflows/unittest_mac_tsan_mbedtls.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/unittest_mac_tsan_mbedtls.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,15 +0,0 @@ | ||||
| name: mac_tsan_mbedtls | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|     - 'docs/**' | ||||
|  | ||||
| jobs: | ||||
|   mac_tsan_mbedtls: | ||||
|     runs-on: macOS-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: install mbedtls | ||||
|       run: brew install mbedtls | ||||
|     - name: make test | ||||
|       run: make test_tsan_mbedtls | ||||
							
								
								
									
										15
									
								
								.github/workflows/unittest_mac_tsan_openssl.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/unittest_mac_tsan_openssl.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,15 +0,0 @@ | ||||
| name: mac_tsan_openssl | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|     - 'docs/**' | ||||
|  | ||||
| jobs: | ||||
|   mac_tsan_openssl: | ||||
|     runs-on: macOS-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: install openssl | ||||
|       run: brew install openssl@1.1 | ||||
|     - name: make test | ||||
|       run: make test_tsan_openssl | ||||
| @@ -1,13 +0,0 @@ | ||||
| name: mac_tsan_sectransport | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|     - 'docs/**' | ||||
|  | ||||
| jobs: | ||||
|   mac_tsan_sectransport: | ||||
|     runs-on: macOS-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: make test_tsan | ||||
|       run: make test_tsan | ||||
							
								
								
									
										40
									
								
								.github/workflows/unittest_uwp.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								.github/workflows/unittest_uwp.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,40 +0,0 @@ | ||||
| name: uwp | ||||
| on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|     - 'docs/**' | ||||
|  | ||||
| jobs: | ||||
|   uwp: | ||||
|     runs-on: windows-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - uses: seanmiddleditch/gha-setup-vsdevenv@master | ||||
|     - run: | | ||||
|         vcpkg install zlib:x64-uwp | ||||
|     - run: | | ||||
|         mkdir build | ||||
|         cd build | ||||
|         cmake -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0" -DCMAKE_CXX_COMPILER=cl.exe -DUSE_TEST=1 .. | ||||
|     - run: cmake --build build | ||||
|  | ||||
| # | ||||
| #   Windows with OpenSSL is working but disabled as it takes 13 minutes (10 for openssl) to build with vcpkg | ||||
| # | ||||
| #   windows_openssl: | ||||
| #     runs-on: windows-latest | ||||
| #     steps: | ||||
| #     - uses: actions/checkout@v1 | ||||
| #     - uses: seanmiddleditch/gha-setup-vsdevenv@master | ||||
| #     - run: | | ||||
| #         vcpkg install zlib:x64-windows | ||||
| #         vcpkg install openssl:x64-windows | ||||
| #     - run: | | ||||
| #         mkdir build | ||||
| #         cd build | ||||
| #         cmake -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_CXX_COMPILER=cl.exe -DUSE_OPEN_SSL=1 -DUSE_TLS=1 -DUSE_WS=1 -DUSE_TEST=1 .. | ||||
| #     - run: cmake --build build | ||||
| #  | ||||
| #     # Running the unittest does not work, the binary cannot be found | ||||
| #     #- run: ../build/test/ixwebsocket_unittest.exe | ||||
| #     # working-directory: test | ||||
							
								
								
									
										6
									
								
								.github/workflows/unittest_windows.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/unittest_windows.yml
									
									
									
									
										vendored
									
									
								
							| @@ -10,10 +10,10 @@ jobs: | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - uses: seanmiddleditch/gha-setup-vsdevenv@master | ||||
|     - run: | | ||||
|         vcpkg install zlib:x64-windows | ||||
|     - run: | | ||||
|         mkdir build | ||||
|         cd build | ||||
|         cmake -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_CXX_COMPILER=cl.exe -DUSE_WS=1 -DUSE_TEST=1 .. | ||||
|         cmake -DCMAKE_CXX_COMPILER=cl.exe -DUSE_WS=1 -DUSE_TEST=1 -DUSE_ZLIB=0 .. | ||||
|     - run: cmake --build build | ||||
|     - run: ../build/test/ixwebsocket_unittest.exe | ||||
|       working-directory: test | ||||
|   | ||||
| @@ -190,11 +190,19 @@ if (USE_TLS) | ||||
|   endif() | ||||
| endif() | ||||
|  | ||||
| option(USE_ZLIB "Enable zlib support" TRUE) | ||||
|  | ||||
| if (USE_ZLIB) | ||||
|   # Use ZLIB_ROOT CMake variable if you need to use your own zlib | ||||
| find_package(ZLIB REQUIRED) | ||||
|   find_package(ZLIB) | ||||
|   if (ZLIB_FOUND) | ||||
|     include_directories(${ZLIB_INCLUDE_DIRS}) | ||||
|     target_link_libraries(ixwebsocket ${ZLIB_LIBRARIES}) | ||||
|  | ||||
|     target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_ZLIB) | ||||
|   endif() | ||||
| endif() | ||||
|  | ||||
| if (WIN32) | ||||
|   target_link_libraries(ixwebsocket wsock32 ws2_32 shlwapi) | ||||
|   add_definitions(-D_CRT_SECURE_NO_WARNINGS) | ||||
|   | ||||
| @@ -16,7 +16,10 @@ | ||||
| #include <random> | ||||
| #include <sstream> | ||||
| #include <vector> | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
| #include <zlib.h> | ||||
| #endif | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
| @@ -174,11 +177,13 @@ namespace ix | ||||
|         ss << verb << " " << path << " HTTP/1.1\r\n"; | ||||
|         ss << "Host: " << host << "\r\n"; | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         if (args->compress) | ||||
|         { | ||||
|             ss << "Accept-Encoding: gzip" | ||||
|                << "\r\n"; | ||||
|         } | ||||
| #endif | ||||
|  | ||||
|         // Append extra headers | ||||
|         for (auto&& it : args->extraHeaders) | ||||
| @@ -495,6 +500,7 @@ namespace ix | ||||
|  | ||||
|         downloadSize = payload.size(); | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         // If the content was compressed with gzip, decode it | ||||
|         if (headers["Content-Encoding"] == "gzip") | ||||
|         { | ||||
| @@ -513,6 +519,7 @@ namespace ix | ||||
|             } | ||||
|             payload = decompressedPayload; | ||||
|         } | ||||
| #endif | ||||
|  | ||||
|         return std::make_shared<HttpResponse>(code, | ||||
|                                               description, | ||||
| @@ -672,6 +679,7 @@ namespace ix | ||||
|         return ss.str(); | ||||
|     } | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|     bool HttpClient::gzipInflate(const std::string& in, std::string& out) | ||||
|     { | ||||
|         z_stream inflateState; | ||||
| @@ -716,6 +724,7 @@ namespace ix | ||||
|         inflateEnd(&inflateState); | ||||
|         return true; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     void HttpClient::log(const std::string& msg, HttpRequestArgsPtr args) | ||||
|     { | ||||
|   | ||||
| @@ -90,7 +90,9 @@ namespace ix | ||||
|     private: | ||||
|         void log(const std::string& msg, HttpRequestArgsPtr args); | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         bool gzipInflate(const std::string& in, std::string& out); | ||||
| #endif | ||||
|  | ||||
|         // Async API background thread runner | ||||
|         void run(); | ||||
|   | ||||
| @@ -13,7 +13,10 @@ | ||||
| #include <fstream> | ||||
| #include <sstream> | ||||
| #include <vector> | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
| #include <zlib.h> | ||||
| #endif | ||||
|  | ||||
| namespace | ||||
| { | ||||
| @@ -41,6 +44,7 @@ namespace | ||||
|         return std::make_pair(res.first, std::string(vec.begin(), vec.end())); | ||||
|     } | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|     std::string gzipCompress(const std::string& str) | ||||
|     { | ||||
|         z_stream zs; // z_stream is zlib's control structure | ||||
| @@ -83,6 +87,7 @@ namespace | ||||
|  | ||||
|         return outstring; | ||||
|     } | ||||
| #endif | ||||
| } // namespace | ||||
|  | ||||
| namespace ix | ||||
| @@ -168,12 +173,14 @@ namespace ix | ||||
|  | ||||
|                 std::string content = res.second; | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|                 std::string acceptEncoding = request->headers["Accept-encoding"]; | ||||
|                 if (acceptEncoding == "*" || acceptEncoding.find("gzip") != std::string::npos) | ||||
|                 { | ||||
|                     content = gzipCompress(content); | ||||
|                     headers["Content-Encoding"] = "gzip"; | ||||
|                 } | ||||
| #endif | ||||
|  | ||||
|                 // Log request | ||||
|                 std::stringstream ss; | ||||
|   | ||||
| @@ -8,7 +8,9 @@ | ||||
|  | ||||
| #include "IXWebSocketVersion.h" | ||||
| #include <sstream> | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
| #include <zlib.h> | ||||
| #endif | ||||
|  | ||||
| // Platform name | ||||
| #if defined(_WIN32) | ||||
| @@ -77,8 +79,10 @@ namespace ix | ||||
|         ss << " nossl"; | ||||
| #endif | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         // Zlib version | ||||
|         ss << " zlib " << ZLIB_VERSION; | ||||
| #endif | ||||
|  | ||||
|         return ss.str(); | ||||
|     } | ||||
|   | ||||
| @@ -28,21 +28,26 @@ namespace ix | ||||
|     WebSocketPerMessageDeflateCompressor::WebSocketPerMessageDeflateCompressor() | ||||
|         : _compressBufferSize(kBufferSize) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         memset(&_deflateState, 0, sizeof(_deflateState)); | ||||
|  | ||||
|         _deflateState.zalloc = Z_NULL; | ||||
|         _deflateState.zfree = Z_NULL; | ||||
|         _deflateState.opaque = Z_NULL; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     WebSocketPerMessageDeflateCompressor::~WebSocketPerMessageDeflateCompressor() | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         deflateEnd(&_deflateState); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool WebSocketPerMessageDeflateCompressor::init(uint8_t deflateBits, | ||||
|                                                     bool clientNoContextTakeOver) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         int ret = deflateInit2(&_deflateState, | ||||
|                                Z_DEFAULT_COMPRESSION, | ||||
|                                Z_DEFLATED, | ||||
| @@ -57,6 +62,9 @@ namespace ix | ||||
|         _flush = (clientNoContextTakeOver) ? Z_FULL_FLUSH : Z_SYNC_FLUSH; | ||||
|  | ||||
|         return true; | ||||
| #else | ||||
|         return false; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     template<typename T> | ||||
| @@ -96,6 +104,7 @@ namespace ix | ||||
|     template<typename T, typename S> | ||||
|     bool WebSocketPerMessageDeflateCompressor::compressData(const T& in, S& out) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         // | ||||
|         // 7.2.1.  Compression | ||||
|         // | ||||
| @@ -152,6 +161,9 @@ namespace ix | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
| #else | ||||
|         return false; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     // | ||||
| @@ -160,6 +172,7 @@ namespace ix | ||||
|     WebSocketPerMessageDeflateDecompressor::WebSocketPerMessageDeflateDecompressor() | ||||
|         : _compressBufferSize(kBufferSize) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         memset(&_inflateState, 0, sizeof(_inflateState)); | ||||
|  | ||||
|         _inflateState.zalloc = Z_NULL; | ||||
| @@ -167,16 +180,20 @@ namespace ix | ||||
|         _inflateState.opaque = Z_NULL; | ||||
|         _inflateState.avail_in = 0; | ||||
|         _inflateState.next_in = Z_NULL; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     WebSocketPerMessageDeflateDecompressor::~WebSocketPerMessageDeflateDecompressor() | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         inflateEnd(&_inflateState); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool WebSocketPerMessageDeflateDecompressor::init(uint8_t inflateBits, | ||||
|                                                       bool clientNoContextTakeOver) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         int ret = inflateInit2(&_inflateState, -1 * inflateBits); | ||||
|  | ||||
|         if (ret != Z_OK) return false; | ||||
| @@ -186,10 +203,14 @@ namespace ix | ||||
|         _flush = (clientNoContextTakeOver) ? Z_FULL_FLUSH : Z_SYNC_FLUSH; | ||||
|  | ||||
|         return true; | ||||
| #else | ||||
|         return false; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool WebSocketPerMessageDeflateDecompressor::decompress(const std::string& in, std::string& out) | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         // | ||||
|         // 7.2.2.  Decompression | ||||
|         // | ||||
| @@ -226,5 +247,8 @@ namespace ix | ||||
|         } while (_inflateState.avail_out == 0); | ||||
|  | ||||
|         return true; | ||||
| #else | ||||
|         return false; | ||||
| #endif | ||||
|     } | ||||
| } // namespace ix | ||||
|   | ||||
| @@ -6,7 +6,9 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
| #include "zlib.h" | ||||
| #endif | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| @@ -34,7 +36,10 @@ namespace ix | ||||
|         int _flush; | ||||
|         size_t _compressBufferSize; | ||||
|         std::unique_ptr<unsigned char[]> _compressBuffer; | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         z_stream _deflateState; | ||||
| #endif | ||||
|     }; | ||||
|  | ||||
|     class WebSocketPerMessageDeflateDecompressor | ||||
| @@ -50,7 +55,10 @@ namespace ix | ||||
|         int _flush; | ||||
|         size_t _compressBufferSize; | ||||
|         std::unique_ptr<unsigned char[]> _compressBuffer; | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         z_stream _inflateState; | ||||
| #endif | ||||
|     }; | ||||
|  | ||||
| } // namespace ix | ||||
|   | ||||
| @@ -61,6 +61,7 @@ namespace ix | ||||
|         _clientMaxWindowBits = kDefaultClientMaxWindowBits; | ||||
|         _serverMaxWindowBits = kDefaultServerMaxWindowBits; | ||||
|  | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         // Split by ; | ||||
|         std::string token; | ||||
|         std::stringstream tokenStream(extension); | ||||
| @@ -112,6 +113,7 @@ namespace ix | ||||
|                 sanitizeClientMaxWindowBits(); | ||||
|             } | ||||
|         } | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     void WebSocketPerMessageDeflateOptions::sanitizeClientMaxWindowBits() | ||||
| @@ -126,6 +128,7 @@ namespace ix | ||||
|  | ||||
|     std::string WebSocketPerMessageDeflateOptions::generateHeader() | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         std::stringstream ss; | ||||
|         ss << "Sec-WebSocket-Extensions: permessage-deflate"; | ||||
|  | ||||
| @@ -138,11 +141,18 @@ namespace ix | ||||
|         ss << "\r\n"; | ||||
|  | ||||
|         return ss.str(); | ||||
| #else | ||||
|         return std::string(); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool WebSocketPerMessageDeflateOptions::enabled() const | ||||
|     { | ||||
| #ifdef IXWEBSOCKET_USE_ZLIB | ||||
|         return _enabled; | ||||
| #else | ||||
|         return false; | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool WebSocketPerMessageDeflateOptions::getClientNoContextTakeover() const | ||||
|   | ||||
							
								
								
									
										2
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								makefile
									
									
									
									
									
								
							| @@ -34,7 +34,7 @@ ws: | ||||
| 	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DUSE_PYTHON=1 -DUSE_TLS=1 -DUSE_WS=1 .. && ninja install) | ||||
|  | ||||
| ws_install: | ||||
| 	mkdir -p build && (cd build ; cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_PYTHON=1 -DUSE_TLS=1 -DUSE_WS=1 .. && make -j 4 install) | ||||
| 	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_ZLIB=0 -DUSE_PYTHON=1 -DUSE_TLS=1 -DUSE_WS=1 .. && ninja install) | ||||
|  | ||||
| ws_openssl: | ||||
| 	mkdir -p build && (cd build ; cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_PYTHON=1 -DUSE_TLS=1 -DUSE_WS=1 -DUSE_OPEN_SSL=1 .. ; make -j 4) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user