2010-01-08 110 views
2

我使用commandline curl通过代理进行POST,但我的表单数据正在消失为零内容长度。任何想法我做错了什么?commandline curl POST给零内容长度

这是我的命令行(使用一个公共测试的形式,以便其他人可以尝试一下):

curl -v --proxy-ntlm --proxy proxyserver:proxyport --proxy-user : -d "fname=a&lname=b" http://www.snee.com/xml/crud/posttest.cgi

-v =详细
未来几年争论让我们通过使用Windows身份验证
代理 - d =应该用给定的参数做一个帖子

但是,响应和详细打印输出表明表单内容正在消失。卷曲打印“Content-Length:0”,并且返回的html有两个参数缺失和内容长度为0.

该错误似乎不在代理服务器中,因为curl承认它正在发送内容长度的0.有没有人知道这个问题的解决方案?有没有人看过它?

更新this person似乎有同样的错误,但没有解决办法的建议,除了不使用NTLM我要

更新2:这绝对只与NTLM身份验证情况,我已经尝试了一种可行的替代认证方法。此外,使用-F而不是-d(对于二进制格式数据)以同样的方式失败。

更新3(解决方法):我已经在curl-users列表上讨论过这个问题。解决方法是使用--proxy-anyauth而不是--proxy-ntlm。我仍然在研究这个问题,但是这个workarounf适合我。

回答

2

NTLM是一个质询 - 响应协议。当你指出你要使用NTLM时,客户端首先会发送一个没有主体的请求(为了避免浪费发送主体的带宽,使其仅受到来自服务器的HTTP/401挑战的拒绝)。只有挑战/响应协议完成后,实际上才会发布机构。

这导致在箱子了一些问题,其中客户端期望NTLM但代理或服务器不知道(并因此作用在0字节POST,从未挑战客户端)。

0

我遇到了使用HTTP摘要发出请求的问题。埃里克是正确的,卷曲试图聪明,不发布任何数据,因为它知道在收到来自服务器的挑战之后必须再次发出请求。

事实证明,如果您提供--anyauth选项(要求curl自动检测身份验证方法),则初始请求将包含所有POST数据,并且(在我的情况中)服务器按预期进行响应。