Mercurial > public > mercurial-scm > hg-stable
annotate tests/test-url.py @ 13770:4e8f2310f310
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
author | Brodie Rao <brodie@bitheap.org> |
---|---|
date | Fri, 25 Mar 2011 22:58:56 -0700 |
parents | 75d0c38a0bca |
children | 58b86b9149f1 |
rev | line source |
---|---|
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 | 52 import doctest |
53 | |
54 def test_url(): | |
55 """ | |
56 >>> from mercurial.url import url | |
57 | |
58 This tests for edge cases in url.URL's parsing algorithm. Most of | |
59 these aren't useful for documentation purposes, so they aren't | |
60 part of the class's doc tests. | |
61 | |
62 Query strings and fragments: | |
63 | |
64 >>> url('http://host/a?b#c') | |
65 <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'> | |
66 >>> url('http://host/a?') | |
67 <url scheme: 'http', host: 'host', path: 'a'> | |
68 >>> url('http://host/a#b#c') | |
69 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'> | |
70 >>> url('http://host/a#b?c') | |
71 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'> | |
72 >>> url('http://host/?a#b') | |
73 <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'> | |
74 >>> url('http://host/?a#b', parse_query=False) | |
75 <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'> | |
76 >>> url('http://host/?a#b', parse_fragment=False) | |
77 <url scheme: 'http', host: 'host', path: '', query: 'a#b'> | |
78 >>> url('http://host/?a#b', parse_query=False, parse_fragment=False) | |
79 <url scheme: 'http', host: 'host', path: '?a#b'> | |
80 | |
81 IPv6 addresses: | |
82 | |
83 >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one') | |
84 <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB', | |
85 query: 'objectClass?one'> | |
86 >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one') | |
87 <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]', | |
88 port: '80', path: 'c=GB', query: 'objectClass?one'> | |
89 | |
90 Missing scheme, host, etc.: | |
91 | |
92 >>> url('://192.0.2.16:80/') | |
93 <url path: '://192.0.2.16:80/'> | |
94 >>> url('http://mercurial.selenic.com') | |
95 <url scheme: 'http', host: 'mercurial.selenic.com'> | |
96 >>> url('/foo') | |
97 <url path: '/foo'> | |
98 >>> url('bundle:/foo') | |
99 <url scheme: 'bundle', path: '/foo'> | |
100 >>> url('a?b#c') | |
101 <url path: 'a?b', fragment: 'c'> | |
102 >>> url('http://x.com?arg=/foo') | |
103 <url scheme: 'http', host: 'x.com', query: 'arg=/foo'> | |
104 >>> url('http://joe:xxx@/foo') | |
105 <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'> | |
106 | |
107 Just a scheme and a path: | |
108 | |
109 >>> url('mailto:John.Doe@example.com') | |
110 <url scheme: 'mailto', path: 'John.Doe@example.com'> | |
111 >>> url('a:b:c:d') | |
112 <url scheme: 'a', path: 'b:c:d'> | |
113 | |
114 SSH examples: | |
115 | |
116 >>> url('ssh://joe@host//home/joe') | |
117 <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'> | |
118 >>> url('ssh://joe:xxx@host/src') | |
119 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'> | |
120 >>> url('ssh://joe:xxx@host') | |
121 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'> | |
122 >>> url('ssh://joe@host') | |
123 <url scheme: 'ssh', user: 'joe', host: 'host'> | |
124 >>> url('ssh://host') | |
125 <url scheme: 'ssh', host: 'host'> | |
126 >>> url('ssh://') | |
127 <url scheme: 'ssh'> | |
128 >>> url('ssh:') | |
129 <url scheme: 'ssh'> | |
130 | |
131 Non-numeric port: | |
132 | |
133 >>> url('http://example.com:dd') | |
134 <url scheme: 'http', host: 'example.com', port: 'dd'> | |
135 >>> url('ssh://joe:xxx@host:ssh/foo') | |
136 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh', | |
137 path: 'foo'> | |
138 | |
139 Bad authentication credentials: | |
140 | |
141 >>> url('http://joe@joeville:123@4:@host/a?b#c') | |
142 <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:', | |
143 host: 'host', path: 'a', query: 'b', fragment: 'c'> | |
144 >>> url('http://!*#?/@!*#?/:@host/a?b#c') | |
145 <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'> | |
146 >>> url('http://!*#?@!*#?:@host/a?b#c') | |
147 <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'> | |
148 >>> url('http://!*@:!*@@host/a?b#c') | |
149 <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host', | |
150 path: 'a', query: 'b', fragment: 'c'> | |
151 | |
152 File paths: | |
153 | |
154 >>> url('a/b/c/d.g.f') | |
155 <url path: 'a/b/c/d.g.f'> | |
156 >>> url('/x///z/y/') | |
157 <url path: '/x///z/y/'> | |
158 | |
159 Empty URL: | |
160 | |
161 >>> u = url('') | |
162 >>> u | |
163 <url path: ''> | |
164 >>> str(u) | |
165 '' | |
166 | |
167 Empty path with query string: | |
168 | |
169 >>> str(url('http://foo/?bar')) | |
170 'http://foo/?bar' | |
171 | |
172 Invalid path: | |
173 | |
174 >>> u = url('http://foo/bar') | |
175 >>> u.path = 'bar' | |
176 >>> str(u) | |
177 'http://foo/bar' | |
178 | |
179 >>> u = url('file:///foo/bar/baz') | |
180 >>> u | |
181 <url scheme: 'file', path: '/foo/bar/baz'> | |
182 >>> str(u) | |
183 'file:/foo/bar/baz' | |
184 """ | |
185 | |
186 doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE) | |
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') |