为啥我在 python 中收到此错误? (httplib)

Posted

技术标签:

【中文标题】为啥我在 python 中收到此错误? (httplib)【英文标题】:Why am I getting this error in python ? (httplib)为什么我在 python 中收到此错误? (httplib) 【发布时间】:2010-12-18 14:01:11 【问题描述】:
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 上都试过这个,但我仍然收到这个错误?

【问题讨论】:

在我的特殊情况下,当我将 Http://... 更改为 Http://... 时,问题就消失了。尝试一下。 【参考方案1】:

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

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

我想只是仔细检查所有内容然后再试一次?

【讨论】:

很奇怪。我将您的代码复制并粘贴到我的 5 个服务器(不同的 IP)中,并得到了错误。 嗯,您是否验证了其他系统内容,例如 DNS 名称解析?另外,您是否被代理(如@mhawke 所问)?这是跨越到系统管理员领域... 在httplib.BadStatusLine的情况下是否可以记录完整的HTTP响应?【参考方案2】:

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

exception httplib.BadStatusLine HTTPException 的子类。如果服务器以我们不理解的 HTTP 状态代码响应,则引发。

【讨论】:

【参考方案3】:

你在使用代理吗?

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

如果您发出GET 请求,您会遇到同样的问题吗?如果GET 有效,我怀疑你的方式有代理。

您可以在致电conn.request(...) 之前致电conn.set_debuglevel(1) 了解更多详情。

【讨论】:

我在通过学校网络运行时收到此错误,但是当我使用手机时它运行良好。是否有解决方案,因为我需要访问的所有内容都可以在我的浏览器 o.O 中访问? 修复:连接后使用路径而不是尝试从整个 url 请求【参考方案4】:

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

【讨论】:

太棒了...这为我修复了它...永远不会怀疑换行符会显示这样一个不相关的错误消息。我很幸运,在帖子发布四年后,aarrgh 和我遇到了同样的问题。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

对我来说同样的问题。 Ubuntu 驱动器已满。带有服务器的 Docker 容器坏了。必须重新启动才能修复它。【参考方案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】:

我在尝试使用 httplib.HTTPConnection 访问 HTTPS/SSL URL 时看到此错误

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

【讨论】:

以上是关于为啥我在 python 中收到此错误? (httplib)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此语法错误? (Python)

为啥我在使用 pip install 命令时会收到此错误 [重复]

为啥我在 django 教程中收到此模板错误?

为啥我在角度请求中收到此错误? (CORS)

为啥我在 facenet 中收到此错误?

为啥我在此代码中收到 SIGABRT 错误 [关闭]