使用curl命令向Apache服务器发送一个经过gzip压缩的POST请求体

17

我在我的Apache 2.2服务器上正确启用了mod_deflate,现在正在尝试通过curl命令行发送经过gzip压缩的主体。

所有我看过的教程都说要添加-H'Content-Encoding: gzip'并压缩我的主体文件,但这种方法失败了:

echo '{ "mydummy" : "json" }' > body
gzip body
curl -v -i http://localhost/mymodule -H'Content-Encoding: gzip' --data-binary @body.gz 

我的Apache模块接收到0字节。

如果LogLevel设置为debug,我的Apache error.log中会显示以下内容:
[Thu Jun 01 14:29:03 2017] [debug] mod_deflate.c(900): [client 127.0.0.1] Failed to inflate input: cannot handle deflate flags

2个回答

28

问题在于mod_deflate不喜欢这里显示的gzip头:

hexdump -C body.gz
00000000  1f 8b 08 08 20 08 30 59  00 03 62 6f 64 79 00 ab  |.... .0Y..body..|
00000010  56 50 ca ad 4c 29 cd cd  ad 54 52 b0 52 50 ca 2a  |VP..L)...TR.RP.*|
00000020  ce cf 53 52 a8 e5 02 00  a6 6a 24 99 17 00 00 00  |..SR.....j$.....|
00000030

解决方案就是将它直接交给gzip,如果使用流式处理,它不会打印头信息,Apache也会接受这个内容!

echo '{ "mydummy" : "json" }' | gzip > body.gz
curl -v -i http://localhost/mymodule -H'Content-Encoding: gzip' --data-binary @body.gz

这个有效,Apache模块接收到解压缩的字节。

您可以在此处看到标题差异,在gzip文件中不再看到文件名(正文):

hexdump -C body.gz
00000000  1f 8b 08 00 08 0a 30 59  00 03 ab 56 50 ca ad 4c  |......0Y...VP..L|
00000010  29 cd cd ad 54 52 b0 52  50 ca 2a ce cf 53 52 a8  |)...TR.RP.*..SR.|
00000020  e5 02 00 a6 6a 24 99 17  00 00 00                 |....j$.....|
0000002b

6
为了更安全,建议使用 --data-binary 而非 -d。请注意不改变原意,保持通俗易懂。 - Daniel Stenberg
--data-binary-d 有什么区别? - Jaya Ananthram
2
@JayaAnanthram 请参考 curl 的 man 页面:“当 --data 命令被告知从文件中读取时,回车符和换行符将被剥离”。 - vivimice

21

单行:

echo '{"mydummy": "json"}' | gzip | curl -v -i --data-binary @- -H "Content-Encoding: gzip" http://localhost/mymodule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接