We have usages of the requests library littered throughout our project. Recently we came across a bug in one of our destinations where it froze mid transaction, and decided to just hold the connection open.
Naturally, our application followed suit.
Is there a environment variable, or some other way to set the timeout? Even if it's significant (say, 30 seconds) it should be enough to stop the entire works from stopping because of one service. If possible, it should be global so that I don't have to find every single use, and so that people can't forget to add it in the future.
The default value is 120 seconds. This stanza entry affects request and response data sent as two or more fragments. The stanza entry specifies the timeout (in seconds) between each request data fragment after the first data fragment is received by WebSEAL.
The default value is 100,000 milliseconds (100 seconds).
The simplest way is to "shim" the session's request
function:
import requests import functools s = requests.Session() s.request = functools.partial(s.request, timeout=3) # now all get, post, head etc requests should timeout after 3 seconds # following will fail s.get('https://httpbin.org/delay/6') # we can still pass higher timeout when needed # following will succeed s.get('https://httpbin.org/delay/6', timeout=7)
Unfortunately, looking at the code, there is no possibility to set a global default value. I was kinda surprised by that, as I would expect that to be quite common use case. If you start a feature request, please let me know (e.g. in comments to this post).
The reason for that is that methods like get(...)
, post(...)
, etc are all just thin wrappers over Session.request(...)
method (requests.get(...)
creates new one-shot session, just for a single request). That method takes timeout
as argument, and does not inspect Session
internals for a value if there is no timeout argument, so you always have to put it there manually, like 2ps proposed in his answer.
Sources:
Revised on master on 31.08.2020. Line numbers have changed, but methods stayed the same. The answer stays the same.
requests/__init__.py
- import API to package scope, to provide requests.get(...)
-like utilitiesrequests.api
- API module that is imported in point above; usess one-shot sessionsrequests.sessions
- Session
implementation Session
classrequest(...)
methodtimeout
parameterget(...)
methodPS. See this pull request. Disclaimer: it's mine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With