|
@@ -8522,6 +8522,7 @@ handle_static_file_request(struct mg_connection *conn,
|
|
char gz_path[PATH_MAX];
|
|
char gz_path[PATH_MAX];
|
|
const char *encoding = "";
|
|
const char *encoding = "";
|
|
const char *cors1, *cors2, *cors3;
|
|
const char *cors1, *cors2, *cors3;
|
|
|
|
+ int allow_on_the_fly_compression = conn->accept_gzip;
|
|
|
|
|
|
if ((conn == NULL) || (conn->ctx == NULL) || (filep == NULL)) {
|
|
if ((conn == NULL) || (conn->ctx == NULL) || (filep == NULL)) {
|
|
return;
|
|
return;
|
|
@@ -8560,6 +8561,9 @@ handle_static_file_request(struct mg_connection *conn,
|
|
|
|
|
|
path = gz_path;
|
|
path = gz_path;
|
|
encoding = "Content-Encoding: gzip\r\n";
|
|
encoding = "Content-Encoding: gzip\r\n";
|
|
|
|
+
|
|
|
|
+ /* File is already compressed. No "on the fly" compression. */
|
|
|
|
+ allow_on_the_fly_compression = 0;
|
|
}
|
|
}
|
|
|
|
|
|
if (!mg_fopen(conn, path, MG_FOPEN_MODE_READ, filep)) {
|
|
if (!mg_fopen(conn, path, MG_FOPEN_MODE_READ, filep)) {
|
|
@@ -8602,6 +8606,9 @@ handle_static_file_request(struct mg_connection *conn,
|
|
r1 + cl - 1,
|
|
r1 + cl - 1,
|
|
filep->stat.size);
|
|
filep->stat.size);
|
|
msg = "Partial Content";
|
|
msg = "Partial Content";
|
|
|
|
+
|
|
|
|
+ /* Do not compress ranges. */
|
|
|
|
+ allow_on_the_fly_compression = 0;
|
|
}
|
|
}
|
|
|
|
|
|
hdr = mg_get_header(conn, "Origin");
|
|
hdr = mg_get_header(conn, "Origin");
|
|
@@ -8618,13 +8625,25 @@ handle_static_file_request(struct mg_connection *conn,
|
|
cors1 = cors2 = cors3 = "";
|
|
cors1 = cors2 = cors3 = "";
|
|
}
|
|
}
|
|
|
|
|
|
- /* Prepare Etag, Date, Last-Modified headers. Must be in UTC, according
|
|
|
|
- * to
|
|
|
|
|
|
+ /* Prepare Etag, Date, Last-Modified headers. Must be in UTC,
|
|
|
|
+ * according to
|
|
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */
|
|
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */
|
|
gmt_time_string(date, sizeof(date), &curtime);
|
|
gmt_time_string(date, sizeof(date), &curtime);
|
|
gmt_time_string(lm, sizeof(lm), &filep->stat.last_modified);
|
|
gmt_time_string(lm, sizeof(lm), &filep->stat.last_modified);
|
|
construct_etag(etag, sizeof(etag), &filep->stat);
|
|
construct_etag(etag, sizeof(etag), &filep->stat);
|
|
|
|
|
|
|
|
+ /* On the fly compression allowed */
|
|
|
|
+ if (allow_on_the_fly_compression) {
|
|
|
|
+ ;
|
|
|
|
+ /* TODO: add interface to compression module */
|
|
|
|
+ /* e.g., def from https://zlib.net/zlib_how.html */
|
|
|
|
+ /* Check license (zlib has a permissive license, but */
|
|
|
|
+ /* is still not MIT) and use dynamic binding like */
|
|
|
|
+ /* done with OpenSSL */
|
|
|
|
+ /* See #199 (https://github.com/civetweb/civetweb/issues/199) */
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Send header */
|
|
(void)mg_printf(conn,
|
|
(void)mg_printf(conn,
|
|
"HTTP/1.1 %d %s\r\n"
|
|
"HTTP/1.1 %d %s\r\n"
|
|
"%s%s%s"
|
|
"%s%s%s"
|
|
@@ -8637,6 +8656,7 @@ handle_static_file_request(struct mg_connection *conn,
|
|
date);
|
|
date);
|
|
send_static_cache_header(conn);
|
|
send_static_cache_header(conn);
|
|
send_additional_header(conn);
|
|
send_additional_header(conn);
|
|
|
|
+
|
|
(void)mg_printf(conn,
|
|
(void)mg_printf(conn,
|
|
"Last-Modified: %s\r\n"
|
|
"Last-Modified: %s\r\n"
|
|
"Etag: %s\r\n"
|
|
"Etag: %s\r\n"
|