mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-08 12:59:46 +00:00
Add support for proxy again
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
import abc
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
import socket
|
||||
import ssl as ssl_mod
|
||||
|
||||
__log__ = logging.getLogger(__name__)
|
||||
|
||||
@@ -16,11 +17,11 @@ class Connection(abc.ABC):
|
||||
under any conditions for as long as the user doesn't disconnect or
|
||||
the input parameters to auto-reconnect dictate otherwise.
|
||||
"""
|
||||
# TODO Support proxy
|
||||
def __init__(self, ip, port, *, loop):
|
||||
def __init__(self, ip, port, *, loop, proxy=None):
|
||||
self._ip = ip
|
||||
self._port = port
|
||||
self._loop = loop
|
||||
self._proxy = proxy
|
||||
self._reader = None
|
||||
self._writer = None
|
||||
self._disconnected = asyncio.Event(loop=loop)
|
||||
@@ -31,14 +32,48 @@ class Connection(abc.ABC):
|
||||
self._send_queue = asyncio.Queue(1)
|
||||
self._recv_queue = asyncio.Queue(1)
|
||||
|
||||
async def connect(self, timeout=None):
|
||||
async def connect(self, timeout=None, ssl=None):
|
||||
"""
|
||||
Establishes a connection with the server.
|
||||
"""
|
||||
self._reader, self._writer = await asyncio.wait_for(
|
||||
asyncio.open_connection(self._ip, self._port, loop=self._loop),
|
||||
loop=self._loop, timeout=timeout
|
||||
)
|
||||
if not self._proxy:
|
||||
self._reader, self._writer = await asyncio.wait_for(
|
||||
asyncio.open_connection(
|
||||
self._ip, self._port, loop=self._loop, ssl=ssl),
|
||||
loop=self._loop, timeout=timeout
|
||||
)
|
||||
else:
|
||||
import socks
|
||||
if ':' in self._ip:
|
||||
mode, address = socket.AF_INET6, (self._ip, self._port, 0, 0)
|
||||
else:
|
||||
mode, address = socket.AF_INET, (self._ip, self._port)
|
||||
|
||||
s = socks.socksocket(mode, socket.SOCK_STREAM)
|
||||
if isinstance(self._proxy, dict):
|
||||
s.set_proxy(**self._proxy)
|
||||
else:
|
||||
s.set_proxy(*self._proxy)
|
||||
|
||||
s.setblocking(False)
|
||||
await asyncio.wait_for(
|
||||
self._loop.sock_connect(s, address),
|
||||
timeout=timeout,
|
||||
loop=self._loop
|
||||
)
|
||||
if ssl:
|
||||
self._socket.settimeout(timeout)
|
||||
self._socket = ssl_mod.wrap_socket(
|
||||
s,
|
||||
do_handshake_on_connect=True,
|
||||
ssl_version=ssl_mod.PROTOCOL_SSLv23,
|
||||
ciphers='ADH-AES256-SHA'
|
||||
)
|
||||
self._socket.setblocking(False)
|
||||
|
||||
self._reader, self._writer = await asyncio.open_connection(
|
||||
self._ip, self._port, loop=self._loop, sock=s
|
||||
)
|
||||
|
||||
self._disconnected.clear()
|
||||
self._disconnected_future = None
|
||||
|
Reference in New Issue
Block a user