代码之家  ›  专栏  ›  技术社区  ›  dave mankoff

这个HTTP/1.1请求有什么问题有时客户接受,有时拒绝

  •  2
  • dave mankoff  · 技术社区  · 15 年前

    我正在编写一个小型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
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   knitti freethinker    15 年前

    胡乱猜测 Connection:close -头球“感觉”不对实际上,我 认为 这是请求头,不是响应头。

    编辑:如果我读 this part of RFC2616 正确地,HTTP Continue(HTTP 100)告诉 客户 继续它的要求,所以 也许吧 此标题也应省略。

    推荐文章