hypothesis / hypothesis/lms

Crash handling timeout while connecting to JSTOR to get article metadata

Open
#5,208 0 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.