def _extractURLparts(request: IRequest) -> Tuple[str, str, int, str, str]: """ Extracts and decodes URI parts from C{request}. All strings must be UTF8-decodable. @param request: A Twisted Web request. @raise URLDecodeError: If one of the parts could not be decoded as UTF-8. @return: L{tuple} of the URL scheme, the server name, the server port, the path info and the script name. """ server_name = request.getRequestHostname() if hasattr(request.getHost(), "port"): server_port = request.getHost().port else: server_port = 0 if (bool(request.isSecure()), server_port) not in [ (True, 443), (False, 80), (False, 0), (True, 0), ]: server_name = server_name + b":" + intToBytes(server_port) script_name = b"" if request.prepath: script_name = b"/".join(request.prepath) if not script_name.startswith(b"/"): script_name = b"/" + script_name path_info = b"" if request.postpath: path_info = b"/".join(request.postpath) if not path_info.startswith(b"/"): path_info = b"/" + path_info url_scheme = "https" if request.isSecure() else "http" utf8Failures = [] try: server_name = server_name.decode("utf-8") except UnicodeDecodeError: utf8Failures.append(("SERVER_NAME", Failure())) try: path_text = path_info.decode("utf-8") except UnicodeDecodeError: utf8Failures.append(("PATH_INFO", Failure())) try: script_text = script_name.decode("utf-8") except UnicodeDecodeError: utf8Failures.append(("SCRIPT_NAME", Failure())) if utf8Failures: raise _URLDecodeError(utf8Failures) return url_scheme, server_name, server_port, path_text, script_text
def _get_requested_host(request: IRequest) -> bytes: hostname = request.getHeader(b"host") if hostname: return hostname # no Host header, use the address/port that the request arrived on host: Union[address.IPv4Address, address.IPv6Address] = request.getHost() hostname = host.host.encode("ascii") if request.isSecure() and host.port == 443: # default port for https return hostname if not request.isSecure() and host.port == 80: # default port for http return hostname return b"%s:%i" % ( hostname, host.port, )