Skip to content

Commit fa74052

Browse files
committed
Hotfix branch 'humitos/resolver/force-https' into relcorp
2 parents c2ed24b + 7c82c0e commit fa74052

File tree

2 files changed

+55
-51
lines changed

2 files changed

+55
-51
lines changed

readthedocs/core/resolver.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def resolve_domain(self, project, private=None):
136136
return self._get_project_subdomain(canonical_project)
137137
return getattr(settings, 'PRODUCTION_DOMAIN')
138138

139-
def resolve(self, project, protocol='http', filename='', private=None,
139+
def resolve(self, project, require_https=False, filename='', private=None,
140140
**kwargs):
141141
if private is None:
142142
version_slug = kwargs.get('version_slug')
@@ -147,23 +147,25 @@ def resolve(self, project, protocol='http', filename='', private=None,
147147
canonical_project = self._get_canonical_project(project)
148148
custom_domain = self._get_project_custom_domain(canonical_project)
149149

150-
# This duplication from resolve_domain is for performance purposes
151-
# in order to check whether a custom domain should be HTTPS
152-
if custom_domain:
150+
if self._use_custom_domain(custom_domain):
153151
domain = custom_domain.domain
154152
elif self._use_subdomain():
155153
domain = self._get_project_subdomain(canonical_project)
156154
else:
157155
domain = getattr(settings, 'PRODUCTION_DOMAIN')
158156

159-
if custom_domain:
160-
protocol = 'https' if custom_domain.https else 'http'
161-
else:
162-
# Use HTTPS if settings specify
163-
public_domain = getattr(settings, 'PUBLIC_DOMAIN', None)
164-
use_https = getattr(settings, 'PUBLIC_DOMAIN_USES_HTTPS', False)
165-
if use_https and public_domain and public_domain in domain:
166-
protocol = 'https'
157+
public_domain = getattr(settings, 'PUBLIC_DOMAIN', None)
158+
use_https = getattr(settings, 'PUBLIC_DOMAIN_USES_HTTPS', False)
159+
160+
use_https_protocol = any([
161+
# Rely on the ``Domain.https`` field
162+
custom_domain and custom_domain.https,
163+
# or force it if specified
164+
require_https,
165+
# or fallback to settings
166+
use_https and public_domain and public_domain in domain,
167+
])
168+
protocol = 'https' if use_https_protocol else 'http'
167169

168170
return '{protocol}://{domain}{path}'.format(
169171
protocol=protocol,
@@ -249,6 +251,17 @@ def _fix_filename(self, project, filename):
249251
path = ""
250252
return path
251253

254+
def _use_custom_domain(self, custom_domain):
255+
"""
256+
Make decision about whether to use a custom domain to serve docs.
257+
258+
Always use the custom domain if it exists.
259+
260+
:param custom_domain: Domain instance or ``None``
261+
:type custom_domain: readthedocs.projects.models.Domain
262+
"""
263+
return True if custom_domain is not None else False
264+
252265
def _use_subdomain(self):
253266
"""Make decision about whether to use a subdomain to serve docs."""
254267
use_subdomain = getattr(settings, 'USE_SUBDOMAIN', False)

readthedocs/rtd_tests/tests/test_project_symlinks.py

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,26 @@ def get_filesystem(path, top_level_path=None):
5151
return fs
5252

5353

54-
class TempSiterootCase(object):
54+
TEMP_SITE_ROOT = tempfile.mkdtemp(suffix='siteroot')
55+
TEMP_DOCROOT = os.path.join(TEMP_SITE_ROOT, 'user_builds')
5556

56-
"""Override SITE_ROOT and patch necessary pieces to inspect symlink structure
57+
58+
@override_settings(
59+
SITE_ROOT=TEMP_SITE_ROOT,
60+
DOCROOT=TEMP_DOCROOT,
61+
)
62+
class TempSiteRootTestCase(TestCase):
63+
64+
"""
65+
Override SITE_ROOT and patch necessary pieces to inspect symlink structure.
5766
5867
This uses some patches and overidden settings to build out symlinking in a
5968
temporary path. Each test is therefore isolated, and cleanup will remove
6069
these paths after the test case wraps up.
61-
62-
And subclasses that implement :py:class:`TestCase` should also make use of
63-
:py:func:`override_settings`.
6470
"""
6571

6672
def setUp(self):
6773
self.maxDiff = None
68-
self.site_root = os.path.realpath(tempfile.mkdtemp(suffix='siteroot'))
69-
settings.SITE_ROOT = self.site_root
70-
settings.DOCROOT = os.path.join(settings.SITE_ROOT, 'user_builds')
7174
self.mocks = {
7275
'PublicSymlinkBase.CNAME_ROOT': mock.patch(
7376
'readthedocs.core.symlink.PublicSymlinkBase.CNAME_ROOT',
@@ -115,16 +118,16 @@ def setUp(self):
115118
)
116119

117120
def tearDown(self):
118-
shutil.rmtree(self.site_root)
121+
shutil.rmtree(settings.SITE_ROOT)
119122

120123
def assertFilesystem(self, filesystem):
121124
"""
122125
Creates a nested dictionary that represents the folder structure of rootdir
123126
"""
124-
self.assertEqual(filesystem, get_filesystem(self.site_root))
127+
self.assertEqual(filesystem, get_filesystem(settings.SITE_ROOT))
125128

126129

127-
class BaseSymlinkCnames(TempSiterootCase):
130+
class BaseSymlinkCnames(object):
128131

129132
def setUp(self):
130133
super(BaseSymlinkCnames, self).setUp()
@@ -290,19 +293,17 @@ def test_symlink_cname_dont_link_missing_domains(self):
290293
self.assertFilesystem(filesystem)
291294

292295

293-
@override_settings()
294-
class TestPublicSymlinkCnames(BaseSymlinkCnames, TestCase):
296+
class TestPublicSymlinkCnames(BaseSymlinkCnames, TempSiteRootTestCase):
295297
privacy = 'public'
296298
symlink_class = PublicSymlink
297299

298300

299-
@override_settings()
300-
class TestPrivateSymlinkCnames(BaseSymlinkCnames, TestCase):
301+
class TestPrivateSymlinkCnames(BaseSymlinkCnames, TempSiteRootTestCase):
301302
privacy = 'private'
302303
symlink_class = PrivateSymlink
303304

304305

305-
class BaseSubprojects(TempSiterootCase):
306+
class BaseSubprojects(object):
306307

307308
def setUp(self):
308309
super(BaseSubprojects, self).setUp()
@@ -503,19 +504,17 @@ def test_remove_subprojects(self):
503504
self.assertFilesystem(filesystem)
504505

505506

506-
@override_settings()
507-
class TestPublicSubprojects(BaseSubprojects, TestCase):
507+
class TestPublicSubprojects(BaseSubprojects, TempSiteRootTestCase):
508508
privacy = 'public'
509509
symlink_class = PublicSymlink
510510

511511

512-
@override_settings()
513-
class TestPrivateSubprojects(BaseSubprojects, TestCase):
512+
class TestPrivateSubprojects(BaseSubprojects, TempSiteRootTestCase):
514513
privacy = 'private'
515514
symlink_class = PrivateSymlink
516515

517516

518-
class BaseSymlinkTranslations(TempSiterootCase):
517+
class BaseSymlinkTranslations(object):
519518

520519
def setUp(self):
521520
super(BaseSymlinkTranslations, self).setUp()
@@ -757,19 +756,17 @@ def test_remove_language(self):
757756
self.assertFilesystem(filesystem)
758757

759758

760-
@override_settings()
761-
class TestPublicSymlinkTranslations(BaseSymlinkTranslations, TestCase):
759+
class TestPublicSymlinkTranslations(BaseSymlinkTranslations, TempSiteRootTestCase):
762760
privacy = 'public'
763761
symlink_class = PublicSymlink
764762

765763

766-
@override_settings()
767-
class TestPrivateSymlinkTranslations(BaseSymlinkTranslations, TestCase):
764+
class TestPrivateSymlinkTranslations(BaseSymlinkTranslations, TempSiteRootTestCase):
768765
privacy = 'private'
769766
symlink_class = PrivateSymlink
770767

771768

772-
class BaseSymlinkSingleVersion(TempSiterootCase):
769+
class BaseSymlinkSingleVersion(object):
773770

774771
def setUp(self):
775772
super(BaseSymlinkSingleVersion, self).setUp()
@@ -834,19 +831,17 @@ def test_symlink_single_version_missing(self):
834831
self.assertFilesystem(filesystem)
835832

836833

837-
@override_settings()
838-
class TestPublicSymlinkSingleVersion(BaseSymlinkSingleVersion, TestCase):
834+
class TestPublicSymlinkSingleVersion(BaseSymlinkSingleVersion, TempSiteRootTestCase):
839835
privacy = 'public'
840836
symlink_class = PublicSymlink
841837

842838

843-
@override_settings()
844-
class TestPublicSymlinkSingleVersion(BaseSymlinkSingleVersion, TestCase):
839+
class TestPublicSymlinkSingleVersion(BaseSymlinkSingleVersion, TempSiteRootTestCase):
845840
privacy = 'private'
846841
symlink_class = PrivateSymlink
847842

848843

849-
class BaseSymlinkVersions(TempSiterootCase):
844+
class BaseSymlinkVersions(object):
850845

851846
def setUp(self):
852847
super(BaseSymlinkVersions, self).setUp()
@@ -962,20 +957,17 @@ def test_symlink_other_versions(self):
962957
self.assertFilesystem(filesystem)
963958

964959

965-
@override_settings()
966-
class TestPublicSymlinkVersions(BaseSymlinkVersions, TestCase):
960+
class TestPublicSymlinkVersions(BaseSymlinkVersions, TempSiteRootTestCase):
967961
privacy = 'public'
968962
symlink_class = PublicSymlink
969963

970964

971-
@override_settings()
972-
class TestPrivateSymlinkVersions(BaseSymlinkVersions, TestCase):
965+
class TestPrivateSymlinkVersions(BaseSymlinkVersions, TempSiteRootTestCase):
973966
privacy = 'private'
974967
symlink_class = PrivateSymlink
975968

976969

977-
@override_settings()
978-
class TestPublicSymlinkUnicode(TempSiterootCase, TestCase):
970+
class TestPublicSymlinkUnicode(TempSiteRootTestCase):
979971

980972
def setUp(self):
981973
super(TestPublicSymlinkUnicode, self).setUp()
@@ -1040,8 +1032,7 @@ def test_symlink_broadcast_calls_on_project_save(self):
10401032
)
10411033

10421034

1043-
@override_settings()
1044-
class TestPublicPrivateSymlink(TempSiterootCase, TestCase):
1035+
class TestPublicPrivateSymlink(TempSiteRootTestCase):
10451036

10461037
def setUp(self):
10471038
super(TestPublicPrivateSymlink, self).setUp()

0 commit comments

Comments
 (0)