@@ -153,15 +153,35 @@ def _set_response_headers(request, headers):
153153
154154def _reconstruct_url (request ):
155155 # HTTP "Hosts" header only supports ascii
156- server_name = request .getRequestHostname ().decode ('ascii' )
157- server_port = request .getHost ().port
158- if (bool (request .isSecure ()), server_port ) not in [(True , 443 ), (False , 80 )]:
156+
157+ server_name = request .getHeader (b"x-forwarded-host" )
158+ server_port = request .getHeader (b"x-forwarded-port" )
159+ if server_port is not None :
160+ try :
161+ server_port = int (server_port )
162+ except Exception as e :
163+ logger .debug ("Ignoring exception: %r for value %r" , e , server_port )
164+ server_port = None
165+
166+ is_secure = request .getHeader (b"x-forwarded-proto" )
167+ if is_secure is not None :
168+ is_secure = is_secure == 'https'
169+
170+ if server_name is None :
171+ server_name = request .getRequestHostname ().decode ('ascii' )
172+ if server_port is None :
173+ server_port = request .getHost ().port
174+ if is_secure is None :
175+ is_secure = bool (request .isSecure ())
176+
177+ if (is_secure , server_port ) not in ((True , 443 ), (False , 80 )):
159178 server_name = '%s:%d' % (server_name , server_port )
160179
161- if request . isSecure () :
180+ if is_secure :
162181 url_scheme = 'https'
163182 else :
164183 url_scheme = 'http'
184+
165185 uri = _decode_path (request .uri )
166186 return '' .join ([url_scheme , "://" , server_name , uri ])
167187
@@ -585,6 +605,10 @@ def handle_rpc(self, request):
585605 return retval
586606
587607 def __handle_wsdl_request (self , request ):
608+ # disabled for performance reasons.
609+ # logger.debug("WSDL request headers: %r",
610+ # list(request.requestHeaders.getAllRawHeaders()))
611+
588612 ctx = TwistedHttpMethodContext (self .http_transport , request ,
589613 "text/xml; charset=utf-8" )
590614 url = _reconstruct_url (request )
0 commit comments