tests/test-url.py
author Brodie Rao <brodie@bitheap.org>
Fri, 25 Mar 2011 22:58:56 -0700
changeset 13770 4e8f2310f310
parent 13249 75d0c38a0bca
child 13808 58b86b9149f1
permissions -rw-r--r--
url: provide url object This adds a url object that re-implements urlsplit() and unsplit(). The implementation splits out usernames, passwords, and ports. The implementation is based on the behavior specified by RFC 2396[1]. However, it is much more forgiving than the RFC's specification; it places no specific restrictions on what characters are allowed in each segment of the URL other than what is necessary to split the URL into its constituent parts. [1]: http://www.ietf.org/rfc/rfc2396.txt
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12737
7adb1274a4f9 test-url: skip test when ssl module is unavailable
Augie Fackler <durin42@gmail.com>
parents: 12592
diff changeset
     1
import sys
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     2
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     3
def check(a, b):
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     4
    if a != b:
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     5
        print (a, b)
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     6
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
     7
def cert(cn):
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
     8
    return dict(subject=((('commonName', cn),),))
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
     9
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    10
from mercurial.url import _verifycert
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    11
12724
66e7ba85585b test-url: remove trailing whitespace
Augie Fackler <durin42@gmail.com>
parents: 12606
diff changeset
    12
# Test non-wildcard certificates
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    13
check(_verifycert(cert('example.com'), 'example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    14
      None)
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    15
check(_verifycert(cert('example.com'), 'www.example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    16
      'certificate is for example.com')
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    17
check(_verifycert(cert('www.example.com'), 'example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    18
      'certificate is for www.example.com')
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    19
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    20
# Test wildcard certificates
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    21
check(_verifycert(cert('*.example.com'), 'www.example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    22
      None)
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    23
check(_verifycert(cert('*.example.com'), 'example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    24
      'certificate is for *.example.com')
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    25
check(_verifycert(cert('*.example.com'), 'w.w.example.com'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    26
      'certificate is for *.example.com')
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    27
13249
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    28
# Test subjectAltName
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    29
san_cert = {'subject': ((('commonName', 'example.com'),),),
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    30
            'subjectAltName': (('DNS', '*.example.net'),
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    31
                               ('DNS', 'example.net'))}
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    32
check(_verifycert(san_cert, 'example.net'),
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    33
      None)
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    34
check(_verifycert(san_cert, 'foo.example.net'),
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    35
      None)
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    36
# subject is only checked when subjectAltName is empty
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    37
check(_verifycert(san_cert, 'example.com'),
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    38
      'certificate is for *.example.net, example.net')
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    39
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    40
# Avoid some pitfalls
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    41
check(_verifycert(cert('*.foo'), 'foo'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    42
      'certificate is for *.foo')
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    43
check(_verifycert(cert('*o'), 'foo'),
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    44
      'certificate is for *o')
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    45
12742
6ab4a7d3c179 url: validity (notBefore/notAfter) is checked by OpenSSL (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents: 12738
diff changeset
    46
check(_verifycert({'subject': ()},
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    47
                  'example.com'),
13249
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    48
      'no commonName or subjectAltName found in certificate')
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    49
check(_verifycert(None, 'example.com'),
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    50
      'no certificate received')
13248
00411a4fa1bb url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents: 12865
diff changeset
    51
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    52
import doctest
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    53
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    54
def test_url():
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    55
    """
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    56
    >>> from mercurial.url import url
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    57
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    58
    This tests for edge cases in url.URL's parsing algorithm. Most of
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    59
    these aren't useful for documentation purposes, so they aren't
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    60
    part of the class's doc tests.
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    61
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    62
    Query strings and fragments:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    63
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    64
    >>> url('http://host/a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    65
    <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    66
    >>> url('http://host/a?')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    67
    <url scheme: 'http', host: 'host', path: 'a'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    68
    >>> url('http://host/a#b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    69
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    70
    >>> url('http://host/a#b?c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    71
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    72
    >>> url('http://host/?a#b')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    73
    <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    74
    >>> url('http://host/?a#b', parse_query=False)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    75
    <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    76
    >>> url('http://host/?a#b', parse_fragment=False)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    77
    <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    78
    >>> url('http://host/?a#b', parse_query=False, parse_fragment=False)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    79
    <url scheme: 'http', host: 'host', path: '?a#b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    80
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    81
    IPv6 addresses:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    82
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    83
    >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    84
    <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    85
         query: 'objectClass?one'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    86
    >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    87
    <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    88
         port: '80', path: 'c=GB', query: 'objectClass?one'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    89
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    90
    Missing scheme, host, etc.:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    91
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    92
    >>> url('://192.0.2.16:80/')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    93
    <url path: '://192.0.2.16:80/'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    94
    >>> url('http://mercurial.selenic.com')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    95
    <url scheme: 'http', host: 'mercurial.selenic.com'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    96
    >>> url('/foo')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    97
    <url path: '/foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    98
    >>> url('bundle:/foo')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
    99
    <url scheme: 'bundle', path: '/foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   100
    >>> url('a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   101
    <url path: 'a?b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   102
    >>> url('http://x.com?arg=/foo')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   103
    <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   104
    >>> url('http://joe:xxx@/foo')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   105
    <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   106
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   107
    Just a scheme and a path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   108
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   109
    >>> url('mailto:John.Doe@example.com')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   110
    <url scheme: 'mailto', path: 'John.Doe@example.com'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   111
    >>> url('a:b:c:d')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   112
    <url scheme: 'a', path: 'b:c:d'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   113
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   114
    SSH examples:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   115
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   116
    >>> url('ssh://joe@host//home/joe')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   117
    <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   118
    >>> url('ssh://joe:xxx@host/src')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   119
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   120
    >>> url('ssh://joe:xxx@host')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   121
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   122
    >>> url('ssh://joe@host')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   123
    <url scheme: 'ssh', user: 'joe', host: 'host'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   124
    >>> url('ssh://host')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   125
    <url scheme: 'ssh', host: 'host'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   126
    >>> url('ssh://')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   127
    <url scheme: 'ssh'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   128
    >>> url('ssh:')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   129
    <url scheme: 'ssh'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   130
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   131
    Non-numeric port:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   132
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   133
    >>> url('http://example.com:dd')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   134
    <url scheme: 'http', host: 'example.com', port: 'dd'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   135
    >>> url('ssh://joe:xxx@host:ssh/foo')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   136
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   137
         path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   138
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   139
    Bad authentication credentials:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   140
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   141
    >>> url('http://joe@joeville:123@4:@host/a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   142
    <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   143
         host: 'host', path: 'a', query: 'b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   144
    >>> url('http://!*#?/@!*#?/:@host/a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   145
    <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   146
    >>> url('http://!*#?@!*#?:@host/a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   147
    <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   148
    >>> url('http://!*@:!*@@host/a?b#c')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   149
    <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   150
         path: 'a', query: 'b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   151
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   152
    File paths:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   153
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   154
    >>> url('a/b/c/d.g.f')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   155
    <url path: 'a/b/c/d.g.f'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   156
    >>> url('/x///z/y/')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   157
    <url path: '/x///z/y/'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   158
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   159
    Empty URL:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   160
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   161
    >>> u = url('')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   162
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   163
    <url path: ''>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   164
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   165
    ''
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   166
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   167
    Empty path with query string:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   168
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   169
    >>> str(url('http://foo/?bar'))
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   170
    'http://foo/?bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   171
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   172
    Invalid path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   173
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   174
    >>> u = url('http://foo/bar')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   175
    >>> u.path = 'bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   176
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   177
    'http://foo/bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   178
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   179
    >>> u = url('file:///foo/bar/baz')
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   180
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   181
    <url scheme: 'file', path: '/foo/bar/baz'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   182
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   183
    'file:/foo/bar/baz'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   184
    """
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   185
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   186
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   187
13248
00411a4fa1bb url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents: 12865
diff changeset
   188
# Unicode (IDN) certname isn't supported
00411a4fa1bb url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents: 12865
diff changeset
   189
check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
00411a4fa1bb url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents: 12865
diff changeset
   190
      'IDN in certificate not supported')