Skip to content

Commit 22a0cea

Browse files
authored
BUGS-21491 Twitter bug workaround (#7)
* Twitter bug workaround * Twitter bug workaround
1 parent 332c96e commit 22a0cea

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

chirpy/api.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import re
22
import requests
3+
import ssl
4+
5+
from urllib3.util.ssl_ import create_urllib3_context
36

47
from functools import partial
58

@@ -21,6 +24,21 @@
2124
class _DEFAULT(object):
2225
pass
2326

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+
2442
class TwitterError(Exception):
2543
"""
2644
Base Exception thrown by the Twitter object when there is a
@@ -187,17 +205,22 @@ def __call__(self, **kwargs):
187205
headers = {'Accept-Encoding': 'gzip'}
188206
headers.update(self.headers)
189207

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+
190213
if json_body is not None:
191214
headers['Content-Type'] = 'application/json; charset=utf-8'
192215

193216
if method == 'GET' or method == 'DELETE':
194-
request = partial(requests.request, params=kwargs)
217+
request = partial(req_session.request, params=kwargs)
195218
elif method == 'POST':
196219
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)
198221
elif method == 'PUT':
199222
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)
201224

202225
resp = request(method, uriBase, headers=headers, timeout=_timeout,
203226
proxies=self.proxies, auth=self.auth)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from setuptools import setup, find_packages
22
import sys, os
33

4-
version = '2.0.2'
4+
version = '2.1.0'
55

66
install_requires = [
77
'requests>=1.2.3',

0 commit comments

Comments
 (0)