如何在iPhone上正确处理HTTP摘要身份验证

时间:2010-05-13 13:46:36

标签: iphone http sdk connection digest

我正在尝试将文件上传到我的个人服务器上。

到目前为止,我已经写了一个小巧的PHP页面。

有点奇怪的是,我生成了我要发送的所有HTTP消息的主体(比如说大约4 MB),然后我将请求发送到我的服务器。

然后,服务器请求HTTP质询和我的委托连接:didReceiveAuthenticationChallenge:challenge使用正确的凭据和数据回复服务器。

但是,发生了什么?数据已发送两次!

事实上,我注意到当我添加进度条时...应用程序发送数据(4mb),服务器要求进行身份验证,应用程序通过身份验证重新发送数据(另一个4mb)。所以,最后,我发送了8mb。那是错的。

我开始谷歌搜索并寻找解决方案,但我无法弄清楚如何解决这个问题。

案例场景是两个(我的猜测):

  • 分享整个会话的领域(最小的HTTP请求,然后挑战,然后是数据)
  • 使用同步方式执行HTTP连接(我不想做的事情,因为它似乎是一种丑陋的方式来处理这类东西)

谢谢

2 个答案:

答案 0 :(得分:3)

你遇到了http协议的一个缺陷:你必须在获得auth质询的响应之前发送所有数据(当你发送没有凭据的请求时)。您可以尝试在同一个会话中进行小型往返(如您所述),如HEAD请求,然后将来的请求将共享相同的nonce。

答案 1 :(得分:2)

回答原始请求者的时间太晚了,但是如果有其他人读到这个请求的话。

TL; DR:Section 8.2.3 of RFC 2616描述了100 Continue状态,​​这就是您在这种情况下所需要的(需要)。 另请参阅第10.1.1和14.20节。

客户端发送带有“Expect:100-continue”标头的请求,在发送正文之前暂停请求。服务器使用已经接收的报头来决定是否接受该请求(如果实体 - 要接收的主体不是太大,如果用户的凭证是正确的......)。如果服务器的请求是可接受的,它将回复“100 Continue”状态代码,客户端发送正文,服务器回复该请求的最终状态代码。相反,如果请求不可接受,服务器将回复4xx状态代码(“413请求实体太大”,如果提供的正文大小...太大,或“401 Unauthorized”+ WWW-Authenticate :header)并且客户端不发送正文。通过回复401状态代码和相应的WWW-Authenticate:信息,客户端现在可以再次执行请求并提供其凭据。