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