【发布时间】:2011-07-27 15:51:21
【问题描述】:
我有一个非常基本的 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)
我假设 apache 会等待 Content-Length 中指定的字节数,直到发生超时并抛出 400 Bad Request。
我在生产站点上进行了尝试,显然我立即得到了响应。
谁能解释一下 TCP 级别发生了什么以及我缺少什么 apache 配置 - 我想摆脱这样 5 分钟的等待。
【问题讨论】:
-
根据规范,HTTP 请求应该是:
GET /lol /HTTP1.1\r\nContent-Length: 10\r\n\r\n*********,即使用\r\n进行标头字段分隔,使用双\r\n\r\n进行标头/正文分隔。不确定大小。常识说服务器应该等待第 10 个 octec 到达并超时退出,这就是你正在看的。 -
是的,粘贴代码时打错了。编辑过的问题。
-
试过 KeepAliveTimeout,但似乎没有帮助。我需要检查什么 apache 选项?
-
@Stipa:KeepAliveTimeout 应该会影响该行为。这是套接字的读取超时,但我不确定 apache 选项。我认为,这是一种可以预期的行为。以及为什么不能发送正确的
Content-length:? -
我正在尝试消除我系统上的攻击向量。
标签: python apache http sockets tcp