我正在使用命令行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。我还在调查这个问题,但这项工作对我有用。
答案 0 :(得分:2)
NTLM是一种挑战 - 响应协议。当您指示您将要使用NTLM时,客户端将首先发送没有正文的请求(以避免浪费发送正文的带宽,只是让它被服务器的HTTP / 401质询拒绝)。只有在挑战/响应协议完成后,才会实际发布正文。
如果客户端需要NTLM但代理或服务器不知道(因此对0字节的POST执行操作,从不挑战客户端),这会导致许多问题。
答案 1 :(得分:0)
我遇到此问题时使用HTTP摘要发出请求。 Eric是正确的,curl试图变得聪明并且不发布任何数据,因为它知道它必须在从服务器接收到挑战后再次发出请求。
事实证明,如果您提供--anyauth
选项(要求curl自动检测身份验证方法),初始请求将包含所有POST数据,并且(在我的情况下)服务器按预期响应。 / p>