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分钟等待。
根据规范,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
是的,在粘贴代码中输入错误。编辑的问题。 – lstipakov 2011-04-01 12:44:07
试过KeepAliveTimeout,但似乎没有帮助。我需要检查什么apache选项? – lstipakov 2011-04-01 12:47:57