2011-04-01 59 views
0

我有一个非常基本的执行HTTP连接的python脚本。当请求的内容长度超过实际内容长度时,http连接会冻结

import socket 

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    host = "192.168.56.21" 
    s.connect((host, 80)) 
    msg = """GET /lol /HTTP1.1 
Content-Length: 10  

%s""" % ("*" * 9) 
    s.send(msg) 
    print msg 
    print s.recv(1000) 

if __name__ == "__main__": 
    main() 

正如您所见,Content-Length标头超出了真实内容长度。当我运行这个脚本时,它冻结了5分钟,之后我得到了apache日志中的记录,请求花了5分钟执行并获得了HTTP 400响应。

192.168.56.21 - - [01/Apr/2011:15:07:52 +0300] "GET /lol /HTTP1.1" 400 358 "-" "-" 47 531 300011809 

我确定,但我不明白的是为什么apache冻结了5分钟,并保持连接在此期间打开。

apache2 3947 www-data 19u IPv6 17165  TCP 192.168.56.21:www->192.168.56.21:53112 (ESTABLISHED) 
python2.6 4636 meuser 3u IPv4 17164  TCP 192.168.56.21:53112->192.168.56.21:www (ESTABLISHED) 

我认为,直到某些超时发生,它抛出400错误的请求的内容长度指定的字节数量阿帕奇等待。

我试着对产品网站,显然我立即得到了回应。

有人可以解释这里在TCP层面上发生了什么,我缺少apache配置 - 我想摆脱这样的5分钟等待。

+0

根据规范,HTTP请求应该是:'GET/lol /HTTP1.1\r\nContent-Length:10 \ r \ n \ r \ n *********'即使用'\ r \ n'作为标题字段分隔,并使用'\ r \ n \ r \ n'作为标题/正文分隔。不知道大小。常识上说,服务器应该等待第10个octec到达并由于超时退出,这就是你正在看的。 – khachik 2011-04-01 12:25:04

+0

是的,在粘贴代码中输入错误。编辑的问题。 – lstipakov 2011-04-01 12:44:07

+0

试过KeepAliveTimeout,但似乎没有帮助。我需要检查什么apache选项? – lstipakov 2011-04-01 12:47:57

回答