Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/url.py @ 13900:a3403d5b0af3 stable
url: use a regex to hide unsupported ssh passwords (issue2754)
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 06 Apr 2011 15:10:47 -0500 |
parents | 66d65bccbf06 |
children | fab10e7cacd6 |
rev | line source |
---|---|
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
1 # url.py - HTTP handling for mercurial |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
2 # |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
3 # Copyright 2005, 2006, 2007, 2008 Matt Mackall <mpm@selenic.com> |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
4 # Copyright 2006, 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br> |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
6 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8208
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
9 |
12742
6ab4a7d3c179
url: validity (notBefore/notAfter) is checked by OpenSSL (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12607
diff
changeset
|
10 import urllib, urllib2, urlparse, httplib, os, re, socket, cStringIO |
11880
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
11 import __builtin__ |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
12 from i18n import _ |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
13 import keepalive, util |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
14 |
11035
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
15 def _urlunparse(scheme, netloc, path, params, query, fragment, url): |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
16 '''Handle cases where urlunparse(urlparse(x://)) doesn't preserve the "//"''' |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
17 result = urlparse.urlunparse((scheme, netloc, path, params, query, fragment)) |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
18 if (scheme and |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
19 result.startswith(scheme + ':') and |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
20 not result.startswith(scheme + '://') and |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
21 url.startswith(scheme + '://') |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
22 ): |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
23 result = scheme + '://' + result[len(scheme + ':'):] |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
24 return result |
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
25 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
26 def hidepassword(url): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
27 '''hide user credential in a url string''' |
13900
a3403d5b0af3
url: use a regex to hide unsupported ssh passwords (issue2754)
Matt Mackall <mpm@selenic.com>
parents:
13544
diff
changeset
|
28 if url.startswith("ssh://"): |
a3403d5b0af3
url: use a regex to hide unsupported ssh passwords (issue2754)
Matt Mackall <mpm@selenic.com>
parents:
13544
diff
changeset
|
29 # urllib doesn't know about ssh urls |
a3403d5b0af3
url: use a regex to hide unsupported ssh passwords (issue2754)
Matt Mackall <mpm@selenic.com>
parents:
13544
diff
changeset
|
30 return re.sub(r'(ssh://[^/]+):[^/]+(@.*)', r'\1:***\2', url) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
31 scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
32 netloc = re.sub('([^:]*):([^@]*)@(.*)', r'\1:***@\3', netloc) |
11035
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
33 return _urlunparse(scheme, netloc, path, params, query, fragment, url) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
34 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
35 def removeauth(url): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
36 '''remove all authentication information from a url string''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
37 scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
38 netloc = netloc[netloc.find('@')+1:] |
11035
e4f911ce21de
schemes: fix // breakage with Python 2.6.5 (issue2111)
Michael Glassford <glassfordmjg@gmail.com>
parents:
10794
diff
changeset
|
39 return _urlunparse(scheme, netloc, path, params, query, fragment, url) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
40 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
41 def netlocsplit(netloc): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
42 '''split [user[:passwd]@]host[:port] into 4-tuple.''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
43 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
44 a = netloc.find('@') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
45 if a == -1: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
46 user, passwd = None, None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
47 else: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
48 userpass, netloc = netloc[:a], netloc[a + 1:] |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
49 c = userpass.find(':') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
50 if c == -1: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
51 user, passwd = urllib.unquote(userpass), None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
52 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
53 user = urllib.unquote(userpass[:c]) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
54 passwd = urllib.unquote(userpass[c + 1:]) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
55 c = netloc.find(':') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
56 if c == -1: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
57 host, port = netloc, None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
58 else: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
59 host, port = netloc[:c], netloc[c + 1:] |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
60 return host, port, user, passwd |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
61 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
62 def netlocunsplit(host, port, user=None, passwd=None): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
63 '''turn host, port, user, passwd into [user[:passwd]@]host[:port].''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
64 if port: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
65 hostport = host + ':' + port |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
66 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
67 hostport = host |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
68 if user: |
10484
cadd7e076b69
url: correctly quote '/' in user and password embedded in urls
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10482
diff
changeset
|
69 quote = lambda s: urllib.quote(s, safe='') |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
70 if passwd: |
10484
cadd7e076b69
url: correctly quote '/' in user and password embedded in urls
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10482
diff
changeset
|
71 userpass = quote(user) + ':' + quote(passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
72 else: |
10484
cadd7e076b69
url: correctly quote '/' in user and password embedded in urls
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10482
diff
changeset
|
73 userpass = quote(user) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
74 return userpass + '@' + hostport |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
75 return hostport |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
76 |
13371
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
77 def readauthforuri(ui, uri): |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
78 # Read configuration |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
79 config = dict() |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
80 for key, val in ui.configitems('auth'): |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
81 if '.' not in key: |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
82 ui.warn(_("ignoring invalid [auth] key '%s'\n") % key) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
83 continue |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
84 group, setting = key.rsplit('.', 1) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
85 gdict = config.setdefault(group, dict()) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
86 if setting in ('username', 'cert', 'key'): |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
87 val = util.expandpath(val) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
88 gdict[setting] = val |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
89 |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
90 # Find the best match |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
91 scheme, hostpath = uri.split('://', 1) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
92 bestlen = 0 |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
93 bestauth = None |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
94 for group, auth in config.iteritems(): |
13371
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
95 prefix = auth.get('prefix') |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
96 if not prefix: |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
97 continue |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
98 p = prefix.split('://', 1) |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
99 if len(p) > 1: |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
100 schemes, prefix = [p[0]], p[1] |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
101 else: |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
102 schemes = (auth.get('schemes') or 'https').split() |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
103 if (prefix == '*' or hostpath.startswith(prefix)) and \ |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
104 len(prefix) > bestlen and scheme in schemes: |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
105 bestlen = len(prefix) |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
106 bestauth = group, auth |
13371
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
107 return bestauth |
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
108 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
109 _safe = ('abcdefghijklmnopqrstuvwxyz' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
110 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
111 '0123456789' '_.-/') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
112 _safeset = None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
113 _hex = None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
114 def quotepath(path): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
115 '''quote the path part of a URL |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
116 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
117 This is similar to urllib.quote, but it also tries to avoid |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
118 quoting things twice (inspired by wget): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
119 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
120 >>> quotepath('abc def') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
121 'abc%20def' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
122 >>> quotepath('abc%20def') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
123 'abc%20def' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
124 >>> quotepath('abc%20 def') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
125 'abc%20%20def' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
126 >>> quotepath('abc def%20') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
127 'abc%20def%20' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
128 >>> quotepath('abc def%2') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
129 'abc%20def%252' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
130 >>> quotepath('abc def%') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
131 'abc%20def%25' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
132 ''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
133 global _safeset, _hex |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
134 if _safeset is None: |
8150
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
7285
diff
changeset
|
135 _safeset = set(_safe) |
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
7285
diff
changeset
|
136 _hex = set('abcdefABCDEF0123456789') |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
137 l = list(path) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
138 for i in xrange(len(l)): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
139 c = l[i] |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
140 if (c == '%' and i + 2 < len(l) and |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
141 l[i + 1] in _hex and l[i + 2] in _hex): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
142 pass |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
143 elif c not in _safeset: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
144 l[i] = '%%%02X' % ord(c) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
145 return ''.join(l) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
146 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
147 class passwordmgr(urllib2.HTTPPasswordMgrWithDefaultRealm): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
148 def __init__(self, ui): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
149 urllib2.HTTPPasswordMgrWithDefaultRealm.__init__(self) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
150 self.ui = ui |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
151 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
152 def find_user_password(self, realm, authuri): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
153 authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password( |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
154 self, realm, authuri) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
155 user, passwd = authinfo |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
156 if user and passwd: |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
157 self._writedebug(user, passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
158 return (user, passwd) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
159 |
8344
873429914ec5
url: fix bug in passwordmgr related to auth configuration
Sune Foldager <cryo@cyanite.org>
parents:
8333
diff
changeset
|
160 if not user: |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
161 res = readauthforuri(self.ui, authuri) |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
162 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
163 group, auth = res |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
164 user, passwd = auth.get('username'), auth.get('password') |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
165 self.ui.debug("using auth.%s.* for authentication\n" % group) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
166 if not user or not passwd: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
167 if not self.ui.interactive(): |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
168 raise util.Abort(_('http authorization required')) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
169 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
170 self.ui.write(_("http authorization required\n")) |
12862
9d6adddc8eea
url: show realm/user when asking for username/password
timeless <timeless@gmail.com>
parents:
12770
diff
changeset
|
171 self.ui.write(_("realm: %s\n") % realm) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
172 if user: |
12862
9d6adddc8eea
url: show realm/user when asking for username/password
timeless <timeless@gmail.com>
parents:
12770
diff
changeset
|
173 self.ui.write(_("user: %s\n") % user) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
174 else: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
175 user = self.ui.prompt(_("user:"), default=None) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
176 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
177 if not passwd: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
178 passwd = self.ui.getpass() |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
179 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
180 self.add_password(realm, authuri, user, passwd) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
181 self._writedebug(user, passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
182 return (user, passwd) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
183 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
184 def _writedebug(self, user, passwd): |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
185 msg = _('http auth: user %s, password %s\n') |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
186 self.ui.debug(msg % (user, passwd and '*' * len(passwd) or 'not set')) |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
187 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
188 class proxyhandler(urllib2.ProxyHandler): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
189 def __init__(self, ui): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
190 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
191 # XXX proxyauthinfo = None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
192 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
193 if proxyurl: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
194 # proxy can be proper url or host[:port] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
195 if not (proxyurl.startswith('http:') or |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
196 proxyurl.startswith('https:')): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
197 proxyurl = 'http://' + proxyurl + '/' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
198 snpqf = urlparse.urlsplit(proxyurl) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
199 proxyscheme, proxynetloc, proxypath, proxyquery, proxyfrag = snpqf |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
200 hpup = netlocsplit(proxynetloc) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
201 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
202 proxyhost, proxyport, proxyuser, proxypasswd = hpup |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
203 if not proxyuser: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
204 proxyuser = ui.config("http_proxy", "user") |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
205 proxypasswd = ui.config("http_proxy", "passwd") |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
206 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
207 # see if we should use a proxy for this url |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
208 no_list = ["localhost", "127.0.0.1"] |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
209 no_list.extend([p.lower() for |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
210 p in ui.configlist("http_proxy", "no")]) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
211 no_list.extend([p.strip().lower() for |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
212 p in os.getenv("no_proxy", '').split(',') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
213 if p.strip()]) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
214 # "http_proxy.always" config is for running tests on localhost |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
215 if ui.configbool("http_proxy", "always"): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
216 self.no_list = [] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
217 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
218 self.no_list = no_list |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
219 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
220 proxyurl = urlparse.urlunsplit(( |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
221 proxyscheme, netlocunsplit(proxyhost, proxyport, |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
222 proxyuser, proxypasswd or ''), |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
223 proxypath, proxyquery, proxyfrag)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
224 proxies = {'http': proxyurl, 'https': proxyurl} |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9347
diff
changeset
|
225 ui.debug('proxying through http://%s:%s\n' % |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
226 (proxyhost, proxyport)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
227 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
228 proxies = {} |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
229 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
230 # urllib2 takes proxy values from the environment and those |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
231 # will take precedence if found, so drop them |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
232 for env in ["HTTP_PROXY", "http_proxy", "no_proxy"]: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
233 try: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
234 if env in os.environ: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
235 del os.environ[env] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
236 except OSError: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
237 pass |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
238 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
239 urllib2.ProxyHandler.__init__(self, proxies) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
240 self.ui = ui |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
241 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
242 def proxy_open(self, req, proxy, type_): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
243 host = req.get_host().split(':')[0] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
244 if host in self.no_list: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
245 return None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
246 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
247 # work around a bug in Python < 2.4.2 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
248 # (it leaves a "\n" at the end of Proxy-authorization headers) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
249 baseclass = req.__class__ |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
250 class _request(baseclass): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
251 def add_header(self, key, val): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
252 if key.lower() == 'proxy-authorization': |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
253 val = val.strip() |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
254 return baseclass.add_header(self, key, val) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
255 req.__class__ = _request |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
256 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
257 return urllib2.ProxyHandler.proxy_open(self, req, proxy, type_) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
258 |
11880
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
259 class httpsendfile(object): |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
260 """This is a wrapper around the objects returned by python's "open". |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
261 |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
262 Its purpose is to send file-like objects via HTTP and, to do so, it |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
263 defines a __len__ attribute to feed the Content-Length header. |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
264 """ |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
265 |
13115
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
266 def __init__(self, ui, *args, **kwargs): |
11880
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
267 # We can't just "self._data = open(*args, **kwargs)" here because there |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
268 # is an "open" function defined in this module that shadows the global |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
269 # one |
13115
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
270 self.ui = ui |
11880
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
271 self._data = __builtin__.open(*args, **kwargs) |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
272 self.seek = self._data.seek |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
273 self.close = self._data.close |
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
274 self.write = self._data.write |
13115
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
275 self._len = os.fstat(self._data.fileno()).st_size |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
276 self._pos = 0 |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
277 self._total = len(self) / 1024 * 2 |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
278 |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
279 def read(self, *args, **kwargs): |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
280 try: |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
281 ret = self._data.read(*args, **kwargs) |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
282 except EOFError: |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
283 self.ui.progress(_('sending'), None) |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
284 self._pos += len(ret) |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
285 # We pass double the max for total because we currently have |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
286 # to send the bundle twice in the case of a server that |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
287 # requires authentication. Since we can't know until we try |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
288 # once whether authentication will be required, just lie to |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
289 # the user and maybe the push succeeds suddenly at 50%. |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
290 self.ui.progress(_('sending'), self._pos / 1024, |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
291 unit=_('kb'), total=self._total) |
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
292 return ret |
11880
e3526634d5a3
url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha <renatoc@gmail.com>
parents:
11876
diff
changeset
|
293 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
294 def __len__(self): |
13115
bda5f35fbf67
httpsendfile: record progress information during read()
Augie Fackler <durin42@gmail.com>
parents:
12906
diff
changeset
|
295 return self._len |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
296 |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
297 def _gen_sendfile(orgsend): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
298 def _sendfile(self, data): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
299 # send a file |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
300 if isinstance(data, httpsendfile): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
301 # if auth required, some data sent twice, so rewind here |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
302 data.seek(0) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
303 for chunk in util.filechunkiter(data): |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
304 orgsend(self, chunk) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
305 else: |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
306 orgsend(self, data) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
307 return _sendfile |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
308 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
309 has_https = hasattr(urllib2, 'HTTPSHandler') |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
310 if has_https: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
311 try: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
312 # avoid using deprecated/broken FakeSocket in python 2.6 |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
313 import ssl |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
314 _ssl_wrap_socket = ssl.wrap_socket |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
315 CERT_REQUIRED = ssl.CERT_REQUIRED |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
316 except ImportError: |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
317 CERT_REQUIRED = 2 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
318 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
319 def _ssl_wrap_socket(sock, key_file, cert_file, |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
320 cert_reqs=CERT_REQUIRED, ca_certs=None): |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
321 if ca_certs: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
322 raise util.Abort(_( |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
323 'certificate checking requires Python 2.6')) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
324 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
325 ssl = socket.ssl(sock, key_file, cert_file) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
326 return httplib.FakeSocket(sock, ssl) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
327 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
328 try: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
329 _create_connection = socket.create_connection |
10411
af4c42ec19ed
ssl: fix compatibility with pre-2.6 Python
Matt Mackall <mpm@selenic.com>
parents:
10409
diff
changeset
|
330 except AttributeError: |
10482
95265afff99f
url: fix python < 2.6 with ssl installed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10415
diff
changeset
|
331 _GLOBAL_DEFAULT_TIMEOUT = object() |
95265afff99f
url: fix python < 2.6 with ssl installed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10415
diff
changeset
|
332 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
333 def _create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
334 source_address=None): |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
335 # lifted from Python 2.6 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
336 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
337 msg = "getaddrinfo returns an empty list" |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
338 host, port = address |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
339 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
340 af, socktype, proto, canonname, sa = res |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
341 sock = None |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
342 try: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
343 sock = socket.socket(af, socktype, proto) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
344 if timeout is not _GLOBAL_DEFAULT_TIMEOUT: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
345 sock.settimeout(timeout) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
346 if source_address: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
347 sock.bind(source_address) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
348 sock.connect(sa) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
349 return sock |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
350 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
351 except socket.error, msg: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
352 if sock is not None: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
353 sock.close() |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
354 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
355 raise socket.error, msg |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
356 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
357 class httpconnection(keepalive.HTTPConnection): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
358 # must be able to send big bundle as stream. |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
359 send = _gen_sendfile(keepalive.HTTPConnection.send) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
360 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
361 def connect(self): |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
362 if has_https and self.realhostport: # use CONNECT proxy |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
363 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
364 self.sock.connect((self.host, self.port)) |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
365 if _generic_proxytunnel(self): |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
366 # we do not support client x509 certificates |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
367 self.sock = _ssl_wrap_socket(self.sock, None, None) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
368 else: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
369 keepalive.HTTPConnection.connect(self) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
370 |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
371 def getresponse(self): |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
372 proxyres = getattr(self, 'proxyres', None) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
373 if proxyres: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
374 if proxyres.will_close: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
375 self.close() |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
376 self.proxyres = None |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
377 return proxyres |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
378 return keepalive.HTTPConnection.getresponse(self) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
379 |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
380 # general transaction handler to support different ways to handle |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
381 # HTTPS proxying before and after Python 2.6.3. |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
382 def _generic_start_transaction(handler, h, req): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
383 if hasattr(req, '_tunnel_host') and req._tunnel_host: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
384 tunnel_host = req._tunnel_host |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
385 if tunnel_host[:7] not in ['http://', 'https:/']: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
386 tunnel_host = 'https://' + tunnel_host |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
387 new_tunnel = True |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
388 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
389 tunnel_host = req.get_selector() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
390 new_tunnel = False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
391 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
392 if new_tunnel or tunnel_host == req.get_full_url(): # has proxy |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
393 urlparts = urlparse.urlparse(tunnel_host) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
394 if new_tunnel or urlparts[0] == 'https': # only use CONNECT for HTTPS |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
395 realhostport = urlparts[1] |
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
396 if realhostport[-1] == ']' or ':' not in realhostport: |
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
397 realhostport += ':443' |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
398 |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
399 h.realhostport = realhostport |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
400 h.headers = req.headers.copy() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
401 h.headers.update(handler.parent.addheaders) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
402 return |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
403 |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
404 h.realhostport = None |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
405 h.headers = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
406 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
407 def _generic_proxytunnel(self): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
408 proxyheaders = dict( |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
409 [(x, self.headers[x]) for x in self.headers |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
410 if x.lower().startswith('proxy-')]) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
411 self._set_hostport(self.host, self.port) |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
412 self.send('CONNECT %s HTTP/1.0\r\n' % self.realhostport) |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
413 for header in proxyheaders.iteritems(): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
414 self.send('%s: %s\r\n' % header) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
415 self.send('\r\n') |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
416 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
417 # majority of the following code is duplicated from |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
418 # httplib.HTTPConnection as there are no adequate places to |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
419 # override functions to provide the needed functionality |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
420 res = self.response_class(self.sock, |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
421 strict=self.strict, |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
422 method=self._method) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
423 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
424 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
425 version, status, reason = res._read_status() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
426 if status != httplib.CONTINUE: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
427 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
428 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
429 skip = res.fp.readline().strip() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
430 if not skip: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
431 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
432 res.status = status |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
433 res.reason = reason.strip() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
434 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
435 if res.status == 200: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
436 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
437 line = res.fp.readline() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
438 if line == '\r\n': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
439 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
440 return True |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
441 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
442 if version == 'HTTP/1.0': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
443 res.version = 10 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
444 elif version.startswith('HTTP/1.'): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
445 res.version = 11 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
446 elif version == 'HTTP/0.9': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
447 res.version = 9 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
448 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
449 raise httplib.UnknownProtocol(version) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
450 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
451 if res.version == 9: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
452 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
453 res.chunked = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
454 res.will_close = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
455 res.msg = httplib.HTTPMessage(cStringIO.StringIO()) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
456 return False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
457 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
458 res.msg = httplib.HTTPMessage(res.fp) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
459 res.msg.fp = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
460 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
461 # are we using the chunked-style of transfer encoding? |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
462 trenc = res.msg.getheader('transfer-encoding') |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
463 if trenc and trenc.lower() == "chunked": |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
464 res.chunked = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
465 res.chunk_left = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
466 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
467 res.chunked = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
468 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
469 # will the connection close at the end of the response? |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
470 res.will_close = res._check_close() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
471 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
472 # do we have a Content-Length? |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
473 # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked" |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
474 length = res.msg.getheader('content-length') |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
475 if length and not res.chunked: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
476 try: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
477 res.length = int(length) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
478 except ValueError: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
479 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
480 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
481 if res.length < 0: # ignore nonsensical negative lengths |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
482 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
483 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
484 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
485 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
486 # does the body have a fixed length? (of zero) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
487 if (status == httplib.NO_CONTENT or status == httplib.NOT_MODIFIED or |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
488 100 <= status < 200 or # 1xx codes |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
489 res._method == 'HEAD'): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
490 res.length = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
491 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
492 # if the connection remains open, and we aren't using chunked, and |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
493 # a content-length was not provided, then assume that the connection |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
494 # WILL close. |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
495 if (not res.will_close and |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
496 not res.chunked and |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
497 res.length is None): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
498 res.will_close = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
499 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
500 self.proxyres = res |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
501 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
502 return False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
503 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
504 class httphandler(keepalive.HTTPHandler): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
505 def http_open(self, req): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
506 return self.do_open(httpconnection, req) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
507 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
508 def _start_transaction(self, h, req): |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
509 _generic_start_transaction(self, h, req) |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
510 return keepalive.HTTPHandler._start_transaction(self, h, req) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
511 |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
512 def _verifycert(cert, hostname): |
12742
6ab4a7d3c179
url: validity (notBefore/notAfter) is checked by OpenSSL (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12607
diff
changeset
|
513 '''Verify that cert (in socket.getpeercert() format) matches hostname. |
13249
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
514 CRLs is not handled. |
12770
614f0d8724ab
check-code: find trailing whitespace
Martin Geisler <mg@lazybytes.net>
parents:
12742
diff
changeset
|
515 |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
516 Returns error message if any problems are found and None on success. |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
517 ''' |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
518 if not cert: |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
519 return _('no certificate received') |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
520 dnsname = hostname.lower() |
13249
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
521 def matchdnsname(certname): |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
522 return (certname == dnsname or |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
523 '.' in dnsname and certname == '*.' + dnsname.split('.', 1)[1]) |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
524 |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
525 san = cert.get('subjectAltName', []) |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
526 if san: |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
527 certnames = [value.lower() for key, value in san if key == 'DNS'] |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
528 for name in certnames: |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
529 if matchdnsname(name): |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
530 return None |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
531 return _('certificate is for %s') % ', '.join(certnames) |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
532 |
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
533 # subject is only checked when subjectAltName is empty |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
534 for s in cert.get('subject', []): |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
535 key, value = s[0] |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
536 if key == 'commonName': |
13248
00411a4fa1bb
url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents:
13231
diff
changeset
|
537 try: |
00411a4fa1bb
url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents:
13231
diff
changeset
|
538 # 'subject' entries are unicode |
00411a4fa1bb
url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents:
13231
diff
changeset
|
539 certname = value.lower().encode('ascii') |
00411a4fa1bb
url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents:
13231
diff
changeset
|
540 except UnicodeEncodeError: |
00411a4fa1bb
url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents:
13231
diff
changeset
|
541 return _('IDN in certificate not supported') |
13249
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
542 if matchdnsname(certname): |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
543 return None |
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
544 return _('certificate is for %s') % certname |
13249
75d0c38a0bca
url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents:
13248
diff
changeset
|
545 return _('no commonName or subjectAltName found in certificate') |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
546 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
547 if has_https: |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
548 class httpsconnection(httplib.HTTPSConnection): |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
549 response_class = keepalive.HTTPResponse |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
550 # must be able to send big bundle as stream. |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
551 send = _gen_sendfile(keepalive.safesend) |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
552 getresponse = keepalive.wrapgetresponse(httplib.HTTPSConnection) |
9726
430e59ff3437
keepalive: handle broken pipes gracefully during large POSTs
Augie Fackler <durin42@gmail.com>
parents:
9467
diff
changeset
|
553 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
554 def connect(self): |
13422
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
555 self.sock = _create_connection((self.host, self.port)) |
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
556 |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
557 host = self.host |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
558 if self.realhostport: # use CONNECT proxy |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
559 something = _generic_proxytunnel(self) |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
560 host = self.realhostport.rsplit(':', 1)[0] |
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
561 |
13419
1cc73868c740
url: remove test for self.ui in BetterHTTPS
Mads Kiilerich <mads@kiilerich.com>
parents:
13372
diff
changeset
|
562 cacerts = self.ui.config('web', 'cacerts') |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
563 hostfingerprint = self.ui.config('hostfingerprints', host) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
564 |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
565 if cacerts and not hostfingerprint: |
13544
66d65bccbf06
cacert: improve error report when web.cacert file does not exist
timeless <timeless@gmail.com>
parents:
13424
diff
changeset
|
566 cacerts = util.expandpath(cacerts) |
66d65bccbf06
cacert: improve error report when web.cacert file does not exist
timeless <timeless@gmail.com>
parents:
13424
diff
changeset
|
567 if not os.path.exists(cacerts): |
66d65bccbf06
cacert: improve error report when web.cacert file does not exist
timeless <timeless@gmail.com>
parents:
13424
diff
changeset
|
568 raise util.Abort(_('could not find ' |
66d65bccbf06
cacert: improve error report when web.cacert file does not exist
timeless <timeless@gmail.com>
parents:
13424
diff
changeset
|
569 'web.cacerts: %s') % cacerts) |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
570 self.sock = _ssl_wrap_socket(self.sock, self.key_file, |
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
571 self.cert_file, cert_reqs=CERT_REQUIRED, |
13544
66d65bccbf06
cacert: improve error report when web.cacert file does not exist
timeless <timeless@gmail.com>
parents:
13424
diff
changeset
|
572 ca_certs=cacerts) |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
573 msg = _verifycert(self.sock.getpeercert(), host) |
12592
f2937d6492c5
url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
12391
diff
changeset
|
574 if msg: |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
13314
diff
changeset
|
575 raise util.Abort(_('%s certificate error: %s ' |
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
13314
diff
changeset
|
576 '(use --insecure to connect ' |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
577 'insecurely)') % (host, msg)) |
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
578 self.ui.debug('%s certificate successfully verified\n' % host) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
579 else: |
13422
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
580 self.sock = _ssl_wrap_socket(self.sock, self.key_file, |
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
581 self.cert_file) |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
582 if hasattr(self.sock, 'getpeercert'): |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
583 peercert = self.sock.getpeercert(True) |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
584 peerfingerprint = util.sha1(peercert).hexdigest() |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
585 nicefingerprint = ":".join([peerfingerprint[x:x + 2] |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
586 for x in xrange(0, len(peerfingerprint), 2)]) |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
587 if hostfingerprint: |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
588 if peerfingerprint.lower() != \ |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
589 hostfingerprint.replace(':', '').lower(): |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
590 raise util.Abort(_('invalid certificate for %s ' |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
591 'with fingerprint %s') % |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
592 (host, nicefingerprint)) |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
593 self.ui.debug('%s certificate matched fingerprint %s\n' % |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
594 (host, nicefingerprint)) |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
595 else: |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
596 self.ui.warn(_('warning: %s certificate ' |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
597 'with fingerprint %s not verified ' |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
598 '(check hostfingerprints or web.cacerts ' |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
599 'config setting)\n') % |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
600 (host, nicefingerprint)) |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
601 else: # python 2.5 ? |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
602 if hostfingerprint: |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
603 raise util.Abort(_('no certificate for %s with ' |
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
604 'configured hostfingerprint') % host) |
13314
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
605 self.ui.warn(_('warning: %s certificate not verified ' |
8dc488dfcdb4
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates
Mads Kiilerich <mads@kiilerich.com>
parents:
13249
diff
changeset
|
606 '(check web.cacerts config setting)\n') % |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
607 host) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
608 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
609 class httpshandler(keepalive.KeepAliveHandler, urllib2.HTTPSHandler): |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
610 def __init__(self, ui): |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
611 keepalive.KeepAliveHandler.__init__(self) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
612 urllib2.HTTPSHandler.__init__(self) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
613 self.ui = ui |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
614 self.pwmgr = passwordmgr(self.ui) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
615 |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
616 def _start_transaction(self, h, req): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
617 _generic_start_transaction(self, h, req) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
618 return keepalive.KeepAliveHandler._start_transaction(self, h, req) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
619 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
620 def https_open(self, req): |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
621 res = readauthforuri(self.ui, req.get_full_url()) |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
622 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
623 group, auth = res |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
624 self.auth = auth |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
625 self.ui.debug("using auth.%s.* for authentication\n" % group) |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
626 else: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
627 self.auth = None |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
628 return self.do_open(self._makeconnection, req) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
629 |
10408
50fb1fe143ff
url: httplib.HTTPSConnection already handles IPv6 and port parsing fine
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
630 def _makeconnection(self, host, port=None, *args, **kwargs): |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
631 keyfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
632 certfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
633 |
10511
6f61c480f51c
url: *args argument is a tuple, not a list (found by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10484
diff
changeset
|
634 if len(args) >= 1: # key_file |
6f61c480f51c
url: *args argument is a tuple, not a list (found by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10484
diff
changeset
|
635 keyfile = args[0] |
6f61c480f51c
url: *args argument is a tuple, not a list (found by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10484
diff
changeset
|
636 if len(args) >= 2: # cert_file |
6f61c480f51c
url: *args argument is a tuple, not a list (found by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10484
diff
changeset
|
637 certfile = args[1] |
6f61c480f51c
url: *args argument is a tuple, not a list (found by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10484
diff
changeset
|
638 args = args[2:] |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
639 |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
640 # if the user has specified different key/cert files in |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
641 # hgrc, we prefer these |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
642 if self.auth and 'key' in self.auth and 'cert' in self.auth: |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
643 keyfile = self.auth['key'] |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
644 certfile = self.auth['cert'] |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
645 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
646 conn = httpsconnection(host, port, keyfile, certfile, *args, **kwargs) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
647 conn.ui = self.ui |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
648 return conn |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
649 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
650 class httpdigestauthhandler(urllib2.HTTPDigestAuthHandler): |
11457
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
651 def __init__(self, *args, **kwargs): |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
652 urllib2.HTTPDigestAuthHandler.__init__(self, *args, **kwargs) |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
653 self.retried_req = None |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
654 |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
655 def reset_retry_count(self): |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
656 # Python 2.6.5 will call this on 401 or 407 errors and thus loop |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
657 # forever. We disable reset_retry_count completely and reset in |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
658 # http_error_auth_reqed instead. |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
659 pass |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
660 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
661 def http_error_auth_reqed(self, auth_header, host, req, headers): |
11457
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
662 # Reset the retry counter once for each request. |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
663 if req is not self.retried_req: |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
664 self.retried_req = req |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
665 self.retried = 0 |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
666 # In python < 2.5 AbstractDigestAuthHandler raises a ValueError if |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
667 # it doesn't know about the auth type requested. This can happen if |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
668 # somebody is using BasicAuth and types a bad password. |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
669 try: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
670 return urllib2.HTTPDigestAuthHandler.http_error_auth_reqed( |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
671 self, auth_header, host, req, headers) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
672 except ValueError, inst: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
673 arg = inst.args[0] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
674 if arg.startswith("AbstractDigestAuthHandler doesn't know "): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
675 return |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
676 raise |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
677 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
678 class httpbasicauthhandler(urllib2.HTTPBasicAuthHandler): |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
679 def __init__(self, *args, **kwargs): |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
680 urllib2.HTTPBasicAuthHandler.__init__(self, *args, **kwargs) |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
681 self.retried_req = None |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
682 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
683 def reset_retry_count(self): |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
684 # Python 2.6.5 will call this on 401 or 407 errors and thus loop |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
685 # forever. We disable reset_retry_count completely and reset in |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
686 # http_error_auth_reqed instead. |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
687 pass |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
688 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
689 def http_error_auth_reqed(self, auth_header, host, req, headers): |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
690 # Reset the retry counter once for each request. |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
691 if req is not self.retried_req: |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
692 self.retried_req = req |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
693 self.retried = 0 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
694 return urllib2.HTTPBasicAuthHandler.http_error_auth_reqed( |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
695 self, auth_header, host, req, headers) |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
696 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
697 def getauthinfo(path): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
698 scheme, netloc, urlpath, query, frag = urlparse.urlsplit(path) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
699 if not urlpath: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
700 urlpath = '/' |
7284
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
701 if scheme != 'file': |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
702 # XXX: why are we quoting the path again with some smart |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
703 # heuristic here? Anyway, it cannot be done with file:// |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
704 # urls since path encoding is os/fs dependent (see |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
705 # urllib.pathname2url() for details). |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
706 urlpath = quotepath(urlpath) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
707 host, port, user, passwd = netlocsplit(netloc) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
708 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
709 # urllib cannot handle URLs with embedded user or passwd |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
710 url = urlparse.urlunsplit((scheme, netlocunsplit(host, port), |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
711 urlpath, query, frag)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
712 if user: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
713 netloc = host |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
714 if port: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
715 netloc += ':' + port |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
716 # Python < 2.4.3 uses only the netloc to search for a password |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
717 authinfo = (None, (url, netloc), user, passwd or '') |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
718 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
719 authinfo = None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
720 return url, authinfo |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
721 |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
722 handlerfuncs = [] |
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
723 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
724 def opener(ui, authinfo=None): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
725 ''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
726 construct an opener suitable for urllib2 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
727 authinfo will be added to the password manager |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
728 ''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
729 handlers = [httphandler()] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
730 if has_https: |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
731 handlers.append(httpshandler(ui)) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
732 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
733 handlers.append(proxyhandler(ui)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
734 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
735 passmgr = passwordmgr(ui) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
736 if authinfo is not None: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
737 passmgr.add_password(*authinfo) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
738 user, passwd = authinfo[2:4] |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9347
diff
changeset
|
739 ui.debug('http auth: user %s, password %s\n' % |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
740 (user, passwd and '*' * len(passwd) or 'not set')) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
741 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
742 handlers.extend((httpbasicauthhandler(passmgr), |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
743 httpdigestauthhandler(passmgr))) |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
744 handlers.extend([h(ui, passmgr) for h in handlerfuncs]) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
745 opener = urllib2.build_opener(*handlers) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
746 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
747 # 1.0 here is the _protocol_ version |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
748 opener.addheaders = [('User-agent', 'mercurial/proto-1.0')] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
749 opener.addheaders.append(('Accept', 'application/mercurial-0.1')) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
750 return opener |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
751 |
7285
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
752 scheme_re = re.compile(r'^([a-zA-Z0-9+-.]+)://') |
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
753 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
754 def open(ui, url, data=None): |
7285
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
755 scheme = None |
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
756 m = scheme_re.search(url) |
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
757 if m: |
5ad99abfab79
url: detect scheme with a regexp instead of urlsplit()
Patrick Mezard <pmezard@gmail.com>
parents:
7284
diff
changeset
|
758 scheme = m.group(1).lower() |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
759 if not scheme: |
7284
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
760 path = util.normpath(os.path.abspath(url)) |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
761 url = 'file://' + urllib.pathname2url(path) |
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
762 authinfo = None |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
763 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
764 url, authinfo = getauthinfo(url) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
765 return opener(ui, authinfo).open(url, data) |