curl命令一个gzip压缩的POST主体到一个apache服务器

Emm*_*ges 6 compression apache post curl gzip

在我的apache 2.2服务器上正确激活mod_deflate,我试图通过curl命令行发送一个gzipped主体.

我见过的所有教程都说要添加-H'Content-Encoding:gzip'和gzip我的正文文件,但是这会失败:

echo '{ "mydummy" : "json" }' > body
gzip body
curl -v -i http://localhost/mymodule -H'Content-Encoding: gzip' --data-binary @body.gz 
Run Code Online (Sandbox Code Playgroud)

我的apache模块接收0个字节

在我的apache error.log中如果LogLevel设置为debug我得到:
[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

Emm*_*ges 9

问题是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
Run Code Online (Sandbox Code Playgroud)

解决方案是简单地将gzip放到没有中间文件步骤的情况下,如果采用流,它将不会打印标题,而apache会喜欢正文!

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

这样,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
Run Code Online (Sandbox Code Playgroud)

  • 使用`--data-binary`可能代替`-d`以使其更安全. (3认同)
  • @JayaAnanthram 请参阅curl 的手册页:“当 --data 被告知从这样的文件中读取时,回车符和换行符将被删除” (2认同)

dol*_*men 9

单线:

echo '{"mydummy": "json"}' | gzip | curl -v -i --data-binary @- -H "Content-Encoding: gzip" http://localhost/mymodule
Run Code Online (Sandbox Code Playgroud)