I can reproduce this problem on any version of 2.4 that I've tested:

$ podman run -it --rm --publish=8080:80 -v /home/gordon/http:/var/www/html:z fedora:43
# dnf install -y httpd
# rpm -q httpd
httpd-2.4.66-1.fc43.x86_64

jod-thread-1.0.0.crate and jod-thread-1.0.0.tar.gz are the same file on the Apache httpd server:

# sha256sum jod-thread-1.0.0.*
a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24 jod-thread-1.0.0.crate a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24 jod-thread-1.0.0.tar.gz

Compliant clients (which includes wget, "curl --compressed", and Firefox) will not save the crate file correctly.

wget  https://localhost:8080/packages/jod-thread-1.0.0.crate
wget  https://localhost:8080/packages/jod-thread-1.0.0.tar.gz

file jod-thread-1.0.0.*
jod-thread-1.0.0.crate:  POSIX tar archive (GNU)
jod-thread-1.0.0.tar.gz: gzip compressed data, was "jod-thread-1.0.0.crate", max compression, original size modulo 2^32 25088

That's because httpd describes them differently. For the tar.gz file, it responds "Content-Type: application/x-gzip", while it responds for the crate file, "Content-Type: application/x-tar Content-Encoding: gzip". The content-encoding header is an instruction to the client indicating that the client must inflate the file with gzip to get the original content, which is wrong.

curl exhibits the same behavior when it tells the server that it supports gzip encoding:

curl --compressed https://localhost:8080/packages/jod-thread-1.0.0.crate -o jod-thread-1.0.0.crate curl --compressed https://localhost:8080/packages/jod-thread-1.0.0.tar.gz -o jod-thread-1.0.0.tar.gz

file jod-thread-1.0.0.*
jod-thread-1.0.0.crate:  POSIX tar archive (GNU)
jod-thread-1.0.0.tar.gz: gzip compressed data, was "jod-thread-1.0.0.crate", max compression, original size modulo 2^32 25088

However, curl's default behavior is to not specify any accepted encodings, and to ignore the content-type and content-encoding headers:

curl -v https://localhost:8080/packages/jod-thread-1.0.0.crate -o jod-thread-1.0.0.crate
# Request: Accept: */*
# Response: Content-Type: application/x-tar
# Content-Encoding: x-gzip

In this case, the saved file is the same as the server's file, but only because curl ignores Content-Encoding header if it was not instructed to set the "Accept-Encodings" header.

httpd's default behavior makes it difficult to serve data files whose checksum will be verified, because conforming clients will inflate compressed files inappropriately. Sites can work around this by adding "AddType application/x-gzip .crate .etc .etc" to their configuration, but the default configuration acknowledges that the correct MIME type for a tar.gz is application/x-gzip, and the mime_magic_module should do the same.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to