Added gzip compression support to file caching mechanism (can be broken idk we will see)
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -57,3 +57,4 @@ ssl/*
|
||||
.github/*
|
||||
!.github/workflows/
|
||||
src/bin
|
||||
docker-push.sh
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
61
src/server.c
61
src/server.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user