aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2020-04-09 15:47:20 +0100
committerGravatar jesopo2020-04-09 15:47:20 +0100
commitb19e956f680a1795aa1506e99bf421944a58b8bc (patch)
tree95006256cf0bf64855ff0261a74709c7238884fa
parentfix regression of message filters not matching without formatting (diff)
experimental support for rss bindhost
-rw-r--r--modules/rss.py11
-rw-r--r--requirements.txt1
-rw-r--r--src/utils/http.py13
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,