Crash handling timeout while connecting to JSTOR to get article metadata
- Dominant language
- Python
- Stars
- 53
- Forks
- 16
- Avg merge
- 14d 5h
- Merged PRs (30d)
- 14
Description
If attempting to connect to JSTOR to fetch article metadata times out, we crash when handling the response. [Slack thread](https://hypothes-is.slack.com/archives/C2BLQDKHA/p1679328597534289) where issue was reported.
Sentry Issue: [LMS-BACKEND-PT](https://hypothesis.sentry.io/issues/3869081293/?referrer=github_integration)
```
timeout: The read operation timed out
(5 additional frame(s) were not displayed)
...
File "http/client.py", line 316, in begin
version, status, reason = self._read_status()
File "http/client.py", line 277, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "socket.py", line 669, in readinto
return self._sock.recv_into(b)
File "ssl.py", line 1241, in recv_into
return self.read(nbytes, buffer)
File "ssl.py", line 1099, in read
return self._sslobj.read(len, buffer)
ReadTimeoutError: HTTPSConnectionPool(host='labs.jstor.org', port=443): Read timed out. (read timeout=10)
(4 additional frame(s) were not displayed)
...
File "urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "newrelic/hooks/external_urllib3.py", line 28, in _nr_wrapper_make_request_
return ExternalTraceWrapper(wrapped, 'urllib3', url_for_apm_ui)(*args, **kwargs)
File "newrelic/api/external_trace.py", line 120, in literal_wrapper
return wrapped(*args, **kwargs)
File "urllib3/connectionpool.py", line 447, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
File "urllib3/connectionpool.py", line 336, in _raise_timeout
raise ReadTimeoutError(
ReadTimeout: HTTPSConnectionPool(host='labs.jstor.org', port=443): Read timed out. (read timeout=10)
File "lms/services/http.py", line 37, in request
response = self.session.request(method, url, timeout=timeout, **kwargs)
File "requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "newrelic/api/external_trace.py", line 103, in dynamic_wrapper
return wrapped(*args, **kwargs)
File "requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "requests/adapters.py", line 578, in send
raise ReadTimeout(e, request=request)
ExternalRequestError: ExternalRequestError(message=None, request=Request(method='GET', url='https://labs.jstor.org/api/anno/metadata/10.2307/j.ctv1b0fvv6.8', body=None), response=Response(status_code=None, reason=None, body=None), validation_errors=None)
File "lms/services/jstor/service.py", line 89, in get_article_metadata
response = self._api_request("/metadata/{doi}", doi=article_id)
File "lms/services/jstor/service.py", line 174, in _api_request
return self._http.get(
File "lms/services/http.py", line 45, in get
return self.request("GET", *args, **kwargs)
File "lms/services/http.py", line 40, in request
raise ExternalRequestError(request=err.request, response=response) from err
AttributeError: 'NoneType' object has no attribute 'status_code'
(9 additional frame(s) were not displayed)
...
File "pyramid/viewderivers.py", line 427, in rendered_view
result = view(context, request)
File "newrelic/hooks/framework_pyramid.py", line 157, in _wrapper
return wrapper(context, request)
File "pyramid/viewderivers.py", line 113, in _class_requestonly_view
response = getattr(inst, attr)()
File "lms/views/api/jstor.py", line 15, in article_metadata
return self.jstor_service.get_article_metadata(
File "lms/services/jstor/service.py", line 98, in get_article_metadata
resp.status_code == 404
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.