web-dev-qa-db-fra.com

Pourquoi ai-je cette erreur en 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

Est-ce que quelqu'un sait ce qu'est "Bad Status Line"?

Edit: J'ai essayé cela pour de nombreux serveurs, et de nombreuses URL et j'ai toujours cette erreur?

23
TIMEX

Dans la documentation de httplib (Python 2) (appelé http.client en Python 3 ):

exceptionhttplib.BadStatusLine: (exception _ http.client.BadStatusLine :)

Une sous-classe de HTTPException.

Relevé si un serveur répond avec un code d’état HTTP que nous ne comprenons pas.

J'ai couru le même code et je n'ai pas reçu d'erreur:

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

Je suppose qu'il suffit de tout vérifier et d'essayer à nouveau?

29
jathanism

J'ai récemment eu cette erreur, dans une situation où la méthode contenant la requête http a été exécutée avec succès une fois, puis j'ai renvoyé cette exception (avec le code d'état sous la forme d'une chaîne vide) la deuxième fois que la méthode a été appelée (avec une URL différente). J'avais un avantage en termes de débogage car cela appelait ma propre API REST, alors je me suis connecté au serveur et j'ai découvert que la demande n'avait jamais été reçue. J'ai finalement compris que ma chaîne d'URL avait un caractère de fin de ligne. Assurez-vous donc que vos URL sont débarrassées de tous les caractères spéciaux principaux ou suivants.

24
aaaarrgh

La bibliothèque standard Python: httplib (Python 2) (appelé http.client dans Python 3 ):

exception httplib.BadStatusLine
Une sous-classe de HTTPException. Relevé si un serveur répond avec un code d’état HTTP que nous ne comprenons pas.

8
artdanil

Utilisez-vous un proxy?

Si tel est le cas, le serveur proxy rejette peut-être les demandes HEAD.

Avez-vous le même problème si vous émettez une demande GET? Si GET fonctionne, je soupçonne qu'il y a un proxy sur votre passage.

Vous pouvez voir ce qui se passe plus en détail en appelant conn.set_debuglevel(1) avant d'appeler conn.request(...).

6
mhawke

Je viens de constater que lorsque nous obtenons une exception httplib.BadStatusLine, c'est lorsque le serveur tombe en panne et n'envoie pas de réponse. Cela signifie donc que le serveur Web n'envoie même pas le code http [1] 

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

5
Sérgio

J'ai également rencontré ce problème . Selon GmailAPI (python), cela se produit lorsque le serveur ferme la connexion avant d'envoyer une réponse valide. En effet, cela ne m'est arrivé que lorsque mon programme était exécuté sur une base de données volumineuse.

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)

Ma solution a été de déplacer toute la partie qui établit la connexion avec gmail dans une fonction. Ensuite, appelez cette fonction uniquement avant d’envoyer réellement le courrier électronique. Avant cela, les parties chargées d'établir la connexion étaient simplement "jetées" dans un fichier .py et étaient donc appelées au début de la course.

3
brkeyal

Je sais que "vous devriez simplement utiliser X", les réponses sont désapprouvées, mais je dois dire qu'après avoir essayé de diagnostiquer le même problème pendant quelques heures, j'ai essayé Requests avec la même configuration et cela fonctionnait parfaitement. Plus facile à utiliser et à déboguer à mon avis aussi.

2
ohhh

Le problème que j’avais était avec plusieurs demandes, mais BadStatusLine ne se produisait qu’entre des demandes avec un intervalle supérieur à 5 secondes avec un délai d’expiration Keep-Alive = 5. Je ne sais toujours pas pourquoi BadStatusLine a été levé au lieu de NotConnected. Il semble que la connexion par défaut soit également 5 lorsque l'en-tête est manquant . Le correctif était conn.connect() avant chaque demande.

2
estobbart

Nous n'avons aucune idée de ce qui se trouve dans votre chaîne theurl et je ne sais pas si votre problème est résolu ou non (six années se sont écoulées et j'espère que vous l'avez fait longtemps avant). partagez-le avec quelqu'un qui pourra le trouver plus tard.

J'ai rencontré un problème assez similaire, dans lequel mon code fonctionne assez bien sur certains ordinateurs mais soulève parfois des exceptions BadStatusLine. C'est assez agaçant comme un fantôme.

Après avoir soigneusement vérifié tous les stituations possibles, j'ai trouvé un composant 'Content-Length' dans ma requête http header. Après removeing ​​ le composant, mon code s’exécute correctement sur tous les ordinateurs. Peut-être que la première partie de votre theurl contient quelque chose comme la mienne, ce qui contredit la longueur réelle des données.

1
JimmySun

J'ai vu cette erreur en essayant d'accéder à une URL HTTPS/SSL à l'aide de httplib.HTTPConnection

Vous devez utiliser httplib.HTTPSConnection pour accéder aux URL SSL.

0
Gruff