Index: Lib/test/test_urlparse.py =================================================================== --- Lib/test/test_urlparse.py (revision 78159) +++ Lib/test/test_urlparse.py (working copy) @@ -353,6 +353,11 @@ self.assertEqual(urlparse.urlparse("http://example.com?blahblah=/foo"), ('http', 'example.com', '', '', 'blahblah=/foo', '')) + def test_anyscheme(self): + # Issue 7904: s3://foo.com/stuff has netloc "foo.com". + self.assertEqual(urlparse.urlparse("s3://foo.com/stuff"), + ('s3', 'foo.com', '/stuff', '', '', '')) + def test_main(): test_support.run_unittest(UrlParseTestCase) Index: Lib/urlparse.py =================================================================== --- Lib/urlparse.py (revision 78159) +++ Lib/urlparse.py (working copy) @@ -2,6 +2,7 @@ See RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June 1995. +RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", January 2005. """ __all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", @@ -163,7 +164,7 @@ break else: scheme, url = url[:i].lower(), url[i+1:] - if scheme in uses_netloc and url[:2] == '//': + if url[:2] == '//': netloc, url = _splitnetloc(url, 2) if allow_fragments and scheme in uses_fragment and '#' in url: url, fragment = url.split('#', 1)