mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2026-06-20 16:15:28 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 208e9c6809 | |||
| 6016aca0ba | |||
| 7c908db901 | |||
| 27e57bbf58 | |||
| 4990d664bb | |||
| b3e42c3e20 |
+12
@@ -1,3 +1,15 @@
|
||||
**2016-07-12**
|
||||
|
||||
*Released 4.3.4*
|
||||
|
||||
- Fix proxy support with ``urllib3`` when proxy requires auth
|
||||
|
||||
**2016-07-08**
|
||||
|
||||
*Released 4.3.3*
|
||||
|
||||
- Fix proxy support with ``urllib3``
|
||||
|
||||
**2016-07-04**
|
||||
|
||||
*Released 4.3.2*
|
||||
|
||||
@@ -82,7 +82,7 @@ from .update import Update
|
||||
from .bot import Bot
|
||||
|
||||
__author__ = 'devs@python-telegram-bot.org'
|
||||
__version__ = '4.3.2'
|
||||
__version__ = '4.3.4'
|
||||
__all__ = ['Audio', 'Bot', 'Chat', 'ChatMember', 'ChatAction', 'ChosenInlineResult',
|
||||
'CallbackQuery', 'Contact', 'Document', 'Emoji', 'File', 'ForceReply',
|
||||
'InlineKeyboardButton', 'InlineKeyboardMarkup', 'InlineQuery', 'InlineQueryResult',
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"""This module contains methods to make POST and GET requests"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
import logging
|
||||
|
||||
@@ -31,26 +32,44 @@ from telegram.error import Unauthorized, NetworkError, TimedOut, BadRequest
|
||||
|
||||
_CON_POOL = None
|
||||
""":type: urllib3.PoolManager"""
|
||||
_CON_POOL_PROXY = None
|
||||
_CON_POOL_PROXY_KWARGS = {}
|
||||
CON_POOL_SIZE = 1
|
||||
|
||||
logging.getLogger('urllib3').setLevel(logging.WARNING)
|
||||
|
||||
|
||||
def _get_con_pool():
|
||||
global _CON_POOL
|
||||
|
||||
if _CON_POOL is not None:
|
||||
return _CON_POOL
|
||||
|
||||
_CON_POOL = urllib3.PoolManager(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),
|
||||
])
|
||||
_init_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(**kwargs)
|
||||
else:
|
||||
if _CON_POOL_PROXY_KWARGS:
|
||||
kwargs.update(_CON_POOL_PROXY_KWARGS)
|
||||
mgr = urllib3.proxy_from_url(proxy_url, **kwargs)
|
||||
if mgr.proxy.auth:
|
||||
# TODO: what about other auth types?
|
||||
auth_hdrs = urllib3.make_headers(proxy_basic_auth=mgr.proxy.auth)
|
||||
mgr.proxy_headers.update(auth_hdrs)
|
||||
|
||||
_CON_POOL = mgr
|
||||
|
||||
|
||||
def is_con_pool_initialized():
|
||||
return _CON_POOL is not None
|
||||
|
||||
@@ -62,6 +81,47 @@ def stop_con_pool():
|
||||
_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):
|
||||
"""Try and parse the JSON returned from Telegram.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user