2011-04-01 89 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

回答