@@ -45,6 +45,7 @@ def __init__(self, *args, **kwargs):
4545 self .absolute_url = kwargs .pop ('absolute_url' , False )
4646 self .host_whitelist = kwargs .pop ('host_whitelist' , ['localhost' , '127.0.0.1' ])
4747 self .subprotocols = None
48+ self .ssl_options = kwargs .pop ('ssl_options' , None )
4849 super ().__init__ (* args , ** kwargs )
4950
5051 # Support all the methods that tornado does by default except for GET which
@@ -165,7 +166,8 @@ def _build_proxy_request(self, host, port, proxied_path, body):
165166
166167 headers = self .proxy_request_headers ()
167168
168- client_uri = self .get_client_uri ('http' , host , port , proxied_path )
169+ protocol = 'http' if self .ssl_options is None else 'https'
170+ client_uri = self .get_client_uri (protocol , host , port , proxied_path )
169171 # Some applications check X-Forwarded-Context and X-ProxyContextPath
170172 # headers to see if and where they are being proxied from.
171173 if not self .absolute_url :
@@ -276,7 +278,8 @@ async def proxy_open(self, host, port, proxied_path=''):
276278 if not proxied_path .startswith ('/' ):
277279 proxied_path = '/' + proxied_path
278280
279- client_uri = self .get_client_uri ('ws' , host , port , proxied_path )
281+ protocol = 'ws' if self .ssl_options is None else 'wss'
282+ client_uri = self .get_client_uri (protocol , host , port , proxied_path )
280283 headers = self .request .headers
281284 current_loop = ioloop .IOLoop .current ()
282285 ws_connected = current_loop .asyncio_loop .create_future ()
@@ -307,7 +310,8 @@ def ping_cb(data):
307310 async def start_websocket_connection ():
308311 self .log .info ('Trying to establish websocket connection to {}' .format (client_uri ))
309312 self ._record_activity ()
310- request = httpclient .HTTPRequest (url = client_uri , headers = headers )
313+ request = httpclient .HTTPRequest (url = client_uri , headers = headers ,
314+ ssl_options = self .ssl_options )
311315 self .ws = await pingable_ws_connect (request = request ,
312316 on_message_callback = message_cb , on_ping_callback = ping_cb ,
313317 subprotocols = self .subprotocols )
@@ -330,7 +334,11 @@ def proxy_request_headers(self):
330334 def proxy_request_options (self ):
331335 '''A dictionary of options to be used when constructing
332336 a tornado.httpclient.HTTPRequest instance for the proxy request.'''
337+ < << << << HEAD
333338 return dict (follow_redirects = False , connect_timeout = 250.0 , request_timeout = 300.0 )
339+ == == == =
340+ return dict (follow_redirects = False , ssl_options = self .ssl_options )
341+ >> >> >> > Enable SSL on forwarded requests
334342
335343 def check_xsrf_cookie (self ):
336344 '''
@@ -556,17 +564,21 @@ def options(self, path):
556564 return self .proxy (self .port , path )
557565
558566
559- def setup_handlers (web_app , host_whitelist ):
567+ def setup_handlers (web_app , host_whitelist , ssl_options ):
560568 host_pattern = '.*$'
561569 web_app .add_handlers ('.*' , [
562570 (url_path_join (web_app .settings ['base_url' ], r'/proxy/(.*):(\d+)(.*)' ),
563- RemoteProxyHandler , {'absolute_url' : False , 'host_whitelist' : host_whitelist }),
571+ RemoteProxyHandler , {'absolute_url' : False , 'host_whitelist' : host_whitelist ,
572+ 'ssl_options' : ssl_options }),
564573 (url_path_join (web_app .settings ['base_url' ], r'/proxy/absolute/(.*):(\d+)(.*)' ),
565- RemoteProxyHandler , {'absolute_url' : True , 'host_whitelist' : host_whitelist }),
574+ RemoteProxyHandler , {'absolute_url' : True , 'host_whitelist' : host_whitelist ,
575+ 'ssl_options' : ssl_options }),
566576 (url_path_join (web_app .settings ['base_url' ], r'/proxy/(\d+)(.*)' ),
567- LocalProxyHandler , {'absolute_url' : False }),
577+ LocalProxyHandler , {'absolute_url' : False ,
578+ 'ssl_options' : ssl_options }),
568579 (url_path_join (web_app .settings ['base_url' ], r'/proxy/absolute/(\d+)(.*)' ),
569- LocalProxyHandler , {'absolute_url' : True }),
580+ LocalProxyHandler , {'absolute_url' : True ,
581+ 'ssl_options' : ssl_options }),
570582 ])
571583
572584# vim: set et ts=4 sw=4:
0 commit comments