Added gzip compression support to file caching mechanism (can be broken idk we will see)

This commit is contained in:
2025-11-24 21:22:16 +01:00
parent 88fee91088
commit 729844a13c
5 changed files with 69 additions and 22 deletions

1
.gitignore vendored
View File

@@ -57,3 +57,4 @@ ssl/*
.github/*
!.github/workflows/
src/bin
docker-push.sh

View File

@@ -97,6 +97,7 @@ sudo apt-get install -y \
libssl-dev \
libmagic-dev \
libnghttp2-dev \
zlib1g-dev \
pkg-config
```
@@ -111,7 +112,7 @@ cd Carbon
# Install dependencies
sudo apt-get update
sudo apt-get install -y build-essential libssl-dev libmagic-dev libnghttp2-dev
sudo apt-get install -y build-essential libssl-dev libmagic-dev libnghttp2-dev zlib1g-dev pkg-config
# Build the server
make

View File

@@ -218,6 +218,10 @@ void cache_file_mmap(const char *path, size_t size, const char *mime_type)
{
munmap(mmap_cache[slot].mmap_data, mmap_cache[slot].size);
}
if (mmap_cache[slot].compressed_data)
{
free(mmap_cache[slot].compressed_data);
}
free(mmap_cache[slot].path);
free(mmap_cache[slot].mime_type);
}
@@ -249,6 +253,8 @@ void cache_file_mmap(const char *path, size_t size, const char *mime_type)
mmap_cache[slot].path = strdup(path);
mmap_cache[slot].mmap_data = mapped;
mmap_cache[slot].size = size;
mmap_cache[slot].compressed_data = NULL;
mmap_cache[slot].compressed_size = 0;
mmap_cache[slot].last_access = time(NULL);
mmap_cache[slot].mime_type = strdup(mime_type);
mmap_cache[slot].ref_count = 0;

View File

@@ -34,6 +34,8 @@ typedef struct
char *path;
void *mmap_data;
size_t size;
void *compressed_data;
size_t compressed_size;
time_t last_access;
char *mime_type;
int ref_count;

View File

@@ -716,29 +716,44 @@ void *handle_http_client(void *arg)
unsigned char *compressed_data = NULL;
size_t compressed_size = 0;
int using_compression = 0;
char debug_msg[256];
snprintf(debug_msg, sizeof(debug_msg), "accepts_gzip=%d, should_compress=%d, size=%zu",
accepts_gzip, should_compress(cached->mime_type), cached->size);
log_event(debug_msg);
int needs_free = 0;
if (accepts_gzip && should_compress(cached->mime_type) && cached->size > 1024)
{
// Check if we have cached compressed version
if (cached->compressed_data && cached->compressed_size > 0)
{
// Use pre-compressed cached data
compressed_data = cached->compressed_data;
compressed_size = cached->compressed_size;
using_compression = 1;
needs_free = 0;
}
else
{
// Compress on-the-fly and cache it
compressed_data = gzip_compress((unsigned char *)cached->mmap_data, cached->size, &compressed_size);
if (compressed_data && compressed_size < cached->size * 0.9) // Only use if 10%+ savings
if (compressed_data && compressed_size < cached->size * 0.9)
{
using_compression = 1;
snprintf(debug_msg, sizeof(debug_msg), "Compression: %zu -> %zu bytes (%.1f%%)",
cached->size, compressed_size, (compressed_size * 100.0) / cached->size);
log_event(debug_msg);
needs_free = 1;
// Cache the compressed version for future requests
cached->compressed_data = malloc(compressed_size);
if (cached->compressed_data)
{
memcpy(cached->compressed_data, compressed_data, compressed_size);
cached->compressed_size = compressed_size;
needs_free = 0;
}
}
else if (compressed_data)
{
log_event("Compression not efficient enough, skipping");
free(compressed_data);
compressed_data = NULL;
}
}
}
// Serve from cache with optional compression
char response_header[2048];
@@ -790,7 +805,7 @@ void *handle_http_client(void *arg)
}
}
if (compressed_data)
if (needs_free && compressed_data)
free(compressed_data);
release_cached_file(cached);
free(mime_type);
@@ -1098,13 +1113,34 @@ void *handle_https_client(void *arg)
unsigned char *compressed_data = NULL;
size_t compressed_size = 0;
int using_compression = 0;
int needs_free = 0;
if (accepts_gzip && should_compress(cached->mime_type) && cached->size > 1024)
{
// Check if we have cached compressed version
if (cached->compressed_data && cached->compressed_size > 0)
{
compressed_data = cached->compressed_data;
compressed_size = cached->compressed_size;
using_compression = 1;
needs_free = 0;
}
else
{
compressed_data = gzip_compress((unsigned char *)cached->mmap_data, cached->size, &compressed_size);
if (compressed_data && compressed_size < cached->size * 0.9)
{
using_compression = 1;
needs_free = 1;
// Cache the compressed version
cached->compressed_data = malloc(compressed_size);
if (cached->compressed_data)
{
memcpy(cached->compressed_data, compressed_data, compressed_size);
cached->compressed_size = compressed_size;
needs_free = 0;
}
}
else if (compressed_data)
{
@@ -1112,6 +1148,7 @@ void *handle_https_client(void *arg)
compressed_data = NULL;
}
}
}
// Serve from cache with optional compression
char response_header[2048];
@@ -1150,7 +1187,7 @@ void *handle_https_client(void *arg)
total_sent += sent;
}
if (compressed_data)
if (needs_free && compressed_data)
free(compressed_data);
release_cached_file(cached);
free(mime_type);