命令行curl POST给出零内容长度

时间:2010-01-08 15:29:01

标签: post proxy curl

我正在使用命令行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。我还在调查这个问题,但这项工作对我有用。

2 个答案:

答案 0 :(得分:2)

NTLM是一种挑战 - 响应协议。当您指示您将要使用NTLM时,客户端将首先发送没有正文的请求(以避免浪费发送正文的带宽,只是让它被服务器的HTTP / 401质询拒绝)。只有在挑战/响应协议完成后,才会实际发布正文。

如果客户端需要NTLM但代理或服务器不知道(因此对0字节的POST执行操作,从不挑战客户端),这会导致许多问题。

答案 1 :(得分:0)

我遇到此问题时使用HTTP摘要发出请求。 Eric是正确的,curl试图变得聪明并且不发布任何数据,因为它知道它必须在从服务器接收到挑战后再次发出请求。

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