diff --git a/awx/main/tests/unit/utils/test_handlers.py b/awx/main/tests/unit/utils/test_handlers.py index d7b7f5aed9..518a213669 100644 --- a/awx/main/tests/unit/utils/test_handlers.py +++ b/awx/main/tests/unit/utils/test_handlers.py @@ -107,7 +107,17 @@ def test_https_logging_handler_splunk_auth_info(): ('http://localhost', None, 'http://localhost'), ('http://localhost', 80, 'http://localhost'), ('http://localhost', 8080, 'http://localhost:8080'), - ('https://localhost', 443, 'https://localhost:443') + ('https://localhost', 443, 'https://localhost:443'), + ('ftp://localhost', 443, 'ftp://localhost:443'), + ('https://localhost:550', 443, 'https://localhost:550'), + ('https://localhost:yoho/foobar', 443, 'https://localhost:443/foobar'), + ('https://localhost:yoho/foobar', None, 'https://localhost:yoho/foobar'), + ('http://splunk.server:8088/services/collector/event', 80, + 'http://splunk.server:8088/services/collector/event'), + ('http://splunk.server/services/collector/event', 80, + 'http://splunk.server/services/collector/event'), + ('http://splunk.server/services/collector/event', 8088, + 'http://splunk.server:8088/services/collector/event'), ]) def test_https_logging_handler_http_host_format(host, port, normalized): handler = HTTPSHandler(host=host, port=port) diff --git a/awx/main/utils/handlers.py b/awx/main/utils/handlers.py index b1b96b492f..3eb9852472 100644 --- a/awx/main/utils/handlers.py +++ b/awx/main/utils/handlers.py @@ -6,6 +6,7 @@ import logging import json import requests import time +import urlparse from concurrent.futures import ThreadPoolExecutor from copy import copy @@ -118,10 +119,21 @@ class BaseHTTPSHandler(logging.Handler): def get_http_host(self): host = self.host or '' - if not host.startswith('http'): - host = 'http://%s' % self.host - if self.port != 80 and self.port is not None: - host = '%s:%s' % (host, str(self.port)) + # urlparse requires scheme to be provided, default to use http if + # missing + if not urlparse.urlsplit(host).scheme: + host = 'http://%s' % host + parsed = urlparse.urlsplit(host) + # Insert self.port if its special and port number is either not + # given in host or given as non-numerical + try: + port = parsed.port or self.port + except ValueError: + port = self.port + if port not in (80, None): + new_netloc = '%s:%s' % (parsed.hostname, port) + return urlparse.urlunsplit((parsed.scheme, new_netloc, parsed.path, + parsed.query, parsed.fragment)) return host def get_post_kwargs(self, payload_input):