Skip to content

Commit 01edf49

Browse files
vlaurenzanokevin-bates
authored andcommitted
adds x_header configuration option for use behind proxies
Closes #299
1 parent e294ff9 commit 01edf49

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

kernel_gateway/gatewayapp.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@
22
# Distributed under the terms of the Modified BSD License.
33
"""Kernel Gateway Jupyter application."""
44

5-
import os
6-
import socket
75
import errno
8-
import logging
9-
import nbformat
106
import importlib
7+
import logging
8+
import os
119
import signal
10+
import socket
11+
from distutils.util import strtobool
1212

13+
import nbformat
1314
from notebook.services.kernels.kernelmanager import MappingKernelManager
1415

1516
try:
1617
from urlparse import urlparse
1718
except ImportError:
1819
from urllib.parse import urlparse
1920

20-
from traitlets import Unicode, Integer, default, observe, Type, Instance, List
21+
from traitlets import Unicode, Integer, default, observe, Type, Instance, List, CBool
2122

2223
from jupyter_core.application import JupyterApp, base_aliases
2324
from jupyter_client.kernelspec import KernelSpecManager
@@ -174,6 +175,15 @@ def allow_origin_default(self):
174175
def expose_headers_default(self):
175176
return os.getenv(self.expose_headers_env, '')
176177

178+
trust_xheaders_env = 'KG_TRUST_XHEADERS'
179+
trust_xheaders = CBool(False, config=True,
180+
help='Use x-* header values for overriding the remote-ip, useful when application is behing a proxy. (KG_TRUST_XHEADERS env var)'
181+
)
182+
@default('trust_xheaders')
183+
def trust_xheaders_default(self):
184+
return strtobool(os.getenv(self.trust_xheaders_env, 'False'))
185+
186+
177187
max_age_env = 'KG_MAX_AGE'
178188
max_age = Unicode(config=True,
179189
help='Sets the Access-Control-Max-Age header. (KG_MAX_AGE env var)'
@@ -505,6 +515,7 @@ def init_http_server(self):
505515
"""
506516
ssl_options = self._build_ssl_options()
507517
self.http_server = httpserver.HTTPServer(self.web_app,
518+
xheaders=self.trust_xheaders,
508519
ssl_options=ssl_options)
509520

510521
for port in random_ports(self.port, self.port_retries+1):

kernel_gateway/tests/test_gatewayapp.py

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ def test_config_env_vars(self):
4343
os.environ['KG_KEYFILE'] = '/test/fake.key'
4444
os.environ['KG_CERTFILE'] = '/test/fake.crt'
4545
os.environ['KG_CLIENT_CA'] = '/test/fake_ca.crt'
46+
os.environ['KG_TRUST_XHEADERS'] = 'false'
47+
4648

4749
app = KernelGatewayApp()
4850

@@ -65,6 +67,17 @@ def test_config_env_vars(self):
6567
self.assertEqual(app.keyfile, '/test/fake.key')
6668
self.assertEqual(app.certfile, '/test/fake.crt')
6769
self.assertEqual(app.client_ca, '/test/fake_ca.crt')
70+
self.assertEqual(app.trust_xheaders, False)
71+
72+
def test_trust_xheaders(self):
73+
74+
app = KernelGatewayApp()
75+
self.assertEqual(app.trust_xheaders, False)
76+
os.environ['KG_TRUST_XHEADERS'] = 'true'
77+
app = KernelGatewayApp()
78+
self.assertEqual(app.trust_xheaders, True)
79+
80+
6881

6982
class TestGatewayAppBase(AsyncHTTPTestCase, ExpectLog):
7083
"""Base class for integration style tests using HTTP/Websockets against an

0 commit comments

Comments
 (0)