2004-08-16 19:20:06 +00:00
|
|
|
|
# -*- coding: iso-8859-1 -*-
|
2014-02-28 23:12:34 +00:00
|
|
|
|
# Copyright (C) 2004-2014 Bastian Kleineidam
|
2004-08-16 19:20:06 +00:00
|
|
|
|
#
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
|
# (at your option) any later version.
|
|
|
|
|
|
#
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
|
|
#
|
2009-07-24 21:58:20 +00:00
|
|
|
|
# You should have received a copy of the GNU General Public License along
|
|
|
|
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2005-01-19 15:08:02 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Test url routines.
|
|
|
|
|
|
"""
|
2020-08-18 18:57:46 +00:00
|
|
|
|
from . import need_posix, need_windows
|
2004-08-16 19:20:06 +00:00
|
|
|
|
import unittest
|
2004-11-13 11:20:16 +00:00
|
|
|
|
import os
|
2020-08-18 18:57:46 +00:00
|
|
|
|
|
2004-08-16 19:20:06 +00:00
|
|
|
|
import linkcheck.url
|
|
|
|
|
|
|
|
|
|
|
|
# 'ftp://user:pass@ftp.foo.net/foo/bar':
|
|
|
|
|
|
# 'ftp://user:pass@ftp.foo.net/foo/bar',
|
|
|
|
|
|
# 'http://USER:pass@www.Example.COM/foo/bar':
|
|
|
|
|
|
# 'http://USER:pass@www.example.com/foo/bar',
|
|
|
|
|
|
# '-': '-',
|
|
|
|
|
|
|
|
|
|
|
|
# All portions of the URI must be utf-8 encoded NFC form Unicode strings
|
2020-05-28 19:29:13 +00:00
|
|
|
|
# valid: http://example.com/?q=%C3%87 (C-cedilla U+00C7)
|
|
|
|
|
|
# valid: http://example.com/?q=%E2%85%A0 (Roman numeral one U+2160)
|
|
|
|
|
|
# invalid: http://example.com/?q=%C7 (C-cedilla ISO-8859-1)
|
|
|
|
|
|
# invalid: http://example.com/?q=C%CC%A7
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# (Latin capital letter C + Combining cedilla U+0327)
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def url_norm(url, encoding="utf-8"):
|
2009-11-28 10:56:35 +00:00
|
|
|
|
return linkcheck.url.url_norm(url, encoding=encoding)[0]
|
2004-11-13 11:20:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
class TestUrl(unittest.TestCase):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
"""Test url norming and quoting."""
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def urlnormtest(self, url, nurl, encoding=None):
|
2020-05-28 19:29:13 +00:00
|
|
|
|
self.assertFalse(
|
|
|
|
|
|
linkcheck.url.url_needs_quoting(nurl),
|
|
|
|
|
|
"Result URL %r must not need quoting" % nurl,
|
|
|
|
|
|
)
|
2009-11-28 10:56:35 +00:00
|
|
|
|
nurl1 = url_norm(url, encoding=encoding)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
self.assertFalse(
|
|
|
|
|
|
linkcheck.url.url_needs_quoting(nurl1), "Normed URL %r needs quoting" % nurl
|
|
|
|
|
|
)
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(nurl1, nurl)
|
2006-01-04 01:20:20 +00:00
|
|
|
|
|
2017-02-02 11:17:27 +00:00
|
|
|
|
def test_wayback(self):
|
|
|
|
|
|
self.assertFalse("http%3A/x" in url_norm("https://a.b.c/*/http://x.y.z"))
|
|
|
|
|
|
self.assertTrue("http://x" in url_norm("https://a.b.c/*/http://x.y.z"))
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_pathattack(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Windows winamp path attack prevention.
|
2020-05-29 18:40:46 +00:00
|
|
|
|
url = "http://server/..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5ccskin.zip"
|
2004-08-16 19:20:06 +00:00
|
|
|
|
nurl = "http://server/cskin.zip"
|
2020-05-28 19:29:13 +00:00
|
|
|
|
self.assertEqual(
|
|
|
|
|
|
linkcheck.url.url_quote(url_norm(url), encoding="iso-8859-1"), nurl
|
|
|
|
|
|
)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_url_quote(self):
|
2019-10-05 18:38:57 +00:00
|
|
|
|
def url_quote(url):
|
|
|
|
|
|
return linkcheck.url.url_quote(url, encoding="utf-8")
|
2020-05-28 19:29:13 +00:00
|
|
|
|
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "http://a:80/bcd"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "http://a:80/bcd?"
|
|
|
|
|
|
url2 = "http://a:80/bcd"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url2)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "http://a:80/bcd?a=b"
|
|
|
|
|
|
url2 = "http://a:80/bcd?a=b"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url2)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "a/b"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "bcd?"
|
|
|
|
|
|
url2 = "bcd"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url2)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "bcd?a=b"
|
|
|
|
|
|
url2 = "bcd?a=b"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertEqual(url_quote(url), url2)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_quote(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm quoting.
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = (
|
|
|
|
|
|
"http://groups.google.com/groups?hl=en&lr&ie=UTF-8&"
|
|
|
|
|
|
"threadm=3845B54D.E546F9BD%40monmouth.com&rnum=2&"
|
|
|
|
|
|
"prev=/groups%3Fq%3Dlogitech%2Bwingman%2Bextreme%2Bdigital"
|
|
|
|
|
|
"%2B3d%26hl%3Den%26lr%3D%26ie%3DUTF-8%26selm%3D3845B54D.E5"
|
|
|
|
|
|
"46F9BD%2540monmouth.com%26rnum%3D2"
|
|
|
|
|
|
)
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, url)
|
2020-05-29 18:40:46 +00:00
|
|
|
|
url = "http://redirect.alexa.com/redirect?http://www.offeroptimizer.com"
|
2010-03-11 19:19:31 +00:00
|
|
|
|
self.urlnormtest(url, url)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://www.lesgensducinema.com/photo/Philippe%20Nahon.jpg"
|
2010-03-11 19:19:31 +00:00
|
|
|
|
self.urlnormtest(url, url)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Only perform percent-encoding where it is essential.
|
|
|
|
|
|
url = "http://example.com/%7Ejane"
|
|
|
|
|
|
nurl = "http://example.com/~jane"
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com/%7ejane"
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Always use uppercase A-through-F characters when percent-encoding.
|
|
|
|
|
|
url = "http://example.com/?q=1%2a2"
|
|
|
|
|
|
nurl = "http://example.com/?q=1%2A2"
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-27 17:57:34 +00:00
|
|
|
|
# the no-quote chars
|
|
|
|
|
|
url = "http://example.com/a*+-();b"
|
2010-03-11 19:19:31 +00:00
|
|
|
|
self.urlnormtest(url, url)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = (
|
|
|
|
|
|
"http://linkchecker.git.sourceforge.net/git/gitweb.cgi"
|
|
|
|
|
|
"?p=linkchecker/linkchecker;a=blob;f=doc/changelog.txt;hb=HEAD"
|
|
|
|
|
|
)
|
2010-03-11 19:19:31 +00:00
|
|
|
|
self.urlnormtest(url, url)
|
|
|
|
|
|
url = "http://www.company.com/path/doc.html?url=/path2/doc2.html?foo=bar"
|
|
|
|
|
|
self.urlnormtest(url, url)
|
2005-10-13 12:55:53 +00:00
|
|
|
|
url = "http://example.com/#a b"
|
|
|
|
|
|
nurl = "http://example.com/#a%20b"
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-10-13 12:55:53 +00:00
|
|
|
|
url = "http://example.com/?u=http://example2.com?b=c "
|
2010-03-13 07:47:12 +00:00
|
|
|
|
nurl = "http://example.com/?u=http://example2.com?b=c%20"
|
2006-01-04 01:20:20 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2006-02-03 17:06:25 +00:00
|
|
|
|
url = "http://example.com/?u=http://example2.com?b="
|
2010-03-13 07:47:12 +00:00
|
|
|
|
nurl = "http://example.com/?u=http://example2.com?b="
|
2006-02-03 17:06:25 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2006-01-04 01:20:20 +00:00
|
|
|
|
url = "http://localhost:8001/?quoted=<3D>"
|
2019-10-05 18:38:57 +00:00
|
|
|
|
nurl = "http://localhost:8001/?quoted=%C3%BC"
|
|
|
|
|
|
self.urlnormtest(url, nurl)
|
2006-04-03 19:14:49 +00:00
|
|
|
|
url = "http://host/?a=b/c+d="
|
2010-03-11 19:19:31 +00:00
|
|
|
|
nurl = "http://host/?a=b/c%20d%3D"
|
2006-04-03 19:14:49 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_case_sensitivity(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm case sensitivity.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Always provide the URI scheme in lowercase characters.
|
|
|
|
|
|
url = "HTTP://example.com/"
|
|
|
|
|
|
nurl = "http://example.com/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Always provide the host, if any, in lowercase characters.
|
|
|
|
|
|
url = "http://EXAMPLE.COM/"
|
|
|
|
|
|
nurl = "http://example.com/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-23 20:18:30 +00:00
|
|
|
|
url = "http://EXAMPLE.COM:55/"
|
|
|
|
|
|
nurl = "http://example.com:55/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_defaultport(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm default port recognition.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# For schemes that define a port, use an empty port if the default
|
|
|
|
|
|
# is desired
|
|
|
|
|
|
url = "http://example.com:80/"
|
|
|
|
|
|
nurl = "http://example.com/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com:8080/"
|
|
|
|
|
|
nurl = "http://example.com:8080/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_host_dot(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm host dot removal.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com./"
|
|
|
|
|
|
nurl = "http://example.com/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com.:81/"
|
|
|
|
|
|
nurl = "http://example.com:81/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_fragment_empty(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm fragment preserving.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Empty fragment identifiers must be preserved:
|
|
|
|
|
|
url = "http://www.w3.org/2000/01/rdf-schema#"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2015-07-13 08:24:44 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_fragment(self):
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "http://example.org/foo/ #a=1,2,3"
|
2015-07-13 08:24:44 +00:00
|
|
|
|
nurl = "http://example.org/foo/%20#a=1,2,3"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_empty_path(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm empty path handling.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# For schemes that define an empty path to be equivalent to a
|
|
|
|
|
|
# path of "/", use "/".
|
|
|
|
|
|
url = "http://example.com"
|
2005-03-31 13:50:11 +00:00
|
|
|
|
nurl = "http://example.com"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-11-14 11:12:34 +00:00
|
|
|
|
url = "http://example.com?a=b"
|
|
|
|
|
|
nurl = "http://example.com/?a=b"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-03-31 13:50:11 +00:00
|
|
|
|
url = "http://example.com#foo"
|
|
|
|
|
|
nurl = "http://example.com/#foo"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_path_backslashes(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm backslash path handling.
|
2004-11-13 11:20:16 +00:00
|
|
|
|
# note: this is not RFC conform (see url.py for more info)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = r"http://example.com\test.html"
|
|
|
|
|
|
nurl = "http://example.com/test.html"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = r"http://example.com/a\test.html"
|
|
|
|
|
|
nurl = "http://example.com/a/test.html"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = r"http://example.com\a\test.html"
|
|
|
|
|
|
nurl = "http://example.com/a/test.html"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = r"http://example.com\a/test.html"
|
|
|
|
|
|
nurl = "http://example.com/a/test.html"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_path_slashes(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm slashes in path handling.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# reduce duplicate slashes
|
|
|
|
|
|
url = "http://example.com//a/test.html"
|
|
|
|
|
|
nurl = "http://example.com/a/test.html"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com//a/b/"
|
|
|
|
|
|
nurl = "http://example.com/a/b/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_path_dots(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm dots in path handling.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# Prevent dot-segments appearing in non-relative URI paths.
|
|
|
|
|
|
url = "http://example.com/a/./b"
|
|
|
|
|
|
nurl = "http://example.com/a/b"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
url = "http://example.com/a/../a/b"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-06-12 21:19:12 +00:00
|
|
|
|
url = "http://example.com/../a/b"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_path_relative_dots(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm relative path handling with dots.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# normalize redundant path segments
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/."
|
|
|
|
|
|
nurl = "/foo/bar/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/./"
|
|
|
|
|
|
nurl = "/foo/bar/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/.."
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../"
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../baz"
|
|
|
|
|
|
nurl = "/foo/baz"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../.."
|
|
|
|
|
|
nurl = "/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../../"
|
|
|
|
|
|
nurl = "/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../../baz"
|
|
|
|
|
|
nurl = "/baz"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../../../baz"
|
|
|
|
|
|
nurl = "/baz"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/bar/../../../../baz"
|
|
|
|
|
|
nurl = "/baz"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/./foo"
|
|
|
|
|
|
nurl = "/foo"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/../foo"
|
|
|
|
|
|
nurl = "/foo"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo."
|
2004-09-10 07:05:58 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/.foo"
|
2004-09-10 07:05:58 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo.."
|
2004-09-10 07:05:58 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/..foo"
|
2004-09-10 07:05:58 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/./../foo"
|
|
|
|
|
|
nurl = "/foo"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/./foo/."
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/./bar"
|
|
|
|
|
|
nurl = "/foo/bar"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo/../bar"
|
|
|
|
|
|
nurl = "/bar"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "../../../images/miniXmlButton.gif"
|
2004-09-10 07:05:58 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/a..b/../images/miniXmlButton.gif"
|
|
|
|
|
|
nurl = "/images/miniXmlButton.gif"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/.a.b/../foo/"
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/..a.b/../foo/"
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "b/../../foo/"
|
|
|
|
|
|
nurl = "../foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "./foo"
|
|
|
|
|
|
nurl = "foo"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-09-10 07:05:58 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_path_relative_slashes(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url norm relative path handling with slashes.
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo//"
|
|
|
|
|
|
nurl = "/foo/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "/foo///bar//"
|
|
|
|
|
|
nurl = "/foo/bar/"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_mail_url(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test mailto URLs.
|
2004-08-16 19:20:06 +00:00
|
|
|
|
# no netloc and no path
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "mailto:"
|
2004-08-28 10:46:03 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-28 10:46:03 +00:00
|
|
|
|
# standard email
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "mailto:user@www.example.org"
|
2004-08-28 10:46:03 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# emails with subject
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "mailto:user@www.example.org?subject=a_b"
|
2004-12-06 20:12:31 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = (
|
|
|
|
|
|
"mailto:business.inquiries@designingpatterns.com?subject=Business%20Inquiry"
|
|
|
|
|
|
)
|
2009-07-22 20:52:40 +00:00
|
|
|
|
nurl = url
|
|
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-12-06 20:12:31 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_other(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test norming of other schemes.
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "news:"
|
|
|
|
|
|
nurl = "news:"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "snews:"
|
|
|
|
|
|
nurl = "snews://"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "nntp:"
|
|
|
|
|
|
nurl = "nntp://"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2009-11-28 10:56:35 +00:00
|
|
|
|
url = "news:!$%&/()="
|
2020-05-28 19:29:13 +00:00
|
|
|
|
nurl = "news:!%24%25%26/()="
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-07-11 21:58:58 +00:00
|
|
|
|
url = "news:comp.infosystems.www.servers.unix"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-27 12:03:49 +00:00
|
|
|
|
# javascript url
|
|
|
|
|
|
url = "javascript:loadthis()"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2022-08-23 18:25:32 +00:00
|
|
|
|
# ldap url
|
|
|
|
|
|
url = "ldap://[2001:db8::7]/c=GB?objectClass?one"
|
|
|
|
|
|
nurl = "ldap://%5B2001:db8::7%5D/c=GB?objectClass?one"
|
|
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-07-11 21:58:58 +00:00
|
|
|
|
url = "tel:+1-816-555-1212"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-07-11 21:58:58 +00:00
|
|
|
|
url = "urn:oasis:names:specification:docbook:dtd:xml:4.1.2"
|
|
|
|
|
|
nurl = "urn:oasis%3Anames%3Aspecification%3Adocbook%3Adtd%3Axml%3A4.1.2"
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_with_auth(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test norming of URLs with authentication tokens.
|
2012-06-10 20:07:42 +00:00
|
|
|
|
url = "telnet://User@www.example.org"
|
2004-08-16 19:20:06 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2012-06-10 20:07:42 +00:00
|
|
|
|
url = "telnet://User:Pass@www.example.org"
|
2004-08-16 19:20:06 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2012-06-10 20:07:42 +00:00
|
|
|
|
url = "http://User:Pass@www.example.org/"
|
2004-08-16 19:20:06 +00:00
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2012-06-24 19:48:16 +00:00
|
|
|
|
@need_posix
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_file1(self):
|
2006-05-29 14:22:37 +00:00
|
|
|
|
url = "file:///a/b.txt"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2006-05-29 14:22:37 +00:00
|
|
|
|
|
2012-06-24 19:48:16 +00:00
|
|
|
|
@need_windows
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_file2(self):
|
2012-06-24 19:48:16 +00:00
|
|
|
|
url = "file:///C|/a/b.txt"
|
|
|
|
|
|
nurl = url
|
2006-07-18 07:39:55 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2006-05-29 14:22:37 +00:00
|
|
|
|
|
2012-06-24 19:48:16 +00:00
|
|
|
|
@need_posix
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_file_unicode(self):
|
2020-04-30 19:11:59 +00:00
|
|
|
|
url = "file:///a/b.txt"
|
2009-11-28 10:56:35 +00:00
|
|
|
|
nurl = url
|
|
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-04-30 19:11:59 +00:00
|
|
|
|
url = "file:///a/<2F>.txt"
|
|
|
|
|
|
nurl = "file:///a/%C3%A4.txt"
|
2019-10-05 18:38:57 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
# url = "file:///\u041c\u043e\u0448\u043a\u043e\u0432\u0430.bin"
|
|
|
|
|
|
# nurl = "file:///a.bin" # XXX
|
|
|
|
|
|
# self.urlnormtest(url, nurl)
|
2009-11-28 10:56:35 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_norm_invalid(self):
|
2020-04-30 19:11:59 +00:00
|
|
|
|
url = "<EFBFBD><EFBFBD><EFBFBD>?:"
|
|
|
|
|
|
nurl = "%C3%A4%C3%B6%C3%BC?:"
|
2019-10-05 18:38:57 +00:00
|
|
|
|
self.urlnormtest(url, nurl)
|
2005-10-11 14:08:14 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_valid(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url validity functions.
|
2008-03-25 21:23:34 +00:00
|
|
|
|
u = "http://www.example.com"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.is_safe_url(u), u)
|
2008-03-25 21:23:34 +00:00
|
|
|
|
u = "http://www.example.com/"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.is_safe_url(u), u)
|
2008-03-25 21:23:34 +00:00
|
|
|
|
u = "http://www.example.com/~calvin"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.is_safe_url(u), u)
|
2008-03-25 21:23:34 +00:00
|
|
|
|
u = "http://www.example.com/a,b"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.is_safe_url(u), u)
|
2008-03-25 21:23:34 +00:00
|
|
|
|
u = "http://www.example.com#anchor55"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.is_safe_url(u), u)
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_needs_quoting(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test url quoting necessity.
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "mailto:<calvin@example.org>?subject=Halli Hallo"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = " http://www.example.com/"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "http://www.example.com/ "
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "http://www.example.com/\n"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "\nhttp://www.example.com/"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "http://www.example.com/#a!"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(not linkcheck.url.url_needs_quoting(url), repr(url))
|
2008-03-25 21:23:34 +00:00
|
|
|
|
url = "http://www.example.com/#a b"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_needs_quoting(url), repr(url))
|
2004-08-16 19:20:06 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_absolute_url(self):
|
2004-08-27 18:18:21 +00:00
|
|
|
|
url = "hutzli:"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_is_absolute(url), repr(url))
|
2004-08-27 18:18:21 +00:00
|
|
|
|
url = "file:/"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(linkcheck.url.url_is_absolute(url), repr(url))
|
2004-08-27 18:18:21 +00:00
|
|
|
|
url = ":"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(not linkcheck.url.url_is_absolute(url), repr(url))
|
2004-08-27 18:18:21 +00:00
|
|
|
|
url = "/a/b?http://"
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(not linkcheck.url.url_is_absolute(url), repr(url))
|
2004-08-27 18:18:21 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_nopathquote_chars(self):
|
2020-05-28 19:29:13 +00:00
|
|
|
|
if os.name == "nt":
|
2005-05-18 17:56:52 +00:00
|
|
|
|
url = "file:///c|/msys/"
|
|
|
|
|
|
nurl = url
|
|
|
|
|
|
self.assertEqual(url_norm(url), nurl)
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(not linkcheck.url.url_needs_quoting(url))
|
2005-08-16 13:42:46 +00:00
|
|
|
|
url = "http://hulla/a/b/!?c=d"
|
|
|
|
|
|
nurl = url
|
|
|
|
|
|
self.assertEqual(url_norm(url), nurl)
|
2004-11-09 17:24:03 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_idn_encoding(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test idna encoding.
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = "www.<2E>ko.de"
|
2010-03-13 07:47:12 +00:00
|
|
|
|
idna_encode = linkcheck.url.idna_encode
|
2006-05-19 17:13:28 +00:00
|
|
|
|
encurl, is_idn = idna_encode(url)
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(is_idn)
|
2008-04-25 07:49:52 +00:00
|
|
|
|
self.assertTrue(encurl)
|
2020-05-28 19:29:13 +00:00
|
|
|
|
url = ""
|
2006-05-19 17:13:28 +00:00
|
|
|
|
encurl, is_idn = idna_encode(url)
|
2007-11-28 18:39:12 +00:00
|
|
|
|
self.assertFalse(is_idn)
|
|
|
|
|
|
self.assertFalse(encurl)
|
2020-04-30 19:11:59 +00:00
|
|
|
|
url = "<EFBFBD>.."
|
2006-05-19 17:13:28 +00:00
|
|
|
|
self.assertRaises(UnicodeError, idna_encode, url)
|
2004-11-13 11:20:16 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_splitparam(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Path parameter split test.
|
2005-01-10 20:35:01 +00:00
|
|
|
|
p = [
|
|
|
|
|
|
("", ("", "")),
|
|
|
|
|
|
("/", ("/", "")),
|
|
|
|
|
|
("a", ("a", "")),
|
|
|
|
|
|
("a;", ("a", "")),
|
|
|
|
|
|
("a/b;c/d;e", ("a/b;c/d", "e")),
|
|
|
|
|
|
]
|
|
|
|
|
|
for x in p:
|
|
|
|
|
|
self._splitparam(x)
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def _splitparam(self, x):
|
2005-01-10 20:35:01 +00:00
|
|
|
|
self.assertEqual(linkcheck.url.splitparams(x[0]), (x[1][0], x[1][1]))
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_cgi_split(self):
|
2009-07-22 20:52:40 +00:00
|
|
|
|
# Test cgi parameter splitting.
|
2005-03-28 23:51:29 +00:00
|
|
|
|
u = "scid=kb;en-us;Q248840"
|
2019-10-05 18:38:57 +00:00
|
|
|
|
self.assertEqual(linkcheck.url.url_parse_query(u, encoding="utf-8"), u)
|
2005-04-26 17:28:12 +00:00
|
|
|
|
u = "scid=kb;en-us;Q248840&b=c;hulla=bulla"
|
2019-10-05 18:38:57 +00:00
|
|
|
|
self.assertEqual(linkcheck.url.url_parse_query(u, encoding="utf-8"), u)
|
2010-10-27 18:51:56 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_long_cgi(self):
|
2020-05-28 19:29:13 +00:00
|
|
|
|
u = "/test%s;" % ("?a=" * 1000)
|
2019-10-05 18:38:57 +00:00
|
|
|
|
self.assertEqual(linkcheck.url.url_parse_query(u, encoding="utf-8"), u)
|
2005-03-28 23:51:29 +00:00
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_port(self):
|
2006-02-02 23:31:39 +00:00
|
|
|
|
is_numeric_port = linkcheck.url.is_numeric_port
|
2010-03-05 09:00:34 +00:00
|
|
|
|
self.assertTrue(is_numeric_port("80"))
|
|
|
|
|
|
self.assertTrue(is_numeric_port("1"))
|
2006-02-02 23:31:39 +00:00
|
|
|
|
self.assertFalse(is_numeric_port("0"))
|
|
|
|
|
|
self.assertFalse(is_numeric_port("66000"))
|
|
|
|
|
|
self.assertFalse(is_numeric_port("-1"))
|
|
|
|
|
|
self.assertFalse(is_numeric_port("a"))
|
|
|
|
|
|
|
2020-05-16 19:19:42 +00:00
|
|
|
|
def test_safe_domain(self):
|
2009-02-18 15:33:52 +00:00
|
|
|
|
is_safe_domain = linkcheck.url.is_safe_domain
|
2020-04-30 19:11:59 +00:00
|
|
|
|
self.assertFalse(is_safe_domain("a..example.com"))
|
|
|
|
|
|
self.assertFalse(is_safe_domain("a_b.example.com"))
|
|
|
|
|
|
self.assertTrue(is_safe_domain("a-b.example.com"))
|
|
|
|
|
|
self.assertTrue(is_safe_domain("x1.example.com"))
|
2011-04-10 08:57:07 +00:00
|
|
|
|
|
2012-10-13 10:03:09 +00:00
|
|
|
|
def test_splitport(self):
|
|
|
|
|
|
splitport = linkcheck.url.splitport
|
|
|
|
|
|
netloc = "hostname"
|
|
|
|
|
|
host, port = splitport(netloc, 99)
|
|
|
|
|
|
self.assertEqual(host, netloc)
|
|
|
|
|
|
self.assertEqual(port, 99)
|
|
|
|
|
|
netloc = "hostname:"
|
|
|
|
|
|
host, port = splitport(netloc, 99)
|
|
|
|
|
|
self.assertEqual(host, "hostname")
|
|
|
|
|
|
self.assertEqual(port, 99)
|
|
|
|
|
|
netloc = "hostname:42"
|
|
|
|
|
|
host, port = splitport(netloc, 99)
|
|
|
|
|
|
self.assertEqual(host, "hostname")
|
|
|
|
|
|
self.assertEqual(port, 42)
|
|
|
|
|
|
netloc = "hostname:foo"
|
|
|
|
|
|
host, port = splitport(netloc, 99)
|
|
|
|
|
|
self.assertEqual(host, netloc)
|
|
|
|
|
|
self.assertEqual(port, 99)
|