Hi,
On Fri, Jan 8, 2016 at 8:49 AM, Jan Kaluža <[email protected]> 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.