comparison mercurial/url.py @ 10415:677f15da38c1

url: proxy handling, simplify and correctly deal with IPv6 Thanks to Henrik for testing.
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Thu, 11 Feb 2010 20:42:20 +0100
parents af4c42ec19ed
children 95265afff99f
comparison
equal deleted inserted replaced
10414:1a8df80dfdde 10415:677f15da38c1
300 class httpconnection(keepalive.HTTPConnection): 300 class httpconnection(keepalive.HTTPConnection):
301 # must be able to send big bundle as stream. 301 # must be able to send big bundle as stream.
302 send = _gen_sendfile(keepalive.HTTPConnection) 302 send = _gen_sendfile(keepalive.HTTPConnection)
303 303
304 def connect(self): 304 def connect(self):
305 if has_https and self.realhost: # use CONNECT proxy 305 if has_https and self.realhostport: # use CONNECT proxy
306 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 306 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
307 self.sock.connect((self.host, self.port)) 307 self.sock.connect((self.host, self.port))
308 if _generic_proxytunnel(self): 308 if _generic_proxytunnel(self):
309 # we do not support client x509 certificates 309 # we do not support client x509 certificates
310 self.sock = _ssl_wrap_socket(self.sock, None, None) 310 self.sock = _ssl_wrap_socket(self.sock, None, None)
333 new_tunnel = False 333 new_tunnel = False
334 334
335 if new_tunnel or tunnel_host == req.get_full_url(): # has proxy 335 if new_tunnel or tunnel_host == req.get_full_url(): # has proxy
336 urlparts = urlparse.urlparse(tunnel_host) 336 urlparts = urlparse.urlparse(tunnel_host)
337 if new_tunnel or urlparts[0] == 'https': # only use CONNECT for HTTPS 337 if new_tunnel or urlparts[0] == 'https': # only use CONNECT for HTTPS
338 if ':' in urlparts[1]: 338 realhostport = urlparts[1]
339 realhost, realport = urlparts[1].split(':') 339 if realhostport[-1] == ']' or ':' not in realhostport:
340 realport = int(realport) 340 realhostport += ':443'
341 else: 341
342 realhost = urlparts[1] 342 h.realhostport = realhostport
343 realport = 443
344
345 h.realhost = realhost
346 h.realport = realport
347 h.headers = req.headers.copy() 343 h.headers = req.headers.copy()
348 h.headers.update(handler.parent.addheaders) 344 h.headers.update(handler.parent.addheaders)
349 return 345 return
350 346
351 h.realhost = None 347 h.realhostport = None
352 h.realport = None
353 h.headers = None 348 h.headers = None
354 349
355 def _generic_proxytunnel(self): 350 def _generic_proxytunnel(self):
356 proxyheaders = dict( 351 proxyheaders = dict(
357 [(x, self.headers[x]) for x in self.headers 352 [(x, self.headers[x]) for x in self.headers
358 if x.lower().startswith('proxy-')]) 353 if x.lower().startswith('proxy-')])
359 self._set_hostport(self.host, self.port) 354 self._set_hostport(self.host, self.port)
360 self.send('CONNECT %s:%d HTTP/1.0\r\n' % (self.realhost, self.realport)) 355 self.send('CONNECT %s HTTP/1.0\r\n' % self.realhostport)
361 for header in proxyheaders.iteritems(): 356 for header in proxyheaders.iteritems():
362 self.send('%s: %s\r\n' % header) 357 self.send('%s: %s\r\n' % header)
363 self.send('\r\n') 358 self.send('\r\n')
364 359
365 # majority of the following code is duplicated from 360 # majority of the following code is duplicated from
484 # must be able to send big bundle as stream. 479 # must be able to send big bundle as stream.
485 send = _gen_sendfile(BetterHTTPS) 480 send = _gen_sendfile(BetterHTTPS)
486 getresponse = keepalive.wrapgetresponse(httplib.HTTPSConnection) 481 getresponse = keepalive.wrapgetresponse(httplib.HTTPSConnection)
487 482
488 def connect(self): 483 def connect(self):
489 if self.realhost: # use CONNECT proxy 484 if self.realhostport: # use CONNECT proxy
490 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 485 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
491 self.sock.connect((self.host, self.port)) 486 self.sock.connect((self.host, self.port))
492 if _generic_proxytunnel(self): 487 if _generic_proxytunnel(self):
493 self.sock = _ssl_wrap_socket(self.sock, self.cert_file, 488 self.sock = _ssl_wrap_socket(self.sock, self.cert_file,
494 self.key_file) 489 self.key_file)