@@ -64,6 +64,9 @@ def dns_lookup(cls, host, port, afi=socket.AF_UNSPEC):
6464 log .warning ("DNS lookup failed for proxy %s:%d, %r" , host , port , ex )
6565 return []
6666
67+ def use_remote_lookup (self ):
68+ return self ._proxy_url .scheme == 'socks5h'
69+
6770 def socket (self , family , sock_type ):
6871 """Open and record a socket.
6972
@@ -187,7 +190,10 @@ def connect_ex(self, addr):
187190 return errno .ECONNREFUSED
188191
189192 if self ._state == ProxyConnectionStates .REQUEST_SUBMIT :
190- if self ._target_afi == socket .AF_INET :
193+ if self .use_remote_lookup ():
194+ addr_type = 3
195+ addr_len = len (addr [0 ])
196+ elif self ._target_afi == socket .AF_INET :
191197 addr_type = 1
192198 addr_len = 4
193199 elif self ._target_afi == socket .AF_INET6 :
@@ -199,15 +205,27 @@ def connect_ex(self, addr):
199205 self ._sock .close ()
200206 return errno .ECONNREFUSED
201207
202- self ._buffer_out = struct .pack (
203- "!bbbb{}sh" .format (addr_len ),
204- 5 , # version
205- 1 , # command: connect
206- 0 , # reserved
207- addr_type , # 1 for ipv4, 4 for ipv6 address
208- socket .inet_pton (self ._target_afi , addr [0 ]), # either 4 or 16 bytes of actual address
209- addr [1 ], # port
210- )
208+ if self .use_remote_lookup ():
209+ self ._buffer_out = struct .pack (
210+ "!bbbbb{}sh" .format (addr_len ),
211+ 5 , # version
212+ 1 , # command: connect
213+ 0 , # reserved
214+ addr_type , # 1 for ipv4, 4 for ipv6 address, 3 for domain name
215+ addr_len ,
216+ addr [0 ].encode ('ascii' ), # host
217+ addr [1 ], # port
218+ )
219+ else :
220+ self ._buffer_out = struct .pack (
221+ "!bbbb{}sh" .format (addr_len ),
222+ 5 , # version
223+ 1 , # command: connect
224+ 0 , # reserved
225+ addr_type , # 1 for ipv4, 4 for ipv6 address, 3 for domain name
226+ socket .inet_pton (self ._target_afi , addr [0 ]), # either 4 or 16 bytes of actual address
227+ addr [1 ], # port
228+ )
211229 self ._state = ProxyConnectionStates .REQUESTING
212230
213231 if self ._state == ProxyConnectionStates .REQUESTING :
0 commit comments