|
1 | 1 | import re |
2 | 2 | import requests |
| 3 | +import ssl |
| 4 | + |
| 5 | +from urllib3.util.ssl_ import create_urllib3_context |
3 | 6 |
|
4 | 7 | from functools import partial |
5 | 8 |
|
|
21 | 24 | class _DEFAULT(object): |
22 | 25 | pass |
23 | 26 |
|
| 27 | +# fix for a sudden twitter outage on 8/4/2023 |
| 28 | +class TwitterNoSSLSessionTicketExtension(requests.adapters.HTTPAdapter): |
| 29 | + def __init__(self): |
| 30 | + self.ssl_context = create_urllib3_context() |
| 31 | + self.ssl_context.options &= ~ssl.OP_NO_TICKET |
| 32 | + super().__init__() |
| 33 | + |
| 34 | + def init_poolmanager(self, *args, **kwargs): |
| 35 | + kwargs["ssl_context"] = self.ssl_context |
| 36 | + super().init_poolmanager(*args, **kwargs) |
| 37 | + |
| 38 | + def proxy_manager_for(self, *args, **kwargs): |
| 39 | + kwargs["ssl_context"] = self.ssl_context |
| 40 | + return super().proxy_manager_for(*args, **kwargs) |
| 41 | + |
24 | 42 | class TwitterError(Exception): |
25 | 43 | """ |
26 | 44 | Base Exception thrown by the Twitter object when there is a |
@@ -187,17 +205,22 @@ def __call__(self, **kwargs): |
187 | 205 | headers = {'Accept-Encoding': 'gzip'} |
188 | 206 | headers.update(self.headers) |
189 | 207 |
|
| 208 | + adapter = TwitterNoSSLSessionTicketExtension() |
| 209 | + req_session = requests.Session() |
| 210 | + req_session.mount('https://api.twitter.com', adapter) |
| 211 | + req_session.mount('http://api.twitter.com', adapter) |
| 212 | + |
190 | 213 | if json_body is not None: |
191 | 214 | headers['Content-Type'] = 'application/json; charset=utf-8' |
192 | 215 |
|
193 | 216 | if method == 'GET' or method == 'DELETE': |
194 | | - request = partial(requests.request, params=kwargs) |
| 217 | + request = partial(req_session.request, params=kwargs) |
195 | 218 | elif method == 'POST': |
196 | 219 | post_data = json.dumps(json_body) if json_body is not None else kwargs |
197 | | - request = partial(requests.request, data=post_data) |
| 220 | + request = partial(req_session.request, data=post_data) |
198 | 221 | elif method == 'PUT': |
199 | 222 | put_data = json.dumps(json_body) if json_body is not None else kwargs |
200 | | - request = partial(requests.request, params=kwargs, data=put_data) |
| 223 | + request = partial(req_session.request, params=kwargs, data=put_data) |
201 | 224 |
|
202 | 225 | resp = request(method, uriBase, headers=headers, timeout=_timeout, |
203 | 226 | proxies=self.proxies, auth=self.auth) |
|
0 commit comments