comparison mercurial/url.py @ 40043:6509fcec830c

url: allow to configure timeout on http connection By default, httplib.HTTPConnection opens connection with no timeout. If the server is hanging, Mercurial will wait indefinitely. This may be an issue for automated scripts. Differential Revision: https://phab.mercurial-scm.org/D4878
author C?dric Krier <ced@b2ck.com>
date Thu, 04 Oct 2018 11:28:48 +0200
parents 393e44324037
children bc776c31c093
comparison
equal deleted inserted replaced
40042:208303a8172c 40043:6509fcec830c
315 if self._tunnel_host: 315 if self._tunnel_host:
316 self._tunnel() 316 self._tunnel()
317 317
318 class logginghttphandler(httphandler): 318 class logginghttphandler(httphandler):
319 """HTTP handler that logs socket I/O.""" 319 """HTTP handler that logs socket I/O."""
320 def __init__(self, logfh, name, observeropts): 320 def __init__(self, logfh, name, observeropts, timeout=None):
321 super(logginghttphandler, self).__init__() 321 super(logginghttphandler, self).__init__(timeout=timeout)
322 322
323 self._logfh = logfh 323 self._logfh = logfh
324 self._logname = name 324 self._logname = name
325 self._observeropts = observeropts 325 self._observeropts = observeropts
326 326
363 self.sock, self.key_file, self.cert_file, ui=self.ui, 363 self.sock, self.key_file, self.cert_file, ui=self.ui,
364 serverhostname=host) 364 serverhostname=host)
365 sslutil.validatesocket(self.sock) 365 sslutil.validatesocket(self.sock)
366 366
367 class httpshandler(keepalive.KeepAliveHandler, urlreq.httpshandler): 367 class httpshandler(keepalive.KeepAliveHandler, urlreq.httpshandler):
368 def __init__(self, ui): 368 def __init__(self, ui, timeout=None):
369 keepalive.KeepAliveHandler.__init__(self) 369 keepalive.KeepAliveHandler.__init__(self, timeout=timeout)
370 urlreq.httpshandler.__init__(self) 370 urlreq.httpshandler.__init__(self)
371 self.ui = ui 371 self.ui = ui
372 self.pwmgr = passwordmgr(self.ui, 372 self.pwmgr = passwordmgr(self.ui,
373 self.ui.httppasswordmgrdb) 373 self.ui.httppasswordmgrdb)
374 374
523 ``util.socketobserver`` instance. 523 ``util.socketobserver`` instance.
524 524
525 ``sendaccept`` allows controlling whether the ``Accept`` request header 525 ``sendaccept`` allows controlling whether the ``Accept`` request header
526 is sent. The header is sent by default. 526 is sent. The header is sent by default.
527 ''' 527 '''
528 timeout = ui.configwith(float, 'http', 'timeout')
528 handlers = [] 529 handlers = []
529 530
530 if loggingfh: 531 if loggingfh:
531 handlers.append(logginghttphandler(loggingfh, loggingname, 532 handlers.append(logginghttphandler(loggingfh, loggingname,
532 loggingopts or {})) 533 loggingopts or {}, timeout=timeout))
533 # We don't yet support HTTPS when logging I/O. If we attempt to open 534 # We don't yet support HTTPS when logging I/O. If we attempt to open
534 # an HTTPS URL, we'll likely fail due to unknown protocol. 535 # an HTTPS URL, we'll likely fail due to unknown protocol.
535 536
536 else: 537 else:
537 handlers.append(httphandler()) 538 handlers.append(httphandler(timeout=timeout))
538 if has_https: 539 if has_https:
539 handlers.append(httpshandler(ui)) 540 handlers.append(httpshandler(ui, timeout=timeout))
540 541
541 handlers.append(proxyhandler(ui)) 542 handlers.append(proxyhandler(ui))
542 543
543 passmgr = passwordmgr(ui, ui.httppasswordmgrdb) 544 passmgr = passwordmgr(ui, ui.httppasswordmgrdb)
544 if authinfo is not None: 545 if authinfo is not None: