| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #ifndef NETDATA_WEBSOCKET_COMPRESSION_H |
| 4 | #define NETDATA_WEBSOCKET_COMPRESSION_H |
| 5 | |
| 6 | #include "websocket-internal.h" |
| 7 | |
| 8 | // WebSocket compression constants |
| 9 | #define WS_COMPRESS_WINDOW_BITS 15 // Default window bits (RFC 7692) |
| 10 | #define WS_COMPRESS_MEMLEVEL 8 // Default memory level for zlib |
| 11 | #define WS_COMPRESS_DEFAULT_LEVEL Z_DEFAULT_COMPRESSION // Default compression level |
| 12 | #define WS_COMPRESS_MIN_SIZE 64 // Don't compress payloads smaller than this |
| 13 | |
| 14 | // WebSocket compression extension types |
| 15 | typedef enum { |
| 16 | WS_COMPRESS_NONE = 0, // No compression |
| 17 | WS_COMPRESS_DEFLATE = 1 // permessage-deflate extension |
| 18 | } WEBSOCKET_COMPRESSION_TYPE; |
| 19 | |
| 20 | // WebSocket compression context structure |
| 21 | typedef struct websocket_compression_context { |
| 22 | WEBSOCKET_COMPRESSION_TYPE type; // Compression type |
| 23 | bool enabled; // Whether compression is enabled |
| 24 | bool client_context_takeover; // Client context takeover |
| 25 | bool server_context_takeover; // Server context takeover |
| 26 | int client_max_window_bits; // Max window bits for client-to-server messages (8-15) |
| 27 | int server_max_window_bits; // Max window bits for server-to-client messages (8-15) |
| 28 | int compression_level; // Compression level |
| 29 | z_stream *deflate_stream; // Deflate context for outgoing messages (server-to-client) |
| 30 | z_stream *inflate_stream; // Inflate context for incoming messages (client-to-server) |
| 31 | } WEBSOCKET_COMPRESSION_CTX; |
| 32 | |
| 33 | #define WEBSOCKET_COMPRESSION_DEFAULTS (WEBSOCKET_COMPRESSION_CTX){ \ |
| 34 | .type = WS_COMPRESS_NONE, \ |
| 35 | .enabled = false, \ |
| 36 | .client_context_takeover = true, \ |
| 37 | .server_context_takeover = true, \ |
| 38 | .client_max_window_bits = WS_COMPRESS_WINDOW_BITS, \ |
| 39 | .server_max_window_bits = WS_COMPRESS_WINDOW_BITS, \ |
| 40 | .compression_level = WS_COMPRESS_DEFAULT_LEVEL, \ |
| 41 | .deflate_stream = NULL, \ |
| 42 | .inflate_stream = NULL, \ |
| 43 | } |
| 44 | |
| 45 | // Forward declaration |
| 46 | struct websocket_server_client; |
| 47 | |
| 48 | // Function declarations |
| 49 | bool websocket_compression_init(struct websocket_server_client *wsc); |
| 50 | void websocket_compression_cleanup(struct websocket_server_client *wsc); |
| 51 | bool websocket_compression_reset(struct websocket_server_client *wsc); |
| 52 | |
| 53 | // Decompression-specific functions |
| 54 | bool websocket_decompression_init(struct websocket_server_client *wsc); |
| 55 | void websocket_decompression_cleanup(struct websocket_server_client *wsc); |
| 56 | bool websocket_decompression_reset(struct websocket_server_client *wsc); |
| 57 | |
| 58 | // Compression function for outbound messages |
| 59 | bool websocket_client_compress_message(struct websocket_server_client *wsc, const char *data, size_t length); |
| 60 | |
| 61 | #endif // NETDATA_WEBSOCKET_COMPRESSION_H |