我正在编写一个小型http/1.1web服务器。我已关闭线程,并且当前未使用持久连接。对于我指定内容长度并将字节写入套接字的普通请求,一切都很好。
但是,我需要支持分块传输编码的能力。当一些浏览器点击这个uri时,他们发出请求,立即关闭连接,然后再次发出请求,此时请求成功有时我看到他们多次关闭连接,多次重新请求,直到成功其他时候我看到他们关闭连接而不重试。
这是我通过套接字发送的输出的日志。括号中的数字表示它实际尝试发送的字节数:
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”上失败。还要注意,有时它会在套接字关闭之前成功地发送一些数据块。我可以在浏览器中看到已经收到了几千字节。
编辑:这是firefox4beta6的请求我的服务器能够在插座崩溃之前发送回16KB(根据FireBug)注意我的服务器
忽略
范围标题,如果有区别的话:
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