diff options
Diffstat (limited to 'src/utils/http.py')
| -rw-r--r-- | src/utils/http.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/utils/http.py b/src/utils/http.py index 1bbc9c07..045d9641 100644 --- a/src/utils/http.py +++ b/src/utils/http.py @@ -3,6 +3,7 @@ import typing, urllib.error, urllib.parse, uuid import json as _json import bs4, netifaces, requests, tornado.httpclient from src import IRCBot, utils +from requests_toolbelt.adapters import source REGEX_URL = re.compile("https?://\S+", re.I) @@ -78,6 +79,8 @@ class Request(object): timeout: int=5 + bindhost: typing.Optional[str] = None + def validate(self): self.id = self.id or str(uuid.uuid4()) self.set_url(self.url) @@ -189,11 +192,17 @@ def _request(request_obj: Request) -> Response: redirect = 0 current_url = request_obj.url + session = requests.Session() + if not request_obj.bindhost is None: + new_source = source.SourceAddressAdapter(request_obj.bindhost) + session.mount('http://', new_source) + session.mount('https://', new_source) + while True: if request_obj.check_hostname: _assert_allowed(current_url) - response = requests.request( + response = session.request( request_obj.method, current_url, headers=headers, @@ -218,6 +227,8 @@ def _request(request_obj: Request) -> Response: raise ValueError("Response too large") break + session.close() + headers = utils.CaseInsensitiveDict(dict(response.headers)) our_response = Response(response.status_code, response_content, encoding=response.encoding, headers=headers, |
