From 2d0f508648a1e7c073bc897b645a43ee37ff2a40 Mon Sep 17 00:00:00 2001 From: Conley Owens Date: Fri, 31 Jan 2014 15:03:51 -0800 Subject: [PATCH] Fix persistent-https relative url resolving Previously, we would remove 'persistent-' then tack it on at the end if it had been previously found. However, this would ignore urljoin's decision on whether or not the second path was relative. Instead, we were always assuming it was relative and that we didn't want to use a different absolute url with a different protocol. This change handles persistent-https:// in the same way we handled the absense of an explicit protocol. The only difference is that this time instead of temporarily replacing it with 'gopher://', we use 'wais://'. Change-Id: I6e8ad1eb4b911931a991481717f1ade01315db2a --- manifest_xml.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest_xml.py b/manifest_xml.py index f2ac77a5..d496337c 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -80,18 +80,20 @@ class _XmlRemote(object): def _resolveFetchUrl(self): url = self.fetchUrl.rstrip('/') manifestUrl = self.manifestUrl.rstrip('/') - p = manifestUrl.startswith('persistent-http') - if p: - manifestUrl = manifestUrl[len('persistent-'):] - - # urljoin will get confused if there is no scheme in the base url - # ie, if manifestUrl is of the form + # urljoin will gets confused over quite a few things. The ones we care + # about here are: + # * no scheme in the base url, like + # * persistent-https:// + # We handle this by replacing these with obscure protocols + # and then replacing them with the original when we are done. + # gopher -> + # wais -> persistent-https if manifestUrl.find(':') != manifestUrl.find('/') - 1: manifestUrl = 'gopher://' + manifestUrl + manifestUrl = re.sub(r'^persistent-https://', 'wais://', manifestUrl) url = urllib.parse.urljoin(manifestUrl, url) url = re.sub(r'^gopher://', '', url) - if p: - url = 'persistent-' + url + url = re.sub(r'^wais://', 'persistent-https://', url) return url def ToRemoteSpec(self, projectName):