【发布时间】:2010-06-03 09:33:42
【问题描述】:
我正在编写一个简单的 HTTP 服务器,它将主要接受来自 cURL 作为客户端的 PUT 请求,但我在处理 Expect: 100-continue 标头时遇到了一些问题。
据我了解,服务器应该读取标头,在连接上发回HTTP/1.1 100 Continue 响应,将流读取到Content-Length 上的值,然后发回真正的响应代码(通常是@ 987654325@ 但任何其他有效的 HTTP 答案都应该这样做)。
嗯,这正是我的服务器所做的。问题是,显然,如果我发送 100 Continue 答案,cURL 将无法报告任何后续 HTTP 错误代码并假定上传成功。例如,如果上传因内容的性质而被拒绝(发生基本数据检查),我希望调用客户端能够检测到问题并采取相应措施。
我是否遗漏了一些明显的东西?
编辑:这是来自 cURL 的示例输出,其中包含错误的辅助标头:
> PUT /test1%2Epdf HTTP/1.1
> Authorization: Basic xxxx
> User-Agent: curl/7.20.0 (i386-pc-win32) libcurl/7.20.0 OpenSSL/0.9.8l zlib/1.2.3
> Host: localhost
> Accept: */*
> Content-Length: 24
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 415 Unsupported Media Type
< Connection: close
< Content-Type: text/xml
< Content-Length: 289
<
【问题讨论】:
-
HTTP/1.1 100 Continue后面不需要空行吗? -
有一个。它没有被记录的事实似乎是 cURL 的显示问题。
-
澄清一下,发回一个完全有效的 HTTP 响应 (
HTTP/1.1 100 Continue\r\n\r\n) 而不仅仅是字符串"HTTP/1.1 100 Continue"。 cURL 客户端将一直等待,直到它接收到这两个序列,如果它放弃,它将输出(在详细模式下)消息“等待 100-继续完成”。 -
我刚刚找到的 100-continue 示例的要点仅供参考:gist.github.com/trevorrowe/c2353ab959c6852a2bd7