@@ -64,6 +64,9 @@ def dns_lookup(cls, host, port, afi=socket.AF_UNSPEC):
64
64
log .warning ("DNS lookup failed for proxy %s:%d, %r" , host , port , ex )
65
65
return []
66
66
67
+ def use_remote_lookup (self ):
68
+ return self ._proxy_url .scheme == 'socks5h'
69
+
67
70
def socket (self , family , sock_type ):
68
71
"""Open and record a socket.
69
72
@@ -187,7 +190,10 @@ def connect_ex(self, addr):
187
190
return errno .ECONNREFUSED
188
191
189
192
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 :
191
197
addr_type = 1
192
198
addr_len = 4
193
199
elif self ._target_afi == socket .AF_INET6 :
@@ -199,15 +205,27 @@ def connect_ex(self, addr):
199
205
self ._sock .close ()
200
206
return errno .ECONNREFUSED
201
207
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
+ )
211
229
self ._state = ProxyConnectionStates .REQUESTING
212
230
213
231
if self ._state == ProxyConnectionStates .REQUESTING :
0 commit comments