这个HTTP/1.1请求有什么问题?客户端有时接受,有时拒绝
我正在写一个小型的HTTP/1.1网络服务器。目前我没有开启多线程,也不使用持久连接。对于正常的请求,我指定了内容长度,并将字节写入到套接字中,一切都运行得很好。
不过,我需要支持分块传输编码。当一些浏览器请求这个功能时,它们会发起请求,然后立即关闭连接,接着再发起请求,这时才会成功。有时候我看到它们会关闭连接多次,反复请求,直到成功为止。而有时候它们关闭连接后就不再重试了。
下面是我通过套接字发送的输出日志。括号里的数字表示它实际尝试发送的字节数:
send(21): 'HTTP/1.1 100 Continue'
send(2): '\r\n'
send(2): '\r\n'
send(15): 'HTTP/1.1 200 OK'
send(2): '\r\n'
send(26): 'Transfer-Encoding: chunked'
send(2): '\r\n'
send(38): 'Content-Type: application/octet-stream'
send(2): '\r\n'
send(52): 'Content-Disposition: attachment; filename="test.mp3"'
send(2): '\r\n'
send(17): 'Connection: close'
send(2): '\r\n'
send(35): 'Date: Mon, 20 Sep 2010 11:38:34 GMT'
send(2): '\r\n'
send(2): '\r\n'
send(4): '4000'
send(2): '\r\n'
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 64329)
...
self.request.send("\r\n")
error: [Errno 32] Broken pipe
----------------------------------------
请注意,每一行打印的内容代表的是即将发送的字节,而不是已经发送的字节——因此在最后的"\r\n"上会失败。另外,有时它会在套接字关闭之前成功发送几个数据块。我在浏览器中可以看到已经接收了几千字节。
编辑:这是来自Firefox 4 beta 6的一个请求。我的服务器能够发送回16KB的数据(根据FireBug的显示),然后套接字就出问题了。请注意,我的服务器忽略了Range头,如果这有影响的话:
GET /audios/11/download.ogg HTTP/1.1
Host: localhost:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6) Gecko/20100101 Firefox/4.0b6
Accept: audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Range: bytes=0-
Cookie: player-61646d696e=1; player-64617665=4; JSESSIONID=6glsv8468cbp
1 个回答
0
我猜测一下:这个 Connection:close
头部看起来不太对。实际上,我觉得这应该是一个请求头,而不是响应头。
补充一下:如果我没理解错 RFC2616的这一部分,HTTP-Continue(HTTP 100)是告诉 客户端 继续它的请求,所以 也许 这个头部应该省略掉。