X Tutup
Skip to content

Commit 6afee6e

Browse files
authored
Merge pull request python-telegram-bot#340 from python-telegram-bot/v4.3.x
urllib3: now supports proxy
2 parents c2cce40 + 27e57bb commit 6afee6e

File tree

3 files changed

+72
-9
lines changed

3 files changed

+72
-9
lines changed

CHANGES.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
**2016-07-08**
2+
3+
*Released 4.3.3*
4+
5+
- Fix proxy support with ``urllib3``
6+
17
**2016-07-04**
28

39
*Released 4.3.2*

telegram/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
from .bot import Bot
8383

8484
__author__ = 'devs@python-telegram-bot.org'
85-
__version__ = '4.3.2'
85+
__version__ = '4.3.3'
8686
__all__ = ['Audio', 'Bot', 'Chat', 'ChatMember', 'ChatAction', 'ChosenInlineResult',
8787
'CallbackQuery', 'Contact', 'Document', 'Emoji', 'File', 'ForceReply',
8888
'InlineKeyboardButton', 'InlineKeyboardMarkup', 'InlineQuery', 'InlineQueryResult',

telegram/utils/request.py

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"""This module contains methods to make POST and GET requests"""
2020

2121
import json
22+
import os
2223
import socket
2324
import logging
2425

@@ -31,26 +32,41 @@
3132

3233
_CON_POOL = None
3334
""":type: urllib3.PoolManager"""
35+
_CON_POOL_PROXY = None
36+
_CON_POOL_PROXY_KWARGS = {}
3437
CON_POOL_SIZE = 1
3538

3639
logging.getLogger('urllib3').setLevel(logging.WARNING)
3740

3841

3942
def _get_con_pool():
40-
global _CON_POOL
41-
4243
if _CON_POOL is not None:
4344
return _CON_POOL
4445

45-
_CON_POOL = urllib3.PoolManager(maxsize=CON_POOL_SIZE,
46-
cert_reqs='CERT_REQUIRED',
47-
ca_certs=certifi.where(),
48-
socket_options=HTTPConnection.default_socket_options + [
49-
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
50-
])
46+
_init_con_pool()
5147
return _CON_POOL
5248

5349

50+
def _init_con_pool():
51+
global _CON_POOL
52+
kwargs = dict(maxsize=CON_POOL_SIZE,
53+
cert_reqs='CERT_REQUIRED',
54+
ca_certs=certifi.where(),
55+
socket_options=HTTPConnection.default_socket_options + [
56+
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
57+
])
58+
proxy_url = _get_con_pool_proxy()
59+
if not proxy_url:
60+
mgr = urllib3.PoolManager
61+
else:
62+
kwargs['proxy_url'] = proxy_url
63+
if _CON_POOL_PROXY_KWARGS:
64+
kwargs.update(_CON_POOL_PROXY_KWARGS)
65+
mgr = urllib3.ProxyManager
66+
67+
_CON_POOL = mgr(**kwargs)
68+
69+
5470
def is_con_pool_initialized():
5571
return _CON_POOL is not None
5672

@@ -62,6 +78,47 @@ def stop_con_pool():
6278
_CON_POOL = None
6379

6480

81+
def set_con_pool_proxy(url, **urllib3_kwargs):
82+
"""Setup connection pool behind a proxy
83+
84+
Args:
85+
url (str): The URL to the proxy server. For example: `http://127.0.0.1:3128`
86+
urllib3_kwargs (dict): Arbitrary arguments passed as-is to `urllib3.ProxyManager`
87+
88+
"""
89+
global _CON_POOL_PROXY
90+
global _CON_POOL_PROXY_KWARGS
91+
92+
if is_con_pool_initialized():
93+
raise TelegramError('conpool already initialized')
94+
95+
_CON_POOL_PROXY = url
96+
_CON_POOL_PROXY_KWARGS = urllib3_kwargs
97+
98+
99+
def _get_con_pool_proxy():
100+
"""Return the user configured proxy according to the following order:
101+
102+
* proxy configured using `set_con_pool_proxy()`.
103+
* proxy set in `HTTPS_PROXY` env. var.
104+
* proxy set in `https_proxy` env. var.
105+
* None (if no proxy is configured)
106+
107+
Returns:
108+
str | None
109+
110+
"""
111+
if _CON_POOL_PROXY:
112+
return _CON_POOL_PROXY
113+
from_env = os.environ.get('HTTPS_PROXY')
114+
if from_env:
115+
return from_env
116+
from_env = os.environ.get('https_proxy')
117+
if from_env:
118+
return from_env
119+
return None
120+
121+
65122
def _parse(json_data):
66123
"""Try and parse the JSON returned from Telegram.
67124

0 commit comments

Comments
 (0)
X Tutup