Http-соединение останавливается, когда длина содержимого запроса превышает реальную длину содержимого - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть очень простой скрипт на 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 минут ожидания.

1 Ответ

1 голос
/ 01 апреля 2011

ОК, это директива Timeout в apache conf.http://httpd.apache.org/docs/2.2/mod/core.html#timeout

...