diff mercurial/exchange.py @ 26645:2faa7671a4b3

clonebundles: filter on SNI requirement Server Name Indication (SNI) is commonly used in CDNs and other hosted environments. Unfortunately, Python <2.7.9 does not support SNI and when these older Python versions attempt to negotiate TLS to an SNI server, they raise an opaque error like "_ssl.c:507: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure." We introduce a manifest attribute to denote the URL requires SNI and have clients without SNI support filter these entries.
author Gregory Szorc <gregory.szorc@gmail.com>
date Tue, 13 Oct 2015 10:59:41 -0700
parents 74de1c59f71c
children 77769354d4ad
line wrap: on
line diff
--- a/mercurial/exchange.py	Tue Oct 13 11:45:30 2015 -0700
+++ b/mercurial/exchange.py	Tue Oct 13 10:59:41 2015 -0700
@@ -12,6 +12,7 @@
 import discovery, phases, obsolete, bookmarks as bookmod, bundle2, pushkey
 import lock as lockmod
 import streamclone
+import sslutil
 import tags
 import url as urlmod
 
@@ -1670,6 +1671,11 @@
                               'spec: %s\n' % (entry['URL'], str(e)))
                 continue
 
+        if 'REQUIRESNI' in entry and not sslutil.hassni:
+            repo.ui.debug('filtering %s because SNI not supported\n' %
+                          entry['URL'])
+            continue
+
         newentries.append(entry)
 
     return newentries