|
1 | 1 | import asyncio |
2 | 2 | import socket |
3 | 3 | import struct |
| 4 | +from asyncio import sslproto |
| 5 | + |
4 | 6 | from . import constants as c |
5 | 7 | from .helpers import ( |
6 | 8 | Socks4Addr, Socks5Addr, Socks5Auth, Socks4Auth |
@@ -67,20 +69,20 @@ async def negotiate(self, reader, writer): |
67 | 69 | if self._ssl: |
68 | 70 | # Creating a ssl transport needs to be reworked. |
69 | 71 | # See details: http://bugs.python.org/issue23749 |
70 | | - sock = self._transport.get_extra_info('socket') |
71 | | - |
72 | | - # temporary fix: |
73 | | - self._transport.pause_reading() |
74 | | - self._transport._closing = True |
75 | | - self._transport._sock = None |
76 | | - self._transport._protocol = None |
77 | | - self._transport._loop = None |
78 | | - |
79 | | - self._transport = self._loop._make_ssl_transport( |
80 | | - rawsock=sock, protocol=self._app_protocol, |
81 | | - sslcontext=self._ssl, server_side=False, |
82 | | - server_hostname=self._server_hostname, |
83 | | - waiter=self._waiter) |
| 72 | + self._tls_protocol = sslproto.SSLProtocol( |
| 73 | + app_protocol=self, sslcontext=self._ssl, server_side=False, |
| 74 | + server_hostname=self._server_hostname, waiter=self._waiter, |
| 75 | + loop=self._loop, call_connection_made=False) |
| 76 | + |
| 77 | + # starttls |
| 78 | + original_transport = self._transport |
| 79 | + self._transport.set_protocol(self._tls_protocol) |
| 80 | + self._transport = self._tls_protocol._app_transport |
| 81 | + |
| 82 | + self._tls_protocol.connection_made(original_transport) |
| 83 | + |
| 84 | + self._loop.call_soon(self._app_protocol.connection_made, |
| 85 | + self._transport) |
84 | 86 | else: |
85 | 87 | self._loop.call_soon(self._app_protocol.connection_made, |
86 | 88 | self._transport) |
|
0 commit comments