httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Yann Ylavic <ylavic....@gmail.com>
Subject Re: mod_mime_magic, gzipped tarballs and Docker
Date Fri, 08 Jan 2016 09:27:19 GMT
Hi,

On Fri, Jan 8, 2016 at 8:49 AM, Jan Kalu┼ża <jkaluza@redhat.com> wrote:
>
> Content-Type: application/x-tar
> Content-Encoding: x-gzip
[]
>
> So, the mod_mime_magic is saying here that the body is tarball encoded by
> gzip.

AIUI, mod_mime_magic does indeed try to uncompress the tar.gz and adds
the above headers.

>
> But I think even we are right here, the Content-Encoding should be used only
> when httpd itself encodes the original content, otherwise it confuses
> clients (I've asked few people and it confuses some web browsers too - I can
> get more info if needed.).

Agreed, this looks wrong, the browsers will likely use the .tar file
instead (this adds unnecessary cycles to both the server and client).

>
> Maybe we could stop setting Content-Encoding in mod_mime_magic and just use
> Content-Type?

Since it's always been there, we probably should add a new
mod_mime_magic directive to control the behaviour and avoid breaking
cases.

Something along:

Index: modules/metadata/mod_mime_magic.c
===================================================================
--- modules/metadata/mod_mime_magic.c    (revision 1723283)
+++ modules/metadata/mod_mime_magic.c    (working copy)
@@ -456,6 +456,7 @@ typedef struct {
     const char *magicfile;    /* where magic be found */
     struct magic *magic;      /* head of magic config list */
     struct magic *last;
+    int uncompress;
 } magic_server_config_rec;

 /* per-request info */
@@ -511,6 +512,10 @@ static const command_rec mime_magic_cmds[] =
 {
     AP_INIT_TAKE1("MimeMagicFile", set_magicfile, NULL, RSRC_CONF,
      "Path to MIME Magic file (in file(1) format)"),
+    AP_INIT_FLAG("MimeMagicUncompress", ap_set_flag_slot,
+     (void *)APR_OFFSETOF(magic_server_config_rec, uncompress), RSRC_CONF,
+     "Whether MIME should try to render uncompressed content by recognizing "
+     "the underlying type, or not (default)"),
     {NULL}
 };

@@ -2081,6 +2086,9 @@ static int ncompr = sizeof(compr) / sizeof(compr[0

 static int zmagic(request_rec *r, unsigned char *buf, apr_size_t nbytes)
 {
+    magic_server_config_rec *conf = (magic_server_config_rec *)
+                    ap_get_module_config(r->server->module_config,
+                                         &mime_magic_module);
     unsigned char *newbuf;
     int newsize;
     int i;
@@ -2095,15 +2103,20 @@ static int zmagic(request_rec *r, unsigned char *b
     if (i == ncompr)
         return 0;

-    if ((newsize = uncompress(r, i, &newbuf, HOWMANY)) > 0) {
-        /* set encoding type in the request record */
-        r->content_encoding = compr[i].encoding;
-
+    if (!conf->uncompress) {
+        magic_rsl_puts(r, apr_pstrcat(r->pool, "application/",
+                                      compr[i].encoding, NULL));
+    }
+    else if ((newsize = uncompress(r, i, &newbuf, HOWMANY)) > 0) {
         newbuf[newsize-1] = '\0';  /* null-terminate uncompressed data */
         /* Try to detect the content type of the uncompressed data */
         if (tryit(r, newbuf, newsize, 0) != OK) {
+            magic_rsl_puts(r, apr_pstrcat(r->pool, "application/",
+                                          compr[i].encoding, NULL));
             return 0;
         }
+        /* set encoding type in the request record */
+        r->content_encoding = compr[i].encoding;
     }
     return 1;
 }
--

Regards,
Yann.

Mime
View raw message