Mercurial > hg
annotate mercurial/url.py @ 26615:c9223a3979b7
merge.mergestate: add a wrapper around resolve
The resolve function will be broken up into separate pre-resolve and resolve
steps.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Sun, 11 Oct 2015 18:29:50 -0700 |
parents | 56b2bcea2529 |
children | ec12ebe20200 |
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 |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
10 from __future__ import absolute_import |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
11 |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
12 import base64 |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
13 import cStringIO |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
14 import httplib |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
15 import os |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
16 import socket |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
17 import urllib |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
18 import urllib2 |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
19 |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
20 from .i18n import _ |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
21 from . import ( |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25990
diff
changeset
|
22 error, |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
23 httpconnection as httpconnectionmod, |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
24 keepalive, |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
25 sslutil, |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
26 util, |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
27 ) |
13371
c691cfdc6b4d
url: move [auth] parsing out into a utility function
Steve Borho <steve@borho.org>
parents:
13370
diff
changeset
|
28 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
29 class passwordmgr(urllib2.HTTPPasswordMgrWithDefaultRealm): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
30 def __init__(self, ui): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
31 urllib2.HTTPPasswordMgrWithDefaultRealm.__init__(self) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
32 self.ui = ui |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
33 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
34 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
|
35 authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password( |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
36 self, realm, authuri) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
37 user, passwd = authinfo |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
38 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
|
39 self._writedebug(user, passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
40 return (user, passwd) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
41 |
15005
4a43e23b8c55
hgweb: do not ignore [auth] if url has a username (issue2822)
Patrick Mezard <pmezard@gmail.com>
parents:
14244
diff
changeset
|
42 if not user or not passwd: |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
43 res = httpconnectionmod.readauthforuri(self.ui, authuri, user) |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
44 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
45 group, auth = res |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
46 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
|
47 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
|
48 if not user or not passwd: |
20291
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
49 u = util.url(authuri) |
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
50 u.query = None |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
51 if not self.ui.interactive(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25990
diff
changeset
|
52 raise error.Abort(_('http authorization required for %s') % |
20291
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
53 util.hidepassword(str(u))) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
54 |
20291
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
55 self.ui.write(_("http authorization required for %s\n") % |
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
56 util.hidepassword(str(u))) |
12862
9d6adddc8eea
url: show realm/user when asking for username/password
timeless <timeless@gmail.com>
parents:
12770
diff
changeset
|
57 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
|
58 if user: |
12862
9d6adddc8eea
url: show realm/user when asking for username/password
timeless <timeless@gmail.com>
parents:
12770
diff
changeset
|
59 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
|
60 else: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
61 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
|
62 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
63 if not passwd: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
64 passwd = self.ui.getpass() |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
65 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
66 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
|
67 self._writedebug(user, passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
68 return (user, passwd) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
69 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
70 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
|
71 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
|
72 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
|
73 |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
74 def find_stored_password(self, authuri): |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
75 return urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password( |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
76 self, None, authuri) |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
77 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
78 class proxyhandler(urllib2.ProxyHandler): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
79 def __init__(self, ui): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
80 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
|
81 # XXX proxyauthinfo = None |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
82 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
83 if proxyurl: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
84 # 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
|
85 if not (proxyurl.startswith('http:') or |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
86 proxyurl.startswith('https:')): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
87 proxyurl = 'http://' + proxyurl + '/' |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
14071
diff
changeset
|
88 proxy = util.url(proxyurl) |
13820
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
89 if not proxy.user: |
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
90 proxy.user = ui.config("http_proxy", "user") |
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
91 proxy.passwd = ui.config("http_proxy", "passwd") |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
92 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
93 # 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
|
94 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
|
95 no_list.extend([p.lower() for |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
96 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
|
97 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
|
98 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
|
99 if p.strip()]) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
100 # "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
|
101 if ui.configbool("http_proxy", "always"): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
102 self.no_list = [] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
103 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
104 self.no_list = no_list |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
105 |
13820
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
106 proxyurl = str(proxy) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
107 proxies = {'http': proxyurl, 'https': proxyurl} |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9347
diff
changeset
|
108 ui.debug('proxying through http://%s:%s\n' % |
13820
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
109 (proxy.host, proxy.port)) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
110 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
111 proxies = {} |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
112 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
113 # urllib2 takes proxy values from the environment and those |
15077
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
114 # will take precedence if found. So, if there's a config entry |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
115 # defining a proxy, drop the environment ones |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
116 if ui.config("http_proxy", "host"): |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
117 for env in ["HTTP_PROXY", "http_proxy", "no_proxy"]: |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
118 try: |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
119 if env in os.environ: |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
120 del os.environ[env] |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
121 except OSError: |
02734d2baa79
url: Remove the proxy env variables only when needed (issue2451)
Renato Cunha <renatoc@gmail.com>
parents:
15025
diff
changeset
|
122 pass |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
123 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
124 urllib2.ProxyHandler.__init__(self, proxies) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
125 self.ui = ui |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
126 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
127 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
|
128 host = req.get_host().split(':')[0] |
19535
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
129 for e in self.no_list: |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
130 if host == e: |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
131 return None |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
132 if e.startswith('*.') and host.endswith(e[2:]): |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
133 return None |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
134 if e.startswith('.') and host.endswith(e[1:]): |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
135 return None |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
136 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
137 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
|
138 |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
139 def _gen_sendfile(orgsend): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
140 def _sendfile(self, data): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
141 # send a file |
14244
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
142 if isinstance(data, httpconnectionmod.httpsendfile): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
143 # 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
|
144 data.seek(0) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
145 for chunk in util.filechunkiter(data): |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
146 orgsend(self, chunk) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
147 else: |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
148 orgsend(self, data) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
149 return _sendfile |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
150 |
14964
376c32a5ccdc
url: replace uses of hasattr with safehasattr or getattr
Augie Fackler <durin42@gmail.com>
parents:
14244
diff
changeset
|
151 has_https = util.safehasattr(urllib2, 'HTTPSHandler') |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
152 if has_https: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
153 try: |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
154 _create_connection = socket.create_connection |
10411
af4c42ec19ed
ssl: fix compatibility with pre-2.6 Python
Matt Mackall <mpm@selenic.com>
parents:
10409
diff
changeset
|
155 except AttributeError: |
10482
95265afff99f
url: fix python < 2.6 with ssl installed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10415
diff
changeset
|
156 _GLOBAL_DEFAULT_TIMEOUT = object() |
95265afff99f
url: fix python < 2.6 with ssl installed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10415
diff
changeset
|
157 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
158 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
|
159 source_address=None): |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
160 # 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
|
161 |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
162 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
|
163 host, port = address |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
164 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
|
165 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
|
166 sock = None |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
167 try: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
168 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
|
169 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
|
170 sock.settimeout(timeout) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
171 if source_address: |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
172 sock.bind(source_address) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
173 sock.connect(sa) |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
174 return sock |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
175 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25429
diff
changeset
|
176 except socket.error as msg: |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
177 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
|
178 sock.close() |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
179 |
18176
ffec6d0a5ed6
url: clean up use of two-argument raise
Augie Fackler <raf@durin42.com>
parents:
17428
diff
changeset
|
180 raise socket.error(msg) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
181 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
182 class httpconnection(keepalive.HTTPConnection): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
183 # must be able to send big bundle as stream. |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
184 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
|
185 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
186 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
|
187 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
|
188 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
|
189 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
|
190 if _generic_proxytunnel(self): |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
16683
diff
changeset
|
191 # we do not support client X.509 certificates |
25429
9d1c61715939
ssl: rename ssl_wrap_socket() to conform to our naming convention
Yuya Nishihara <yuya@tcha.org>
parents:
25415
diff
changeset
|
192 self.sock = sslutil.wrapsocket(self.sock, None, None, None, |
9d1c61715939
ssl: rename ssl_wrap_socket() to conform to our naming convention
Yuya Nishihara <yuya@tcha.org>
parents:
25415
diff
changeset
|
193 serverhostname=self.host) |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
194 else: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
195 keepalive.HTTPConnection.connect(self) |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
196 |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
197 def getresponse(self): |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
198 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
|
199 if proxyres: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
200 if proxyres.will_close: |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
201 self.close() |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
202 self.proxyres = None |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
203 return proxyres |
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
204 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
|
205 |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
206 # 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
|
207 # 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
|
208 def _generic_start_transaction(handler, h, req): |
14964
376c32a5ccdc
url: replace uses of hasattr with safehasattr or getattr
Augie Fackler <durin42@gmail.com>
parents:
14244
diff
changeset
|
209 tunnel_host = getattr(req, '_tunnel_host', None) |
376c32a5ccdc
url: replace uses of hasattr with safehasattr or getattr
Augie Fackler <durin42@gmail.com>
parents:
14244
diff
changeset
|
210 if tunnel_host: |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
211 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
|
212 tunnel_host = 'https://' + tunnel_host |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
213 new_tunnel = True |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
214 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
215 tunnel_host = req.get_selector() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
216 new_tunnel = False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
217 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
218 if new_tunnel or tunnel_host == req.get_full_url(): # has proxy |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
14071
diff
changeset
|
219 u = util.url(tunnel_host) |
13820
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
220 if new_tunnel or u.scheme == 'https': # only use CONNECT for HTTPS |
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
221 h.realhostport = ':'.join([u.host, (u.port or '443')]) |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
222 h.headers = req.headers.copy() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
223 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
|
224 return |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
225 |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
226 h.realhostport = None |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
227 h.headers = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
228 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
229 def _generic_proxytunnel(self): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
230 proxyheaders = dict( |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
231 [(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
|
232 if x.lower().startswith('proxy-')]) |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
233 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
|
234 for header in proxyheaders.iteritems(): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
235 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
|
236 self.send('\r\n') |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
237 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
238 # 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
|
239 # 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
|
240 # 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
|
241 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
|
242 strict=self.strict, |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
243 method=self._method) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
244 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
245 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
246 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
|
247 if status != httplib.CONTINUE: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
248 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
249 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
250 skip = res.fp.readline().strip() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
251 if not skip: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
252 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
253 res.status = status |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
254 res.reason = reason.strip() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
255 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
256 if res.status == 200: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
257 while True: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
258 line = res.fp.readline() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
259 if line == '\r\n': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
260 break |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
261 return True |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
262 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
263 if version == 'HTTP/1.0': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
264 res.version = 10 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
265 elif version.startswith('HTTP/1.'): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
266 res.version = 11 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
267 elif version == 'HTTP/0.9': |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
268 res.version = 9 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
269 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
270 raise httplib.UnknownProtocol(version) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
271 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
272 if res.version == 9: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
273 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
274 res.chunked = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
275 res.will_close = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
276 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
|
277 return False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
278 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
279 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
|
280 res.msg.fp = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
281 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
282 # 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
|
283 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
|
284 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
|
285 res.chunked = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
286 res.chunk_left = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
287 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
288 res.chunked = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
289 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
290 # 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
|
291 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
|
292 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
293 # do we have a Content-Length? |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
294 # NOTE: RFC 2616, section 4.4, #3 says we ignore this if |
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
295 # transfer-encoding is "chunked" |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
296 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
|
297 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
|
298 try: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
299 res.length = int(length) |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
300 except ValueError: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
301 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
302 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
303 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
|
304 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
305 else: |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
306 res.length = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
307 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
308 # 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
|
309 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
|
310 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
|
311 res._method == 'HEAD'): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
312 res.length = 0 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
313 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
314 # 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
|
315 # 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
|
316 # WILL close. |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
317 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
|
318 not res.chunked and |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
319 res.length is None): |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
320 res.will_close = 1 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
321 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
322 self.proxyres = res |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
323 |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
324 return False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
325 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
326 class httphandler(keepalive.HTTPHandler): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
327 def http_open(self, req): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
328 return self.do_open(httpconnection, req) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
329 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
330 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
|
331 _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
|
332 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
|
333 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
334 if has_https: |
25414
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
335 class httpsconnection(httplib.HTTPConnection): |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
336 response_class = keepalive.HTTPResponse |
25414
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
337 default_port = httplib.HTTPS_PORT |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
338 # 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
|
339 send = _gen_sendfile(keepalive.safesend) |
25414
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
340 getresponse = keepalive.wrapgetresponse(httplib.HTTPConnection) |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
341 |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
342 def __init__(self, host, port=None, key_file=None, cert_file=None, |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
343 *args, **kwargs): |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
344 httplib.HTTPConnection.__init__(self, host, port, *args, **kwargs) |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
345 self.key_file = key_file |
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
346 self.cert_file = cert_file |
9726
430e59ff3437
keepalive: handle broken pipes gracefully during large POSTs
Augie Fackler <durin42@gmail.com>
parents:
9467
diff
changeset
|
347 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
348 def connect(self): |
13422
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
349 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
|
350 |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
351 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
|
352 if self.realhostport: # use CONNECT proxy |
14064
e4bfb9c337f3
remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents:
13902
diff
changeset
|
353 _generic_proxytunnel(self) |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
354 host = self.realhostport.rsplit(':', 1)[0] |
25429
9d1c61715939
ssl: rename ssl_wrap_socket() to conform to our naming convention
Yuya Nishihara <yuya@tcha.org>
parents:
25415
diff
changeset
|
355 self.sock = sslutil.wrapsocket( |
23834
bf07c19b4c82
https: support tls sni (server name indication) for https urls (issue3090)
Alex Orange <crazycasta@gmail.com>
parents:
21543
diff
changeset
|
356 self.sock, self.key_file, self.cert_file, serverhostname=host, |
14204
5fa21960b2f4
sslutil: extracted ssl methods from httpsconnection in url.py
Augie Fackler <durin42@gmail.com>
parents:
14076
diff
changeset
|
357 **sslutil.sslkwargs(self.ui, host)) |
5fa21960b2f4
sslutil: extracted ssl methods from httpsconnection in url.py
Augie Fackler <durin42@gmail.com>
parents:
14076
diff
changeset
|
358 sslutil.validator(self.ui, host)(self.sock) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
359 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
360 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
|
361 def __init__(self, ui): |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
362 keepalive.KeepAliveHandler.__init__(self) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
363 urllib2.HTTPSHandler.__init__(self) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
364 self.ui = ui |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
365 self.pwmgr = passwordmgr(self.ui) |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
366 |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
367 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
|
368 _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
|
369 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
|
370 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
371 def https_open(self, req): |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
372 # req.get_full_url() does not contain credentials and we may |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
373 # need them to match the certificates. |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
374 url = req.get_full_url() |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
375 user, password = self.pwmgr.find_stored_password(url) |
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
376 res = httpconnectionmod.readauthforuri(self.ui, url, user) |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
377 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
378 group, auth = res |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
379 self.auth = auth |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
380 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
|
381 else: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
382 self.auth = None |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
383 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
|
384 |
10408
50fb1fe143ff
url: httplib.HTTPSConnection already handles IPv6 and port parsing fine
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
385 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
|
386 keyfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
387 certfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
388 |
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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 args = args[2:] |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
394 |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
395 # 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
|
396 # hgrc, we prefer these |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
397 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
|
398 keyfile = self.auth['key'] |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
399 certfile = self.auth['cert'] |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
400 |
16683 | 401 conn = httpsconnection(host, port, keyfile, certfile, *args, |
402 **kwargs) | |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
403 conn.ui = self.ui |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
404 return conn |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
405 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
406 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
|
407 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
|
408 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
|
409 self.retried_req = None |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
410 |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
411 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
|
412 # 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
|
413 # 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
|
414 # 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
|
415 pass |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
416 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
417 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
|
418 # 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
|
419 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
|
420 self.retried_req = req |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
421 self.retried = 0 |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
422 # 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
|
423 # 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
|
424 # 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
|
425 try: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
426 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
|
427 self, auth_header, host, req, headers) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25429
diff
changeset
|
428 except ValueError as inst: |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
429 arg = inst.args[0] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
430 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
|
431 return |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
432 raise |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
433 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
434 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
|
435 def __init__(self, *args, **kwargs): |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
436 self.auth = None |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
437 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
|
438 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
|
439 |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
440 def http_request(self, request): |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
441 if self.auth: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
442 request.add_unredirected_header(self.auth_header, self.auth) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
443 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
444 return request |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
445 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
446 def https_request(self, request): |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
447 if self.auth: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
448 request.add_unredirected_header(self.auth_header, self.auth) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
449 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
450 return request |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
451 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
452 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
|
453 # 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
|
454 # 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
|
455 # 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
|
456 pass |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
457 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
458 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
|
459 # 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
|
460 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
|
461 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
|
462 self.retried = 0 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
463 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
|
464 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
|
465 |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
466 def retry_http_basic_auth(self, host, req, realm): |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
467 user, pw = self.passwd.find_user_password(realm, req.get_full_url()) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
468 if pw is not None: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
469 raw = "%s:%s" % (user, pw) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
470 auth = 'Basic %s' % base64.b64encode(raw).strip() |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
471 if req.headers.get(self.auth_header, None) == auth: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
472 return None |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
473 self.auth = auth |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
474 req.add_unredirected_header(self.auth_header, auth) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
475 return self.parent.open(req) |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
476 else: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
477 return None |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
478 |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
479 handlerfuncs = [] |
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
480 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
481 def opener(ui, authinfo=None): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
482 ''' |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
483 construct an opener suitable for urllib2 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
484 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
|
485 ''' |
25837
d343806dcf68
http2: mark experimental and developer options
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
486 # experimental config: ui.usehttp2 |
14244
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
487 if ui.configbool('ui', 'usehttp2', False): |
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
488 handlers = [httpconnectionmod.http2handler(ui, passwordmgr(ui))] |
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
489 else: |
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
490 handlers = [httphandler()] |
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
491 if has_https: |
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
492 handlers.append(httpshandler(ui)) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
493 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
494 handlers.append(proxyhandler(ui)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
495 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
496 passmgr = passwordmgr(ui) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
497 if authinfo is not None: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
498 passmgr.add_password(*authinfo) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
499 user, passwd = authinfo[2:4] |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9347
diff
changeset
|
500 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
|
501 (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
|
502 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
503 handlers.extend((httpbasicauthhandler(passmgr), |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
504 httpdigestauthhandler(passmgr))) |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
505 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
|
506 opener = urllib2.build_opener(*handlers) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
507 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
508 # 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
|
509 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
|
510 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
|
511 return opener |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
512 |
13818
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
513 def open(ui, url_, data=None): |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
14071
diff
changeset
|
514 u = util.url(url_) |
13818
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
515 if u.scheme: |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
516 u.scheme = u.scheme.lower() |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
517 url_, authinfo = u.authinfo() |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
518 else: |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
519 path = util.normpath(os.path.abspath(url_)) |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
520 url_ = 'file://' + urllib.pathname2url(path) |
7284
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
521 authinfo = None |
13818
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
522 return opener(ui, authinfo).open(url_, data) |