簡體   English   中英

為什么我在 python 中收到 httplib.BadStatusLine?

[英]Why am I getting httplib.BadStatusLine in python?

if theurl.startswith("http://"): theurl = theurl[7:]
    head = theurl[:theurl.find('/')]
    tail = theurl[theurl.find('/'):]
response_code = 0
import httplib
conn = httplib.HTTPConnection(head)
conn.request("HEAD",tail)
res = conn.getresponse()
response_code = int(res.status)

http://www.garageband.com/mp3cat/.UZCKbS6N4qk/01_Saraenglish.mp3
Traceback (most recent call last):
  File "check_data_404.py", line 51, in <module>
    run()
  File "check_data_404.py", line 35, in run
    res = conn.getresponse()
  File "/usr/lib/python2.6/httplib.py", line 950, in getresponse
    response.begin()
  File "/usr/lib/python2.6/httplib.py", line 390, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.6/httplib.py", line 354, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine

有誰知道“不良狀態線”是什么?

編輯:我對很多服務器和很多 URL 都試過了,但我仍然收到這個錯誤?

httplib(Python 2)的文檔 在Python 3中稱為http.client ):

異常 httplib. BadStatusLine :( 例外 http.client. BadStatusLine :)

HTTPException的子類。

如果服務器使用我們不理解的HTTP狀態代碼進行響應,則引發此異常。

我運行相同的代碼,但沒有收到錯誤:

>>> theurl = 'http://www.garageband.com/mp3cat/.UZCKbS6N4qk/01_Saraenglish.mp3'
>>> if theurl.startswith("http://"):
...     theurl = theurl[7:]
...     head = theurl[:theurl.find('/')]
...     tail = theurl[theurl.find('/'):]
... 
>>> head
'www.garageband.com'
>>> tail
'/mp3cat/.UZCKbS6N4qk/01_Saraenglish.mp3'
>>> response_code = 0
>>> import httplib
>>> conn = httplib.HTTPConnection(head)
>>> conn.request("HEAD", tail)
>>> res = conn.getresponse()
>>> res.status
302
>>> response_code = int(res.status)

我想只需仔細檢查一切,然后再試一次?

我最近收到此錯誤,在包含http請求的方法成功運行一次,然后第二次調用該方法(使用不同的URL)時拋出此異常(狀態代碼為空字符串)的情況下。 我有調試優勢,因為這是調用我自己的REST api,所以我在服務器端進行了一些日志記錄,發現請求從未被收到。 我最終發現我的URL字符串有一個尾隨的換行符。 因此,請確保您的網址已被刪除任何前導或尾隨特殊字符。

Python標准庫: httplib(Python 2)在Python 3中稱為http.client ):

exception httplib.BadStatusLine
HTTPException的子類。 如果服務器使用我們不理解的HTTP狀態代碼進行響應,則引發此異常。

您是否使用了代理?

如果是這樣,代理服務器可能拒絕HEAD請求。

如果您發出GET請求,是否會遇到同樣的問題? 如果GET工作,我懷疑你的方式有代理。

您可以在調用conn.request(...)之前調用conn.set_debuglevel(1)來更詳細地了解正在發生的事情。

我剛剛發現當我們得到異常httplib.BadStatusLine時,是服務器發生故障並且沒有發送任何響應,所以這意味着Web服務器甚至不發送http代碼[1]

[1] http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

我遇到的問題是多個請求,但BadStatusLine僅發生在間隔超過5秒且保持活動超時= 5的請求之間。 我仍然不確定為什么BadStatusLine被提升而不是NotConnected。 當標頭丟失時,似乎連接也默認為5。 在每個請求之前修復了conn.connect()

我也遇到過這個問題。 根據GmailAPI(python),當服務器在發送有效的響應之前關閉連接時會發生這種情況。 實際上,當我的程序在大型數據庫上運行時,這只發生在我身上。

def _read_status(self):
    # Initialize with Simple-Response defaults
    line = self.fp.readline(_MAXLINE + 1)
    if len(line) > _MAXLINE:
        raise LineTooLong("header line")
    if self.debuglevel > 0:
        print "reply:", repr(line)
    if not line:
        # Presumably, the server closed the connection before
        # sending a valid response.
        raise BadStatusLine(line)

我的解決方案是將與gmail建立連接的所有部分移動到一個函數中。 然后,僅在實際發送電子郵件之前調用此函數。 在此之前,建立連接的部分只是在某個.py文件中被“拋出”,因此在運行開始時被調用。

我知道“你應該只使用X”的答案是不受歡迎的,但我不得不說,在嘗試診斷同樣的問題幾個小時后,我嘗試使用相同的設置進行請求 ,並且它工作得很好。 在我看來也更容易使用和調試。

我們沒有關於你的theurl字符串中的內容的線索,我不知道你的問題是否已經解決(6年過去了,我希望你早就做到了),所以我只是給你一個可能的原因我遇到了與稍后可能會發現此內容的人分享。

我遇到了一個非常類似的問題,我的代碼在某些計算機上運行得很好但有時會引發BadStatusLine異常。 像鬼一樣令人討厭。

仔細檢查了所有可能的情況后,我發現在我的請求http header有一個'Content-Length'組件。 刪除組件后,我的代碼在所有計算機上運行良好。 也許你的theurl的第一部分包含類似我的東西,這與真正的數據長度相矛盾。

嘗試使用httplib.HTTPConnection訪問HTTPS / SSL URL時,我看到了此錯誤

您應該使用httplib.HTTPSConnection來訪問SSL URL。

我使用支持的 python 工具遇到了這個問題。 事實證明我們有錯誤的服務端口信息。 我們連接到一台服務器很好,只是不是我們認為的那樣。 結果是一些非 HTTP 服務器在該端口上運行並返回了它自己的錯誤消息。 請求無法將非 HTTP 響應轉換為 HTTPResponse,但它遇到的第一個問題是查看非 HTTP 響應的第一行。

奇怪的是,我們在 curl 中嘗試同樣的事情沒有問題,但后來有人指出我們已經按照習慣輸入了正確的端口,而不是我們已經輸入並輸入代碼的端口。 花費的時間比我們願意承認的要長得多,因為我們無法分辨兩個數字之間的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM