Google Mirror API抛出BadStatusLine异常(Python)

3
当使用Mirror API时,我偶尔会从几个API调用中(包括timeline().inserttimeline.list)随机收到"BadStatusLine"异常。从在python中遍历SO寻找类似问题的结果来看,我怀疑这是来自服务器的某种格式不正确的响应。
它似乎是随机发生的,可能是在一段时间不使用API后发生的。以下是一个样本堆栈跟踪:
 Traceback (most recent call last):
   File "service.py", line 61, in receive_message
     self.process_user_chat(msg)
   File "service.py", line 304, in process_user_chat
     self.upsert_timeline_item(sourceItemId, body)
   File "service.py", line 86, in upsert_timeline_item
     new_item = self.glass_service.timeline().insert(body=body).execute()
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 128, in positional_wrapper
     return wrapped(*args, **kwargs)
   File "/usr/local/lib/python2.7/dist-packages/apiclient/http.py", line 676, in execute
     body=self.body, headers=self.headers)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 128, in positional_wrapper
     return wrapped(*args, **kwargs)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 494, in new_request
     self._refresh(request_orig)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 653, in _refresh
     self._do_refresh_request(http_request)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 682, in _do_refresh_request
     self.token_uri, method='POST', body=body, headers=headers)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1570, in request
     (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1317, in _request
     (response, content) = self._conn_request(conn, request_uri, method, body, headers)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1286, in _conn_request
     response = conn.getresponse()
   File "/usr/lib/python2.7/httplib.py", line 1034, in getresponse
    response.begin()
   File "/usr/lib/python2.7/httplib.py", line 407, in begin
     version, status, reason = self._read_status()
   File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
     raise BadStatusLine(line)
 BadStatusLine: ''

这段代码大部分时间都能正常工作,但是偶尔会出现以下响应。


更新:我的代码创建了Google API类并在服务期间使用它们。一旦到了续订我的oauth2令牌(1小时)的时间,我就会遇到这个错误一两次,然后它又可以正常工作了。我能够重构我的代码,使其在每个请求时都创建API类,问题已经解决。这似乎是Google API中已知的一个bug,请参见Anthony Tuininga的选定答案以获取更多信息。


有问题吗,还是这只是一种观察? - Brent Washburne
哈哈,我觉得问题是如何解决它? - Ethan
2个回答

2
这个问题似乎是一个已知的问题。我自己也一直遇到这个问题。如果单个文件上传需要超过1小时,那么就会出现这个错误。如果上传一个不同的文件,API会正确地刷新令牌。请参考这个错误报告获取更多信息。显然它还没有被修复,也没有预计的修复时间。 :-(

https://code.google.com/p/google-api-python-client/issues/detail?id=231


我的理论是Google Api的对象不是设计成长期存在的。我曾经创建API实例,然后在服务的生命周期内使用它们。一旦它们运行了足够长的时间需要刷新,我会遇到这个错误一两次,然后它就会重新开始工作。我重构了我的代码,所以每次请求时都创建API类,问题就解决了。我想知道你是否可以使用相同的策略?一旦在可恢复上传中出现错误,请尝试重新创建API类并继续? - Ethan
我的问题是我正在上传一个大小为25 MB的文件,但有时需要超过一小时的时间。我不确定如何恢复上传,但重新开始上传却可以正常工作。我已经寻找解决这个问题的方法有一段时间了,显然这是一个普遍存在的问题。API 显然无法处理这种情况。 - Anthony Tuininga

1
状态行是HTTP响应返回的第一行。它包含状态码,如200、404、500等。如果httplib无法读取状态行,则无法读取有关其余内容的信息。
问题通常由错误的HTTP请求或服务器问题引起。尝试从浏览器中进行请求,以查看它显示了什么。或者,您可以使用curl或wget进行请求。
您的堆栈跟踪显示oauth2client,因此您必须正在尝试OAuth 2协议。也许前一个请求导致了错误,而这个请求只是在服务器上遇到了关闭的门。记录所有请求和响应可能有助于您确定故障原因。

这一切对我来说都很有意义。我正在使用Google API / Mirror API,而这一切都深藏其中,因此我希望得到一个不需要我入侵Google代码就能使其工作的答案。 - Ethan
似乎是在我的服务一段时间的不活动后发生的(也许这只是一个理论)。它总是在尝试刷新oauth2令牌时失败,但是以后的请求实际上会起作用。我想知道是否可能是httplib2关闭了连接池,但某种方式系统并没有完全意识到它,从而导致错误,然后稍后的请求创建了一个新的连接到服务器。这有任何意义吗? - Ethan
1
可能只是因为他们的服务器太忙而无法响应,您需要重试请求。检查响应头应该会有所帮助。 - Brent Washburne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接