Merge pull request #340 from python-telegram-bot/v4.3.x

urllib3: now supports proxy
This commit is contained in:
Noam Meltzer 2016-07-08 23:53:56 +03:00 committed by GitHub
commit 6afee6e0bd
3 changed files with 72 additions and 9 deletions

View file

@ -1,3 +1,9 @@
**2016-07-08**
*Released 4.3.3*
- Fix proxy support with ``urllib3``
**2016-07-04** **2016-07-04**
*Released 4.3.2* *Released 4.3.2*

View file

@ -82,7 +82,7 @@ from .update import Update
from .bot import Bot from .bot import Bot
__author__ = 'devs@python-telegram-bot.org' __author__ = 'devs@python-telegram-bot.org'
__version__ = '4.3.2' __version__ = '4.3.3'
__all__ = ['Audio', 'Bot', 'Chat', 'ChatMember', 'ChatAction', 'ChosenInlineResult', __all__ = ['Audio', 'Bot', 'Chat', 'ChatMember', 'ChatAction', 'ChosenInlineResult',
'CallbackQuery', 'Contact', 'Document', 'Emoji', 'File', 'ForceReply', 'CallbackQuery', 'Contact', 'Document', 'Emoji', 'File', 'ForceReply',
'InlineKeyboardButton', 'InlineKeyboardMarkup', 'InlineQuery', 'InlineQueryResult', 'InlineKeyboardButton', 'InlineKeyboardMarkup', 'InlineQuery', 'InlineQueryResult',

View file

@ -19,6 +19,7 @@
"""This module contains methods to make POST and GET requests""" """This module contains methods to make POST and GET requests"""
import json import json
import os
import socket import socket
import logging import logging
@ -31,26 +32,41 @@ from telegram.error import Unauthorized, NetworkError, TimedOut, BadRequest
_CON_POOL = None _CON_POOL = None
""":type: urllib3.PoolManager""" """:type: urllib3.PoolManager"""
_CON_POOL_PROXY = None
_CON_POOL_PROXY_KWARGS = {}
CON_POOL_SIZE = 1 CON_POOL_SIZE = 1
logging.getLogger('urllib3').setLevel(logging.WARNING) logging.getLogger('urllib3').setLevel(logging.WARNING)
def _get_con_pool(): def _get_con_pool():
global _CON_POOL
if _CON_POOL is not None: if _CON_POOL is not None:
return _CON_POOL return _CON_POOL
_CON_POOL = urllib3.PoolManager(maxsize=CON_POOL_SIZE, _init_con_pool()
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where(),
socket_options=HTTPConnection.default_socket_options + [
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
])
return _CON_POOL return _CON_POOL
def _init_con_pool():
global _CON_POOL
kwargs = dict(maxsize=CON_POOL_SIZE,
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where(),
socket_options=HTTPConnection.default_socket_options + [
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
])
proxy_url = _get_con_pool_proxy()
if not proxy_url:
mgr = urllib3.PoolManager
else:
kwargs['proxy_url'] = proxy_url
if _CON_POOL_PROXY_KWARGS:
kwargs.update(_CON_POOL_PROXY_KWARGS)
mgr = urllib3.ProxyManager
_CON_POOL = mgr(**kwargs)
def is_con_pool_initialized(): def is_con_pool_initialized():
return _CON_POOL is not None return _CON_POOL is not None
@ -62,6 +78,47 @@ def stop_con_pool():
_CON_POOL = None _CON_POOL = None
def set_con_pool_proxy(url, **urllib3_kwargs):
"""Setup connection pool behind a proxy
Args:
url (str): The URL to the proxy server. For example: `http://127.0.0.1:3128`
urllib3_kwargs (dict): Arbitrary arguments passed as-is to `urllib3.ProxyManager`
"""
global _CON_POOL_PROXY
global _CON_POOL_PROXY_KWARGS
if is_con_pool_initialized():
raise TelegramError('conpool already initialized')
_CON_POOL_PROXY = url
_CON_POOL_PROXY_KWARGS = urllib3_kwargs
def _get_con_pool_proxy():
"""Return the user configured proxy according to the following order:
* proxy configured using `set_con_pool_proxy()`.
* proxy set in `HTTPS_PROXY` env. var.
* proxy set in `https_proxy` env. var.
* None (if no proxy is configured)
Returns:
str | None
"""
if _CON_POOL_PROXY:
return _CON_POOL_PROXY
from_env = os.environ.get('HTTPS_PROXY')
if from_env:
return from_env
from_env = os.environ.get('https_proxy')
if from_env:
return from_env
return None
def _parse(json_data): def _parse(json_data):
"""Try and parse the JSON returned from Telegram. """Try and parse the JSON returned from Telegram.