Подтвердить что ты не робот

Почему я получаю эту ошибку в python? (HTTPLIB)

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, и я все еще получаю эту ошибку?

4b9b3361

Ответ 1

Из документации для httplib (Python 2) (называемый http.client в Python 3):

exception 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)

Я думаю, просто дважды проверьте все и повторите попытку?

Ответ 2

Недавно я получил эту ошибку в ситуации, когда метод, содержащий HTTP-запрос, успешно выполнялся один раз, а затем выбрал это исключение (со статусным кодом как пустую строку) во второй раз, когда был вызван метод (с другим URL). У меня было преимущество отладки, потому что это вызов моего собственного REST api, поэтому я сделал несколько протоколов на стороне сервера и обнаружил, что запрос никогда не был получен. В конечном итоге я понял, что моя строка URL имеет конечный символ новой строки. Поэтому убедитесь, что ваши URL-адреса лишены каких-либо ведущих или завершающих специальных символов.

Ответ 3

Стандартная библиотека Python: httplib (Python 2) (называется http.client в Python 3):

exception httplib.BadStatusLine
Подкласс HTTPException. Поднят, если сервер отвечает кодом состояния HTTP, который мы не понимаем.

Ответ 4

Используете ли вы прокси?

Если это так, возможно, прокси-сервер отклоняет запросы HEAD.

Вы получаете ту же проблему, если вы выдаете запрос GET? Если GET работает, я бы заподозрил, что на вашем пути есть прокси.

Подробнее о том, что происходит, вы можете узнать, вызвав conn.set_debuglevel(1) до вызова conn.request(...).

Ответ 5

Я только что обнаружил, когда появляется исключение httplib.BadStatusLine, когда сервер идет вниз и не отправляет никакого ответа, значит, веб-сервер даже не отправляет http-код [1]

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

Ответ 6

Проблема у меня была с несколькими запросами, но BadStatusLine встречался только между запросами с более чем 5-секундным интервалом с тайм-аутом Keep-Alive = 5. Я все еще не уверен, почему BadStatusLine поднимается вместо NotConnected. Кажется, что соединение также по умолчанию равно 5, когда заголовок отсутствует. Исправление составляло conn.connect() перед каждым запросом.

Ответ 7

Я также столкнулся с этой проблемой. В соответствии с 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 файл и поэтому были вызваны в начале запуска.

Ответ 8

Я знаю, что "вы должны просто использовать X" ответы недовольны, но я должен сказать, что после попытки поставить эту проблему на пару часов я попробовал Requests с той же настройкой, и она отлично работала. Легче использовать и отлаживать, на мой взгляд, также.

Ответ 9

У нас нет никаких подсказок о том, что находится в вашей строке theurl, и я не знаю, решена ваша проблема или нет (прошло 6 лет, и я надеюсь, что вы сделали это задолго до этого), поэтому я просто даю вам один возможная причина, по которой я встретился и поделиться ею с тем, кто может найти это позже.

Я столкнулся с довольно схожей проблемой, в которой мой код неплохо работает на некоторых компьютерах, но иногда вызывает ошибки BadStatusLine. Это довольно раздражает, как привидение.

После тщательной проверки всей возможной ситуации, я обнаружил, что компонент 'Content-Length' был в моем запросе http header. После удаления компонента мой код хорошо работает на всех компьютерах. Возможно, первая часть вашего theurl содержит нечто вроде моего, что противоречит истинной длине данных.

Ответ 10

Я видел эту ошибку при попытке получить доступ к URL-адресу HTTPS/SSL с помощью httplib.HTTPConnection

Вы должны использовать httplib.HTTPSConnection для доступа к URL-адресам SSL.