2016-09-27 105 views
1

我試圖從「Python for Informatics」一書的第12章中執行以下代碼。HTTP/1.1 400錯誤請求。錯誤的命令部分數量

import socket 
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysock.connect(('www.py4inf.com', 80)) 
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 
while True: 
    data = mysock.recv(512) 
    if (len(data) < 1) : 
     break 
    print data 
mysock.close() 

根據這本書,腳本應該打印以下:

HTTP/1.1 200 OK 日期:孫老師,2010 3月14日23時52分41秒GMT 服務器:Apache 最後修飾:星期二,2009年12月29日1時31分22秒GMT 的ETag: 「143c1b33-a7-4b395bea」 接受-範圍:字節 的Content-Length:167 連接:關閉 的Content-Type:text/plain的 但通過那柔軟的光線窗口打破 那是東方朱麗葉就是太陽 起來美麗的太陽,殺死羨慕月亮 誰已經面色慘白悲傷

不幸的是,可變數據充滿以下字符串:

'HTTP/1.1 400錯誤請求。命令部分差多少[ 'GET', 'http://www.py4inf.com/code/romeo.txt', 'HTTP/1.0', 'X-WS-版本:', '1.0']」

我找不到這個錯誤有什麼好的解釋。我希望有人能幫幫忙!

+0

你是否使用套接字來設置它?您可以使用請求庫:'requests.get(url).text'。 – postelrich

+0

我得到'HTTP/1.1 200 OK'運行上面的代碼。 – Ahmad

+0

GET /code/romeo.txt HTTP/1.1 \ r \ n主機:www.py4inf.com \ r \ n用戶代理:Mozilla/5.0(X11; Ubuntu; Linux x86_64; rv:48.0)Gecko/20100101 Firefox/48.0 \ r \ n接受:text/html,application/xhtml + xml,application/xml; q = 0.9,*/*; q = 0.8 \ r \ n接受語言:en-US,en; q = 0.5 \ r \ nAccept-Encoding:gzip,deflate \ r \ nConnection:keep-alive \ r \ nUpgrade-Insecure-Requests:1 \ r \ n \ r \ n''我刪除了答案,因爲每個異常或步驟都需要大量的定義。 – dsgdfg

回答

1

在你的Python安裝,機器或者你的網絡上,有東西在重寫請求並注入自己的代碼。主要嫌疑人是

  • 任何銷售作爲「防病毒」
  • 任何銷售作爲「網絡安全解決方案」
  • 惡意軟件在您的計算機或路由器
  • 廣泛網絡(透明)代理
  • 您的Python程序或安裝中的庫
  • 您的ISP或網絡管理員

在您的情況下,此服務需要注入完全無用的標頭X-WS-Ver。然而,這個服務對HTTP的解釋比你的和py4inf.com服務器更嚴格。 HTTP行應以\r\n結尾,但僅使用\n。此服務修改您發送到的數據

GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\nX-WS-Ver: 1.0\r\n\r\n 

或類似的東西。這當然是這項服務的一個非常錯誤的行爲。由於新請求不再是有效的HTTP,py4inf.com將返回一條錯誤消息,正確表明它收到的請求格式不正確(400 Bad request)。

爲了使您的工作方案,您可以採取以下任何選項:

  • 如果你的本地計算機上的東西是問題,禁用有問題的服務(如果它白白,並錯誤地修改連接,這是不太可能提供太多,如果有的話,安全反正),或使用另一臺機器
  • 獲得無限制的網絡訪問,可能與一個VPN提供商
  • 的幫助下發送適當的HTTP,即
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n') 
#                ^^ ^^ 
  • 使用下https://方案的加密連接(與Python的ssl模塊),即網址。
+0

謝謝你的好解釋,解決方案3工作 –

+0

太棒了!出於興趣,您是否有任何想法可以默默修改您的數據?我仔細研究了一下,唯一可以找到的頭文件是惡意軟件,這也可以解釋非常糟糕的實現。您是否可以在同一網絡上使用另一臺計算機(如果可能使用不同的操作系統)或另一個網絡上的當前計算機重現原始問題? – phihag

+0

我必須檢查它,但由於我有相當多的安全軟件,我懷疑是這樣。 –

-1

您需要更改 mysock.send( 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0 \ n \ n') 到

mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r \n') 

,要正確結束的字節流,你需要使用「\ r \ n「,另外:你不應該使用一個字節對象的套接字?

+0

不幸的是,這導致了相同的輸出。 –

+0

你也可以在最後嘗試「\ r \ n \ r \ n」,這應該有效。 – Jerrynicki