2014-10-04 108 views
3

因此,我正在閱讀有關這些部分GET請求,這將使服務器在此請求一段時間後超時連接。如何發送部分GET請求?..Python - 發送「未完成」GET請求

import socket, sys 
host = sys.argv[1] 

request = "GET/HTTP/1.1\nHost: "+host+"\n\nUser-Agent:Mozilla 5.0\n" #How could I make this into a partial request? 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, 80)) 
s.sendto(request, (host, 80)) 
response = s.recv(1024) 

我該怎麼做?

+0

爲什麼不使用'urllib','requests'等..?模塊? – falsetru 2014-10-04 05:11:08

+0

我之前就是這樣做的,但我想要顯示「GET」,這樣人們可以更好地理解它的GET請求 – Shane 2014-10-04 05:34:12

回答

1

我想你混淆局部和不完整的請求:

  • 部分:請求資源的某些部分,就是喜歡在falsetru的答案顯示範圍請求。這不會導致超時,而是代碼206和您請求的資源部分的響應。
  • 不完整:您的請求不完整,無法由服務器處理,因此如果請求沒有得到請求,它將在一段時間後等待請求的其餘部分並超時。在你的問題中,你已經有這樣一個不完整的請求,因爲你沒有完成你的要求(它必須以\r\n\r\n而不是一個\n結束)。其他方式只是一個TCP連接而不發送任何數據或者做一個帶有內容長度的POST請求,然後不發送請求頭中指定的數據。
+0

我提出這個問題,所以我可以更好地理解它,謝謝 – Shane 2014-10-04 05:37:44

+0

因此,這意味着我發佈的獲取請求將在大約400秒的時間後被消耗時間嗎? – Shane 2014-10-04 05:43:21

+1

這將超時的速度取決於服務器的配置。通常,具有高負載的服務器會相當快地超時不完整的請求,以抵制拒絕服務攻擊的企圖。 – 2014-10-04 06:03:18

0

HTTP頭結束得太早。 (\n\n應該來頭後,內容之前)

import socket, sys 
host = sys.argv[1] 

request = "GET/HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\n\n" 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, 80)) 
s.send(request) 
response = s.recv(1024) 

如果你的意思是部分內容的檢索,你可以需要指明Range header

"GET/HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\rRange: bytes=0-999\n\n" 

注意

應該\r\n\n作爲行結束,即使大多數(但不是全部)服務器也接受\n

+2

即使大多數情況下,它應該不是'\ n' (但不是全部)服務器也接受'\ n'。 – 2014-10-04 05:30:25

+0

@SteffenUllrich,感謝您的評論。我在答案中添加了您的評論。好嗎? – falsetru 2014-10-04 05:33:14

+0

當然沒問題。 – 2014-10-04 05:37:25