mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2024-11-22 15:17:00 +01:00
Merge pull request #340 from python-telegram-bot/v4.3.x
urllib3: now supports proxy
This commit is contained in:
commit
6afee6e0bd
3 changed files with 72 additions and 9 deletions
|
@ -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*
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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,24 +32,39 @@ 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()
|
||||||
|
return _CON_POOL
|
||||||
|
|
||||||
|
|
||||||
|
def _init_con_pool():
|
||||||
|
global _CON_POOL
|
||||||
|
kwargs = dict(maxsize=CON_POOL_SIZE,
|
||||||
cert_reqs='CERT_REQUIRED',
|
cert_reqs='CERT_REQUIRED',
|
||||||
ca_certs=certifi.where(),
|
ca_certs=certifi.where(),
|
||||||
socket_options=HTTPConnection.default_socket_options + [
|
socket_options=HTTPConnection.default_socket_options + [
|
||||||
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
|
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
|
||||||
])
|
])
|
||||||
return _CON_POOL
|
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():
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue