Skip to content

Commit 6f02839

Browse files
authored
Add SNI support for API HTTPS endpoint (#4423)
* Add SNI support for API HTTPS endpoint This allows us to use a production internal loadbalancer without forcing `readthedocs.org` resolves to the internal loadbalancer. * Fix multiple adapter issue, add better mount point
1 parent 5be4cd1 commit 6f02839

File tree

3 files changed

+35
-17
lines changed

3 files changed

+35
-17
lines changed

readthedocs/api/client.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
"""Slumber API client"""
2-
from __future__ import absolute_import
1+
# -*- coding: utf-8 -*-
2+
3+
"""Slumber API client."""
4+
from __future__ import (
5+
absolute_import, division, print_function, unicode_literals)
6+
37
import logging
48

5-
from slumber import API
6-
from requests import Session
79
from django.conf import settings
8-
10+
from requests import Session
11+
from requests_toolbelt.adapters import host_header_ssl
12+
from slumber import API
913

1014
log = logging.getLogger(__name__)
1115

@@ -17,16 +21,17 @@
1721

1822
def setup_api():
1923
session = Session()
24+
session.mount(API_HOST, host_header_ssl.HostHeaderSSLAdapter())
2025
session.headers.update({'Host': PRODUCTION_DOMAIN})
2126
api_config = {
2227
'base_url': '%s/api/v1/' % API_HOST,
2328
'session': session,
2429
}
2530
if USER and PASS:
26-
log.debug("Using slumber with user %s, pointed at %s", USER, API_HOST)
31+
log.debug('Using slumber with user %s, pointed at %s', USER, API_HOST)
2732
session.auth = (USER, PASS)
2833
else:
29-
log.warning("SLUMBER_USERNAME/PASSWORD settings are not set")
34+
log.warning('SLUMBER_USERNAME/PASSWORD settings are not set')
3035
return API(**api_config)
3136

3237

readthedocs/restapi/client.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1+
# -*- coding: utf-8 -*-
2+
13
"""Simple client to access our API with Slumber credentials."""
24

3-
from __future__ import absolute_import
5+
from __future__ import (
6+
absolute_import, division, print_function, unicode_literals)
7+
48
import logging
59

6-
from slumber import API, serialize
710
import requests
811
from django.conf import settings
9-
from rest_framework.renderers import JSONRenderer
12+
from requests_toolbelt.adapters import host_header_ssl
1013
from rest_framework.parsers import JSONParser
11-
14+
from rest_framework.renderers import JSONRenderer
15+
from slumber import API, serialize
1216

1317
log = logging.getLogger(__name__)
1418

@@ -20,7 +24,7 @@
2024

2125
class DrfJsonSerializer(serialize.JsonSerializer):
2226

23-
"""Additional serialization help from the DRF parser/renderer"""
27+
"""Additional serialization help from the DRF parser/renderer."""
2428

2529
key = 'json-drf'
2630

@@ -33,25 +37,33 @@ def dumps(self, data):
3337

3438
def setup_api():
3539
session = requests.Session()
40+
session.mount(
41+
API_HOST,
42+
host_header_ssl.HostHeaderSSLAdapter(
43+
max_retries=3,
44+
),
45+
)
3646
session.headers.update({'Host': PRODUCTION_DOMAIN})
37-
retry_adapter = requests.adapters.HTTPAdapter(max_retries=3)
38-
session.mount(API_HOST, retry_adapter)
3947
api_config = {
4048
'base_url': '%s/api/v2/' % API_HOST,
4149
'serializer': serialize.Serializer(
4250
default='json-drf',
4351
serializers=[
4452
serialize.JsonSerializer(),
4553
DrfJsonSerializer(),
46-
]
54+
],
4755
),
4856
'session': session,
4957
}
5058
if USER and PASS:
51-
log.debug("Using slumber v2 with user %s, pointed at %s", USER, API_HOST)
59+
log.debug(
60+
'Using slumber v2 with user %s, pointed at %s',
61+
USER,
62+
API_HOST,
63+
)
5264
session.auth = (USER, PASS)
5365
else:
54-
log.warning("SLUMBER_USERNAME/PASSWORD settings are not set")
66+
log.warning('SLUMBER_USERNAME/PASSWORD settings are not set')
5567
return API(**api_config)
5668

5769

requirements/pip.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ django-vanilla-views==1.0.5
3030
jsonfield==2.0.2
3131

3232
requests==2.18.4
33+
requests-toolbelt==0.8.0
3334
slumber==0.7.1
3435
lxml==4.2.1
3536
defusedxml==0.5.0

0 commit comments

Comments
 (0)