为什么我在python中收到此错误? (httplib的)

时间:2009-11-20 02:24:20

标签: python http

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

有谁知道“Bad Status Line”是什么?

编辑:我为很多服务器试过这个,很多网址和我仍然会收到此错误?

10 个答案:

答案 0 :(得分:30)

来自httplib (Python 2)的文档(称为http.client in Python 3):

  

例外 httplib. BadStatusLine :( 例外 http.client. {{1} } :)

     
    

BadStatusLine的子类。

         

如果服务器使用我们不理解的HTTP状态代码进行响应,则引发。

  

我运行了相同的代码并且没有收到错误:

HTTPException

我想只是仔细检查一切,然后再试一次?

答案 1 :(得分:24)

我最近收到此错误,在包含http请求的方法成功运行一次,然后在第二次调用该方法时抛出此异常(状态代码为空字符串)的情况下(使用不同的方法) URL)。我有调试优势,因为这是调用我自己的REST api,所以我在服务器端进行了一些日志记录,发现请求从未被收到。我最终发现我的URL字符串有一个尾随的换行符。因此,请确保您的网址中没有任何前导或尾随特殊字符。

答案 2 :(得分:9)

Python标准库:httplib (Python 2)(称为http.client in Python 3):

  

exception httplib.BadStatusLine
  HTTPException的子类。如果服务器使用我们不理解的HTTP状态代码进行响应,则引发此错误。

答案 3 :(得分:6)

您使用代理吗?

如果是这样,代理服务器可能拒绝HEAD个请求。

如果您发出GET请求,是否会遇到同样的问题?如果GET有效,我会怀疑你的代理人是否存在代理。

您可以在致电conn.set_debuglevel(1)之前致电conn.request(...),了解更详细的信息。

答案 4 :(得分:5)

我刚发现当我们得到异常httplib.BadStatusLine时,就是当服务器出现故障并且没有发送任何响应时,所以这意味着Web服务器甚至不发送http代码[1]

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

答案 5 :(得分:3)

我遇到的问题是多个请求,但BadStatusLine仅发生在间隔超过5秒且保持活动超时= 5的请求之间。我仍然不确定为什么BadStatusLine被提升而不是NotConnected。当标头丢失时,似乎连接也默认为5。 在每次请求之前,修复都是conn.connect()

答案 6 :(得分:3)

我也遇到过这个问题。 根据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文件中,因此在运行开始时被调用。

答案 7 :(得分:2)

我知道&#34;你应该只使用X&#34;答案是不受欢迎的,但我不得不说,在尝试诊断同样的问题几个小时后,我尝试使用相同的设置Requests并且它完美地工作。在我看来也更容易使用和调试。

答案 8 :(得分:1)

我们没有关于你theurl字符串中的内容的线索,我不知道你的问题是否已经解决(6年过去了,我希望你早就做到了),所以我只是给你遇到的一个可能的原因,并与后来可能会发现这一点的人分享。

我遇到了一个非常类似的问题,我的代码在某些计算机上运行得很好但有时会引发BadStatusLine个异常。像鬼一样令人讨厌。

仔细检查了所有可能的情况后,我发现'Content-Length'组件在我的请求http header中。在删除组件后,我的代码在所有计算机上运行良好。也许你的theurl的第一部分包含类似我的东西,这与真正的数据长度相矛盾。

答案 9 :(得分:0)

尝试使用httplib.HTTPConnection访问HTTPS / SSL URL时发现此错误

您应该使用httplib.HTTPSConnection来访问SSL网址。