为啥我在 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)的主要内容,如果未能解决你的问题,请参考以下文章