|
|
|
@ -40,6 +40,8 @@
|
|
|
|
|
#define HTTP_ACCEPT_ENCODING_DEFLATE BV(2) |
|
|
|
|
#define HTTP_ACCEPT_ENCODING_COMPRESS BV(3) |
|
|
|
|
#define HTTP_ACCEPT_ENCODING_BZIP2 BV(4) |
|
|
|
|
#define HTTP_ACCEPT_ENCODING_X_GZIP BV(5) |
|
|
|
|
#define HTTP_ACCEPT_ENCODING_X_BZIP2 BV(6) |
|
|
|
|
|
|
|
|
|
#ifdef __WIN32 |
|
|
|
|
# define mkdir(x,y) mkdir(x) |
|
|
|
@ -188,7 +190,9 @@ SETDEFAULTS_FUNC(mod_compress_setdefaults) {
|
|
|
|
|
data_string *ds = (data_string *)encodings_arr->data[j]; |
|
|
|
|
#ifdef USE_ZLIB |
|
|
|
|
if (NULL != strstr(ds->value->ptr, "gzip")) |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_GZIP; |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_GZIP | HTTP_ACCEPT_ENCODING_X_GZIP; |
|
|
|
|
if (NULL != strstr(ds->value->ptr, "x-gzip")) |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_X_GZIP; |
|
|
|
|
if (NULL != strstr(ds->value->ptr, "deflate")) |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_DEFLATE; |
|
|
|
|
/*
|
|
|
|
@ -198,17 +202,19 @@ SETDEFAULTS_FUNC(mod_compress_setdefaults) {
|
|
|
|
|
#endif |
|
|
|
|
#ifdef USE_BZ2LIB |
|
|
|
|
if (NULL != strstr(ds->value->ptr, "bzip2")) |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_BZIP2; |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_BZIP2 | HTTP_ACCEPT_ENCODING_X_BZIP2; |
|
|
|
|
if (NULL != strstr(ds->value->ptr, "x-bzip2")) |
|
|
|
|
s->allowed_encodings |= HTTP_ACCEPT_ENCODING_X_BZIP2; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
/* default encodings */ |
|
|
|
|
s->allowed_encodings = 0 |
|
|
|
|
#ifdef USE_ZLIB |
|
|
|
|
| HTTP_ACCEPT_ENCODING_GZIP | HTTP_ACCEPT_ENCODING_DEFLATE |
|
|
|
|
| HTTP_ACCEPT_ENCODING_GZIP | HTTP_ACCEPT_ENCODING_X_GZIP | HTTP_ACCEPT_ENCODING_DEFLATE |
|
|
|
|
#endif |
|
|
|
|
#ifdef USE_BZ2LIB |
|
|
|
|
| HTTP_ACCEPT_ENCODING_BZIP2 |
|
|
|
|
| HTTP_ACCEPT_ENCODING_BZIP2 | HTTP_ACCEPT_ENCODING_X_BZIP2 |
|
|
|
|
#endif |
|
|
|
|
; |
|
|
|
|
} |
|
|
|
@ -434,12 +440,14 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
|
|
|
|
|
|
|
|
|
|
switch(type) { |
|
|
|
|
case HTTP_ACCEPT_ENCODING_GZIP: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_GZIP: |
|
|
|
|
buffer_append_string_len(p->ofn, CONST_STR_LEN("-gzip-")); |
|
|
|
|
break; |
|
|
|
|
case HTTP_ACCEPT_ENCODING_DEFLATE: |
|
|
|
|
buffer_append_string_len(p->ofn, CONST_STR_LEN("-deflate-")); |
|
|
|
|
break; |
|
|
|
|
case HTTP_ACCEPT_ENCODING_BZIP2: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_BZIP2: |
|
|
|
|
buffer_append_string_len(p->ofn, CONST_STR_LEN("-bzip2-")); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
@ -520,6 +528,7 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
|
|
|
|
|
switch(type) { |
|
|
|
|
#ifdef USE_ZLIB |
|
|
|
|
case HTTP_ACCEPT_ENCODING_GZIP: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_GZIP: |
|
|
|
|
ret = deflate_file_to_buffer_gzip(srv, con, p, start, sce->st.st_size, sce->st.st_mtime); |
|
|
|
|
break; |
|
|
|
|
case HTTP_ACCEPT_ENCODING_DEFLATE: |
|
|
|
@ -528,6 +537,7 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
|
|
|
|
|
#endif |
|
|
|
|
#ifdef USE_BZ2LIB |
|
|
|
|
case HTTP_ACCEPT_ENCODING_BZIP2: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_BZIP2: |
|
|
|
|
ret = deflate_file_to_buffer_bzip2(srv, con, p, start, sce->st.st_size); |
|
|
|
|
break; |
|
|
|
|
#endif |
|
|
|
@ -614,6 +624,7 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
|
|
|
|
|
switch(type) { |
|
|
|
|
#ifdef USE_ZLIB |
|
|
|
|
case HTTP_ACCEPT_ENCODING_GZIP: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_GZIP: |
|
|
|
|
ret = deflate_file_to_buffer_gzip(srv, con, p, start, sce->st.st_size, sce->st.st_mtime); |
|
|
|
|
break; |
|
|
|
|
case HTTP_ACCEPT_ENCODING_DEFLATE: |
|
|
|
@ -622,6 +633,7 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
|
|
|
|
|
#endif |
|
|
|
|
#ifdef USE_BZ2LIB |
|
|
|
|
case HTTP_ACCEPT_ENCODING_BZIP2: |
|
|
|
|
case HTTP_ACCEPT_ENCODING_X_BZIP2: |
|
|
|
|
ret = deflate_file_to_buffer_bzip2(srv, con, p, start, sce->st.st_size); |
|
|
|
|
break; |
|
|
|
|
#endif |
|
|
|
@ -691,6 +703,20 @@ static int mod_compress_patch_connection(server *srv, connection *con, plugin_da
|
|
|
|
|
} |
|
|
|
|
#undef PATCH |
|
|
|
|
|
|
|
|
|
static int mod_compress_contains_encoding(const char *headervalue, const char *encoding) { |
|
|
|
|
const char *m; |
|
|
|
|
for ( ;; ) { |
|
|
|
|
m = strstr(headervalue, encoding); |
|
|
|
|
if (NULL == m) return 0; |
|
|
|
|
if (m == headervalue || m[-1] == ' ' || m[-1] == ',') return 1; |
|
|
|
|
|
|
|
|
|
/* only partial match, search for next value */ |
|
|
|
|
m = strchr(m, ','); |
|
|
|
|
if (NULL == m) return 0; |
|
|
|
|
headervalue = m + 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PHYSICALPATH_FUNC(mod_compress_physical) { |
|
|
|
|
plugin_data *p = p_d; |
|
|
|
|
size_t m; |
|
|
|
@ -784,22 +810,26 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
|
|
|
|
|
|
|
|
|
|
/* get client side support encodings */ |
|
|
|
|
#ifdef USE_ZLIB |
|
|
|
|
if (NULL != strstr(value, "gzip")) accept_encoding |= HTTP_ACCEPT_ENCODING_GZIP; |
|
|
|
|
if (NULL != strstr(value, "deflate")) accept_encoding |= HTTP_ACCEPT_ENCODING_DEFLATE; |
|
|
|
|
if (NULL != strstr(value, "compress")) accept_encoding |= HTTP_ACCEPT_ENCODING_COMPRESS; |
|
|
|
|
if (mod_compress_contains_encoding(value, "gzip")) accept_encoding |= HTTP_ACCEPT_ENCODING_GZIP; |
|
|
|
|
if (mod_compress_contains_encoding(value, "x-gzip")) accept_encoding |= HTTP_ACCEPT_ENCODING_X_GZIP; |
|
|
|
|
if (mod_compress_contains_encoding(value, "deflate")) accept_encoding |= HTTP_ACCEPT_ENCODING_DEFLATE; |
|
|
|
|
if (mod_compress_contains_encoding(value, "compress")) accept_encoding |= HTTP_ACCEPT_ENCODING_COMPRESS; |
|
|
|
|
#endif |
|
|
|
|
#ifdef USE_BZ2LIB |
|
|
|
|
if (NULL != strstr(value, "bzip2")) accept_encoding |= HTTP_ACCEPT_ENCODING_BZIP2; |
|
|
|
|
if (mod_compress_contains_encoding(value, "bzip2")) accept_encoding |= HTTP_ACCEPT_ENCODING_BZIP2; |
|
|
|
|
if (mod_compress_contains_encoding(value, "x-bzip2")) accept_encoding |= HTTP_ACCEPT_ENCODING_X_BZIP2; |
|
|
|
|
#endif |
|
|
|
|
if (NULL != strstr(value, "identity")) accept_encoding |= HTTP_ACCEPT_ENCODING_IDENTITY; |
|
|
|
|
if (mod_compress_contains_encoding(value, "identity")) accept_encoding |= HTTP_ACCEPT_ENCODING_IDENTITY; |
|
|
|
|
|
|
|
|
|
/* find matching entries */ |
|
|
|
|
matched_encodings = accept_encoding & p->conf.allowed_encodings; |
|
|
|
|
|
|
|
|
|
if (matched_encodings) { |
|
|
|
|
const char *dflt_gzip = "gzip"; |
|
|
|
|
const char *dflt_deflate = "deflate"; |
|
|
|
|
const char *dflt_bzip2 = "bzip2"; |
|
|
|
|
static const char dflt_gzip[] = "gzip"; |
|
|
|
|
static const char dflt_x_gzip[] = "x-gzip"; |
|
|
|
|
static const char dflt_deflate[] = "deflate"; |
|
|
|
|
static const char dflt_bzip2[] = "bzip2"; |
|
|
|
|
static const char dflt_x_bzip2[] = "x-bzip2"; |
|
|
|
|
|
|
|
|
|
const char *compression_name = NULL; |
|
|
|
|
int compression_type = 0; |
|
|
|
@ -821,9 +851,15 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
|
|
|
|
|
if (matched_encodings & HTTP_ACCEPT_ENCODING_BZIP2) { |
|
|
|
|
compression_type = HTTP_ACCEPT_ENCODING_BZIP2; |
|
|
|
|
compression_name = dflt_bzip2; |
|
|
|
|
} else if (matched_encodings & HTTP_ACCEPT_ENCODING_X_BZIP2) { |
|
|
|
|
compression_type = HTTP_ACCEPT_ENCODING_X_BZIP2; |
|
|
|
|
compression_name = dflt_x_bzip2; |
|
|
|
|
} else if (matched_encodings & HTTP_ACCEPT_ENCODING_GZIP) { |
|
|
|
|
compression_type = HTTP_ACCEPT_ENCODING_GZIP; |
|
|
|
|
compression_name = dflt_gzip; |
|
|
|
|
} else if (matched_encodings & HTTP_ACCEPT_ENCODING_X_GZIP) { |
|
|
|
|
compression_type = HTTP_ACCEPT_ENCODING_X_GZIP; |
|
|
|
|
compression_name = dflt_x_gzip; |
|
|
|
|
} else if (matched_encodings & HTTP_ACCEPT_ENCODING_DEFLATE) { |
|
|
|
|
compression_type = HTTP_ACCEPT_ENCODING_DEFLATE; |
|
|
|
|
compression_name = dflt_deflate; |
|
|
|
|