diff options
| author | 2020-04-09 15:47:20 +0100 | |
|---|---|---|
| committer | 2020-04-09 15:47:20 +0100 | |
| commit | b19e956f680a1795aa1506e99bf421944a58b8bc (patch) | |
| tree | 95006256cf0bf64855ff0261a74709c7238884fa | |
| parent | fix regression of message filters not matching without formatting (diff) | |
experimental support for rss bindhost
| -rw-r--r-- | modules/rss.py | 11 | ||||
| -rw-r--r-- | requirements.txt | 1 | ||||
| -rw-r--r-- | src/utils/http.py | 13 |
3 files changed, 22 insertions, 3 deletions
diff --git a/modules/rss.py b/modules/rss.py index 56491298..f597e3dc 100644 --- a/modules/rss.py +++ b/modules/rss.py @@ -7,10 +7,15 @@ import feedparser RSS_INTERVAL = 60 # 1 minute +SETTING_BIND = utils.Setting("rss-bindhost", + "Which local address to bind to for RSS requests", example="127.0.0.1") + @utils.export("botset", utils.IntSetting("rss-interval", "Interval (in seconds) between RSS polls", example="120")) @utils.export("channelset", utils.BoolSetting("rss-shorten", "Whether or not to shorten RSS urls")) +@utils.export("serverset", SETTING_BIND) +@utils.export("channelset", SETTING_BIND) class Module(ModuleManager.BaseModule): _name = "RSS" def on_load(self): @@ -57,8 +62,10 @@ class Module(ModuleManager.BaseModule): return requests = [] - for url in hooks.keys(): - requests.append(utils.http.Request(url, id=url)) + for url, (server, channel) in hooks.items(): + bindhost = channel.get_setting("rss-bindhost", + server.get_setting("rss-bindhost", None)) + requests.append(utils.http.Request(url, id=url, bindhost=bindhost)) pages = utils.http.request_many(requests) diff --git a/requirements.txt b/requirements.txt index 093bb8cc..e350d276 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ scrypt ==0.8.13 suds-jurko ==0.6 tornado ==6.0.3 tweepy ==3.8.0 +requests-toolbelt ==0.9.1 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, |
