1

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

到目前为止,我已经编写了一个可以完美运行的小型 php 页面。

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

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

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

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

我开始在谷歌上搜索并寻找解决方案,但我不知道如何解决这个问题。

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

  • 共享整个会话的领域(最小的 HTTP 请求,然后是质询,然后是数据)
  • 使用同步方式执行 HTTP 连接(我不想做的事情,因为在我看来处理这类事情的方式很丑陋)

谢谢

4

2 回答 2

3

您在 http 协议中遇到了一个缺陷:您必须先发送所有数据,然后才能获得带有身份验证挑战的响应(当您发送没有凭据的请求时)。您可以尝试在同一会话中作为第一个请求进行一次小型往返(如您所提到的),例如 HEAD 请求,然后未来的请求将共享相同的随机数。

于 2010-05-13T15:42:21.787 回答
2

回答原始请求者为时已晚,但如果其他人阅读此内容,则及时。

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

客户端发送带有“Expect: 100-continue”标头的请求,在发送正文之前暂停请求。服务器使用已经接收到的标头来决定是否可以接受此请求(如果要接收的实体 - 正文 - 不是太大,如果用户的凭据是正确的......)。如果服务器可以接受请求,它会回复“100 Continue”状态码,客户端发送正文,服务器会回复该请求的最终状态码。相反,如果请求不可接受,服务器会回复 4xx 状态代码(“413 Request Entity Too Large”,如果提供的正文大小...太大,或“401 Unauthorized”+ WWW-Authenticate : header) 并且客户端不发送正文。

于 2011-03-06T21:50:54.233 回答