Mercurial > hg
annotate mercurial/url.py @ 52164:e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
This mirrors the Python `InnerRevlog` and will be used in a future patch
to replace said Python implementation. This allows us to start doing more
things in pure Rust, in particular reading and writing operations.
A lot of changes have to be introduced all at once, it wouldn't be very
useful to separate this patch IMO since all of them are either interlocked
or only useful with the rest.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Thu, 10 Oct 2024 10:34:51 +0200 |
parents | 71658f79758a |
children |
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 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
3 # Copyright 2005, 2006, 2007, 2008 Olivia Mackall <olivia@selenic.com> |
7270
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 |
51863
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51862
diff
changeset
|
10 from __future__ import annotations |
25990
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 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
13 import hashlib |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
14 import socket |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
15 |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
16 from .i18n import _ |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
17 from .node import hex |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
18 from . import ( |
30820
6a70cf94d1b5
py3: replace pycompat.getenv with encoding.environ.get
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30763
diff
changeset
|
19 encoding, |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25990
diff
changeset
|
20 error, |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
21 httpconnection as httpconnectionmod, |
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
22 keepalive, |
34428
0ee9cf8d054a
url: use native strings for header values
Augie Fackler <augie@google.com>
parents:
33499
diff
changeset
|
23 pycompat, |
25990
c3efcdba08ea
url: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25837
diff
changeset
|
24 sslutil, |
34466
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
25 urllibcompat, |
25990
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 ) |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
28 from .utils import ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
29 stringutil, |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
30 urlutil, |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
31 ) |
29455
0c741fd6158a
py3: conditionalize httplib import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29379
diff
changeset
|
32 |
0c741fd6158a
py3: conditionalize httplib import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29379
diff
changeset
|
33 httplib = util.httplib |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
26806
diff
changeset
|
34 stringio = util.stringio |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
35 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
36 urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
37 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
38 |
34694
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
39 def escape(s, quote=None): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45759
diff
changeset
|
40 """Replace special characters "&", "<" and ">" to HTML-safe sequences. |
34694
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
41 If the optional flag quote is true, the quotation mark character (") |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
42 is also translated. |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
43 |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
44 This is the same as cgi.escape in Python, but always operates on |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
45 bytes, whereas cgi.escape in Python 3 only works on unicodes. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45759
diff
changeset
|
46 """ |
34694
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
47 s = s.replace(b"&", b"&") |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
48 s = s.replace(b"<", b"<") |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
49 s = s.replace(b">", b">") |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
50 if quote: |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
51 s = s.replace(b'"', b""") |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
52 return s |
2976cf87a60a
url: add cgi.escape equivalent for bytestrings
Augie Fackler <augie@google.com>
parents:
34466
diff
changeset
|
53 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
54 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48936
diff
changeset
|
55 class passwordmgr: |
29377
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
56 def __init__(self, ui, passwddb): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
57 self.ui = ui |
29377
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
58 self.passwddb = passwddb |
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
59 |
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
60 def add_password(self, realm, uri, user, passwd): |
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
61 return self.passwddb.add_password(realm, uri, user, passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
62 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
63 def find_user_password(self, realm, authuri): |
41449
bc776c31c093
url: add some defensive asserts on expected incoming types
Augie Fackler <augie@google.com>
parents:
40043
diff
changeset
|
64 assert isinstance(realm, (type(None), str)) |
bc776c31c093
url: add some defensive asserts on expected incoming types
Augie Fackler <augie@google.com>
parents:
40043
diff
changeset
|
65 assert isinstance(authuri, str) |
29377
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
66 authinfo = self.passwddb.find_user_password(realm, authuri) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
67 user, passwd = authinfo |
41450
d437d1e2a711
url: convert some variables back to bytes
Augie Fackler <augie@google.com>
parents:
41449
diff
changeset
|
68 user, passwd = pycompat.bytesurl(user), pycompat.bytesurl(passwd) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
69 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
|
70 self._writedebug(user, passwd) |
41590
349c8879becd
py3: ensure the HTTP password manager returns strings, not bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
41450
diff
changeset
|
71 return (pycompat.strurl(user), pycompat.strurl(passwd)) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
72 |
15005
4a43e23b8c55
hgweb: do not ignore [auth] if url has a username (issue2822)
Patrick Mezard <pmezard@gmail.com>
parents:
14244
diff
changeset
|
73 if not user or not passwd: |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
74 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
|
75 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
76 group, auth = res |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
77 user, passwd = auth.get(b'username'), auth.get(b'password') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
78 self.ui.debug(b"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
|
79 if not user or not passwd: |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
80 u = urlutil.url(pycompat.bytesurl(authuri)) |
20291
7d589d923b8a
url: added authuri when login information is requested (issue3209)
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20174
diff
changeset
|
81 u.query = None |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
82 if not self.ui.interactive(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
83 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
84 _(b'http authorization required for %s') |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
85 % urlutil.hidepassword(bytes(u)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
86 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
87 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
88 self.ui.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
89 _(b"http authorization required for %s\n") |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
90 % urlutil.hidepassword(bytes(u)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
91 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
92 self.ui.write(_(b"realm: %s\n") % pycompat.bytesurl(realm)) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
93 if user: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
94 self.ui.write(_(b"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
|
95 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
96 user = self.ui.prompt(_(b"user:"), default=None) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
97 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
98 if not passwd: |
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
99 passwd = self.ui.getpass() |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
100 |
45759
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
101 # As of Python 3.8, the default implementation of |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
102 # AbstractBasicAuthHandler.retry_http_basic_auth() assumes the user |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
103 # is set if pw is not None. This means (None, str) is not a valid |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
104 # return type of find_user_password(). |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
105 if user is None: |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
106 return None, None |
ff48eea4a926
url: do not continue HTTP authentication with user=None (issue6425)
Yuya Nishihara <yuya@tcha.org>
parents:
44783
diff
changeset
|
107 |
29377
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
108 self.passwddb.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
|
109 self._writedebug(user, passwd) |
41590
349c8879becd
py3: ensure the HTTP password manager returns strings, not bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
41450
diff
changeset
|
110 return (pycompat.strurl(user), pycompat.strurl(passwd)) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
111 |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
112 def _writedebug(self, user, passwd): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
113 msg = _(b'http auth: user %s, password %s\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
114 self.ui.debug(msg % (user, passwd and b'*' * len(passwd) or b'not set')) |
8333
89c80c3dc584
allow http authentication information to be specified in the configuration
Sune Foldager <cryo@cyanite.org>
parents:
8225
diff
changeset
|
115 |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
116 def find_stored_password(self, authuri): |
29377
2c019aac6b99
url: extract password database from password manager
liscju <piotr.listkiewicz@gmail.com>
parents:
29252
diff
changeset
|
117 return self.passwddb.find_user_password(None, authuri) |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
118 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
119 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
120 class proxyhandler(urlreq.proxyhandler): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
121 def __init__(self, ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
122 proxyurl = ui.config(b"http_proxy", b"host") or encoding.environ.get( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
123 b'http_proxy' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
124 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
125 # XXX proxyauthinfo = None |
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 if proxyurl: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
128 # proxy can be proper url or host[:port] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
129 if not ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 proxyurl.startswith(b'http:') or proxyurl.startswith(b'https:') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
131 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
132 proxyurl = b'http://' + proxyurl + b'/' |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
133 proxy = urlutil.url(proxyurl) |
13820
65b89e80f892
url: use url.url in proxyhandler
Brodie Rao <brodie@bitheap.org>
parents:
13819
diff
changeset
|
134 if not proxy.user: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 proxy.user = ui.config(b"http_proxy", b"user") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
136 proxy.passwd = ui.config(b"http_proxy", b"passwd") |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
137 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
138 # see if we should use a proxy for this url |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
139 no_list = [b"localhost", b"127.0.0.1"] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
140 no_list.extend( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
141 [p.lower() for p in ui.configlist(b"http_proxy", b"no")] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
142 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
143 no_list.extend( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
144 [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
145 p.strip().lower() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
146 for p in encoding.environ.get(b"no_proxy", b'').split(b',') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
147 if p.strip() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
148 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
149 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
150 # "http_proxy.always" config is for running tests on localhost |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
151 if ui.configbool(b"http_proxy", b"always"): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
152 self.no_list = [] |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
153 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
154 self.no_list = no_list |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
155 |
41710
4028897dfa05
url: always use str for proxy configuration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41708
diff
changeset
|
156 # Keys and values need to be str because the standard library |
4028897dfa05
url: always use str for proxy configuration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41708
diff
changeset
|
157 # expects them to be. |
4028897dfa05
url: always use str for proxy configuration
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41708
diff
changeset
|
158 proxyurl = str(proxy) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
159 proxies = {'http': proxyurl, 'https': proxyurl} |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
160 ui.debug( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
161 b'proxying through %s\n' % urlutil.hidepassword(bytes(proxy)) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
162 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
163 else: |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
164 proxies = {} |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
165 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
166 urlreq.proxyhandler.__init__(self, proxies) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
167 self.ui = ui |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
168 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
169 def proxy_open(self, req, proxy, type_): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
170 host = pycompat.bytesurl(urllibcompat.gethost(req)).split(b':')[0] |
19535
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
171 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
|
172 if host == e: |
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
173 return None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
174 if e.startswith(b'*.') and host.endswith(e[2:]): |
19535
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
175 return None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
176 if e.startswith(b'.') and host.endswith(e[1:]): |
19535
df2155ebf502
proxy: allow wildcards in the no proxy list (issue1821)
Matt Mackall <mpm@selenic.com>
parents:
18176
diff
changeset
|
177 return None |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
178 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
179 return urlreq.proxyhandler.proxy_open(self, req, proxy, type_) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
180 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
181 |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
182 def _gen_sendfile(orgsend): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
183 def _sendfile(self, data): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
184 # send a file |
14244
e7525a555a64
url: use new http support if requested by the user
Augie Fackler <durin42@gmail.com>
parents:
14204
diff
changeset
|
185 if isinstance(data, httpconnectionmod.httpsendfile): |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
186 # 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
|
187 data.seek(0) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
188 for chunk in util.filechunkiter(data): |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
189 orgsend(self, chunk) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
190 else: |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
191 orgsend(self, data) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
192 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
193 return _sendfile |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
194 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
195 |
50928
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50926
diff
changeset
|
196 has_https = hasattr(urlreq, 'httpshandler') |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
197 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
198 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
199 class httpconnection(keepalive.HTTPConnection): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
200 # must be able to send big bundle as stream. |
13420
051f498628f7
url: refactor _gen_sendfile
Mads Kiilerich <mads@kiilerich.com>
parents:
13419
diff
changeset
|
201 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
|
202 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
203 |
41708
d20f1594ff4a
url: always access req._tunnel_host
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41590
diff
changeset
|
204 # Large parts of this function have their origin from before Python 2.6 |
d20f1594ff4a
url: always access req._tunnel_host
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41590
diff
changeset
|
205 # and could potentially be removed. |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
206 def _generic_start_transaction(handler, h, req): |
41708
d20f1594ff4a
url: always access req._tunnel_host
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41590
diff
changeset
|
207 tunnel_host = req._tunnel_host |
14964
376c32a5ccdc
url: replace uses of hasattr with safehasattr or getattr
Augie Fackler <durin42@gmail.com>
parents:
14244
diff
changeset
|
208 if tunnel_host: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
209 if tunnel_host[:7] not in ['http://', 'https:/']: |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
210 tunnel_host = 'https://' + tunnel_host |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
211 new_tunnel = True |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
212 else: |
34466
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
213 tunnel_host = urllibcompat.getselector(req) |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
214 new_tunnel = False |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
215 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
216 if new_tunnel or tunnel_host == urllibcompat.getfullurl(req): # has proxy |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
217 u = urlutil.url(pycompat.bytesurl(tunnel_host)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
218 if new_tunnel or u.scheme == b'https': # only use CONNECT for HTTPS |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
219 h.realhostport = b':'.join([u.host, (u.port or b'443')]) |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
220 h.headers = req.headers.copy() |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
221 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
|
222 return |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
223 |
10415
677f15da38c1
url: proxy handling, simplify and correctly deal with IPv6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10411
diff
changeset
|
224 h.realhostport = None |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
225 h.headers = None |
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
226 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
227 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
228 class httphandler(keepalive.HTTPHandler): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
229 def http_open(self, req): |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
230 return self.do_open(httpconnection, req) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
231 |
8590
59acb9c7d90f
url: use CONNECT for HTTPS connections through HTTP proxy (issue967)
Henrik Stuart <hg@hstuart.dk>
parents:
8344
diff
changeset
|
232 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
|
233 _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
|
234 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
|
235 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
236 |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
237 class logginghttphandler(httphandler): |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
238 """HTTP(S) handler that logs socket I/O.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
239 |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
240 def __init__(self, logfh, name, observeropts, *args, **kwargs): |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
241 super().__init__(*args, **kwargs) |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
242 |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
243 self._logfh = logfh |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
244 self._logname = name |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
245 self._observeropts = observeropts |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
246 |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
247 def do_open(self, http_class, *args, **kwargs): |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
248 _logfh = self._logfh |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
249 _logname = self._logname |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
250 _observeropts = self._observeropts |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
251 |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
252 class logginghttpconnection(http_class): |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
253 def connect(self): |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
254 super().connect() |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
255 self.sock = util.makeloggingsocket( |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
256 _logfh, self.sock, _logname, **_observeropts |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
257 ) |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
258 |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
259 return super().do_open(logginghttpconnection, *args, **kwargs) |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
260 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
261 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
262 if has_https: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
263 |
50925
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
264 def _generic_proxytunnel(self: "httpsconnection"): |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
265 headers = self.headers # pytype: disable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
266 proxyheaders = { |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
267 pycompat.bytestr(x): pycompat.bytestr(headers[x]) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
268 for x in headers |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
269 if x.lower().startswith('proxy-') |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
270 } |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
271 realhostport = self.realhostport # pytype: disable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
272 self.send(b'CONNECT %s HTTP/1.0\r\n' % realhostport) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
273 |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
274 for header in proxyheaders.items(): |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
275 self.send(b'%s: %s\r\n' % header) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
276 self.send(b'\r\n') |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
277 |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
278 # majority of the following code is duplicated from |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
279 # httplib.HTTPConnection as there are no adequate places to |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
280 # override functions to provide the needed functionality. |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
281 |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
282 # pytype: disable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
283 res = self.response_class(self.sock, method=self._method) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
284 # pytype: enable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
285 |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
286 while True: |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
287 # pytype: disable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
288 version, status, reason = res._read_status() |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
289 # pytype: enable=attribute-error |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
290 if status != httplib.CONTINUE: |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
291 break |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
292 # skip lines that are all whitespace |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
293 list(iter(lambda: res.fp.readline().strip(), b'')) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
294 |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
295 if status == 200: |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
296 # skip lines until we find a blank line |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
297 list(iter(res.fp.readline, b'\r\n')) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
298 else: |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
299 self.close() |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
300 raise socket.error( |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
301 "Tunnel connection failed: %d %s" % (status, reason.strip()) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
302 ) |
13eab1a5db78
url: move the _generic_proxytunnel in the `has_https` block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50614
diff
changeset
|
303 |
40031
f2dffa1359c6
url: have httpsconnection inherit from our custom HTTPConnection
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40018
diff
changeset
|
304 class httpsconnection(keepalive.HTTPConnection): |
13424
08f9c587141f
url: merge BetterHTTPS with httpsconnection to get some proxy https validation
Mads Kiilerich <mads@kiilerich.com>
parents:
13422
diff
changeset
|
305 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
|
306 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
|
307 # 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
|
308 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
|
309 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
|
310 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
311 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
312 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
313 host, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
314 port=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
315 key_file=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
316 cert_file=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
317 *args, |
51862
607e94e01851
format: add many "missing" comma
Matt Harbison <matt_harbison@yahoo.com>
parents:
51830
diff
changeset
|
318 **kwargs, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
319 ): |
40031
f2dffa1359c6
url: have httpsconnection inherit from our custom HTTPConnection
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40018
diff
changeset
|
320 keepalive.HTTPConnection.__init__(self, host, port, *args, **kwargs) |
25414
f7ccbc2776b7
https: do not inherit httplib.HTTPSConnection that creates unused SSLContext
Yuya Nishihara <yuya@tcha.org>
parents:
25207
diff
changeset
|
321 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
|
322 self.cert_file = cert_file |
9726
430e59ff3437
keepalive: handle broken pipes gracefully during large POSTs
Augie Fackler <durin42@gmail.com>
parents:
9467
diff
changeset
|
323 |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
324 def connect(self): |
50318
3bb7c56e8fe6
url: don't ignore timeout for https connections
Julien Cristau <jcristau@mozilla.com>
parents:
49390
diff
changeset
|
325 self.sock = socket.create_connection( |
3bb7c56e8fe6
url: don't ignore timeout for https connections
Julien Cristau <jcristau@mozilla.com>
parents:
49390
diff
changeset
|
326 (self.host, self.port), self.timeout |
3bb7c56e8fe6
url: don't ignore timeout for https connections
Julien Cristau <jcristau@mozilla.com>
parents:
49390
diff
changeset
|
327 ) |
13422
ebce5196b9db
url: always create BetterHTTPS connections the same way
Mads Kiilerich <mads@kiilerich.com>
parents:
13421
diff
changeset
|
328 |
13421
bd8bfa85d5a5
url: refactor BetterHTTPS.connect
Mads Kiilerich <mads@kiilerich.com>
parents:
13420
diff
changeset
|
329 host = self.host |
49390
9f3edb305261
typing: suppress a few attribute errors in url.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49279
diff
changeset
|
330 realhostport = self.realhostport # pytype: disable=attribute-error |
9f3edb305261
typing: suppress a few attribute errors in url.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49279
diff
changeset
|
331 if realhostport: # use CONNECT proxy |
14064
e4bfb9c337f3
remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents:
13902
diff
changeset
|
332 _generic_proxytunnel(self) |
49390
9f3edb305261
typing: suppress a few attribute errors in url.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49279
diff
changeset
|
333 host = realhostport.rsplit(b':', 1)[0] |
25429
9d1c61715939
ssl: rename ssl_wrap_socket() to conform to our naming convention
Yuya Nishihara <yuya@tcha.org>
parents:
25415
diff
changeset
|
334 self.sock = sslutil.wrapsocket( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
335 self.sock, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
336 self.key_file, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
337 self.cert_file, |
49390
9f3edb305261
typing: suppress a few attribute errors in url.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49279
diff
changeset
|
338 ui=self.ui, # pytype: disable=attribute-error |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
339 serverhostname=host, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
340 ) |
29227
dffe78d80a6c
sslutil: convert socket validation from a class to a function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28883
diff
changeset
|
341 sslutil.validatesocket(self.sock) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
342 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
343 class httpshandler(keepalive.KeepAliveHandler, urlreq.httpshandler): |
40043
6509fcec830c
url: allow to configure timeout on http connection
Cédric Krier <ced@b2ck.com>
parents:
40034
diff
changeset
|
344 def __init__(self, ui, timeout=None): |
6509fcec830c
url: allow to configure timeout on http connection
Cédric Krier <ced@b2ck.com>
parents:
40034
diff
changeset
|
345 keepalive.KeepAliveHandler.__init__(self, timeout=timeout) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
346 urlreq.httpshandler.__init__(self) |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
347 self.ui = ui |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
348 self.pwmgr = passwordmgr(self.ui, self.ui.httppasswordmgrdb) |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
349 |
9852
917cf6bb6d0c
url: generalise HTTPS proxy handling to accomodate Python changes
Henrik Stuart <hg@hstuart.dk>
parents:
9726
diff
changeset
|
350 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
|
351 _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
|
352 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
|
353 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
354 def https_open(self, req): |
34466
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
355 # urllibcompat.getfullurl() does not contain credentials |
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
356 # and we may need them to match the certificates. |
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
357 url = urllibcompat.getfullurl(req) |
15025
0593e8f81c71
http: pass user to readauthforuri() (fix 4a43e23b8c55)
Patrick Mezard <pmezard@gmail.com>
parents:
15005
diff
changeset
|
358 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
|
359 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
|
360 if res: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
361 group, auth = res |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
362 self.auth = auth |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
363 self.ui.debug(b"using auth.%s.* for authentication\n" % group) |
13372
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
364 else: |
5bced0d28a39
url: return the matched authentication group name from readauthforuri()
Steve Borho <steve@borho.org>
parents:
13371
diff
changeset
|
365 self.auth = None |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
366 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
|
367 |
10408
50fb1fe143ff
url: httplib.HTTPSConnection already handles IPv6 and port parsing fine
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
368 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
|
369 keyfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
370 certfile = None |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
371 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
372 if len(args) >= 1: # key_file |
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
|
373 keyfile = args[0] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
374 if len(args) >= 2: # cert_file |
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
|
375 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
|
376 args = args[2:] |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
377 |
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
378 # 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
|
379 # hgrc, we prefer these |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
380 if self.auth and b'key' in self.auth and b'cert' in self.auth: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
381 keyfile = self.auth[b'key'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
382 certfile = self.auth[b'cert'] |
8847
7951f385fcb7
url: support client certificate files over HTTPS (issue643)
Henrik Stuart <hg@hstuart.dk>
parents:
8590
diff
changeset
|
383 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
384 conn = httpsconnection( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
385 host, port, keyfile, certfile, *args, **kwargs |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
386 ) |
10409
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
387 conn.ui = self.ui |
4c94a3df4b10
url: SSL server certificate verification using web.cacerts file (issue1174)
Henrik Stuart <hg@hstuart.dk>
parents:
10408
diff
changeset
|
388 return conn |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
389 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
390 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
391 class httpdigestauthhandler(urlreq.httpdigestauthhandler): |
11457
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
392 def __init__(self, *args, **kwargs): |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
393 urlreq.httpdigestauthhandler.__init__(self, *args, **kwargs) |
11457
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
394 self.retried_req = None |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
395 |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
396 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
|
397 # 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
|
398 # 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
|
399 # 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
|
400 pass |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
401 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
402 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
|
403 # 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
|
404 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
|
405 self.retried_req = req |
2ec346160783
http digest auth: reset redirect counter on new requests (issue2255)
Mads Kiilerich <mads@kiilerich.com>
parents:
11415
diff
changeset
|
406 self.retried = 0 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
407 return urlreq.httpdigestauthhandler.http_error_auth_reqed( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
408 self, auth_header, host, req, headers |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
409 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
410 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
411 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
412 class httpbasicauthhandler(urlreq.httpbasicauthhandler): |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
413 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
|
414 self.auth = None |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
415 urlreq.httpbasicauthhandler.__init__(self, *args, **kwargs) |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
416 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
|
417 |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
418 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
|
419 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
|
420 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
|
421 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
422 return request |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
423 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
424 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
|
425 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
|
426 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
|
427 |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
428 return request |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
429 |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
430 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
|
431 # 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
|
432 # 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
|
433 # 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
|
434 pass |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
435 |
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
436 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
|
437 # 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
|
438 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
|
439 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
|
440 self.retried = 0 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
441 return urlreq.httpbasicauthhandler.http_error_auth_reqed( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
442 self, auth_header, host, req, headers |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
443 ) |
11844
6c51a5056020
http basic auth: reset redirect counter on new requests (issue2255)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
11457
diff
changeset
|
444 |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
445 def retry_http_basic_auth(self, host, req, realm): |
34466
1232f7fa00c3
cleanup: use urllibcompat for renamed methods on urllib request objects
Augie Fackler <augie@google.com>
parents:
34428
diff
changeset
|
446 user, pw = self.passwd.find_user_password( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
447 realm, urllibcompat.getfullurl(req) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
448 ) |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
449 if pw is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
450 raw = b"%s:%s" % (pycompat.bytesurl(user), pycompat.bytesurl(pw)) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
451 auth = 'Basic %s' % pycompat.strurl(base64.b64encode(raw).strip()) |
29639
6fd751fa58d3
url: avoid re-issuing incorrect password (issue3210)
Kim Randell <Kim.Randell@vicon.com>
parents:
29599
diff
changeset
|
452 if req.get_header(self.auth_header, None) == auth: |
20964
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
453 return None |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
454 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
|
455 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
|
456 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
|
457 else: |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
458 return None |
a939eeb94833
http: reuse authentication info after the first failed request (issue3567)
Stéphane Klein <contact@stephane-klein.info>
parents:
20291
diff
changeset
|
459 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
460 |
51830
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
461 def load_cookiejar(ui): |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
462 cookiefile = ui.config(b'auth', b'cookiefile') |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
463 if not cookiefile: |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
464 return |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
465 cookiefile = util.expandpath(cookiefile) |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
466 try: |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
467 cookiejar = util.cookielib.MozillaCookieJar( |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
468 pycompat.fsdecode(cookiefile) |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
469 ) |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
470 cookiejar.load() |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
471 return cookiejar |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
472 except util.cookielib.LoadError as e: |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
473 ui.warn( |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
474 _( |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
475 b'(error loading cookie file %s: %s; continuing without ' |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
476 b'cookies)\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
477 ) |
51830
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
478 % (cookiefile, stringutil.forcebytestr(e)) |
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
479 ) |
31936
806f9a883b4f
url: support auth.cookiesfile for adding cookies to HTTP requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30820
diff
changeset
|
480 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
481 |
51827
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
482 class readlinehandler(urlreq.basehandler): |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
483 def http_response(self, request, response): |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
484 class readlineresponse(response.__class__): |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
485 def readlines(self, sizehint=0): |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
486 total = 0 |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
487 list = [] |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
488 while True: |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
489 line = self.readline() |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
490 if not line: |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
491 break |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
492 list.append(line) |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
493 total += len(line) |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
494 if sizehint and total >= sizehint: |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
495 break |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
496 return list |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
497 |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
498 response.__class__ = readlineresponse |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
499 return response |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
500 |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
501 https_response = http_response |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
502 |
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
503 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
504 class digesthandler(urlreq.basehandler): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
505 # exchange.py assumes the algorithms are listed in order of preference, |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
506 # earlier entries are prefered. |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
507 digest_algorithms = { |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
508 b'sha256': hashlib.sha256, |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
509 b'sha512': hashlib.sha512, |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
510 } |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
511 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
512 def __init__(self, digest): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
513 if b':' not in digest: |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
514 raise error.Abort(_(b'invalid digest specification')) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
515 algo, checksum = digest.split(b':') |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
516 if algo not in self.digest_algorithms: |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
517 raise error.Abort(_(b'unsupported digest algorithm: %s') % algo) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
518 self._digest = checksum |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
519 self._hasher = self.digest_algorithms[algo]() |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
520 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
521 def http_response(self, request, response): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
522 class digestresponse(response.__class__): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
523 def _digest_input(self, data): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
524 self._hasher.update(data) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
525 self._digest_consumed += len(data) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
526 if self._digest_finished: |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
527 digest = hex(self._hasher.digest()) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
528 if digest != self._digest: |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
529 raise error.SecurityError( |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
530 _( |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
531 b'file with digest %s expected, but %s found for %d bytes' |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
532 ) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
533 % ( |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
534 pycompat.bytestr(self._digest), |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
535 pycompat.bytestr(digest), |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
536 self._digest_consumed, |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
537 ) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
538 ) |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
539 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
540 def read(self, amt=None): |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
541 self._digest_recursion_level += 1 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
542 data = super().read(amt) |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
543 self._digest_recursion_level -= 1 |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
544 if self._digest_recursion_level == 0: |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
545 self._digest_input(data) |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
546 return data |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
547 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
548 def readline(self): |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
549 self._digest_recursion_level += 1 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
550 data = super().readline() |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
551 self._digest_recursion_level -= 1 |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
552 if self._digest_recursion_level == 0: |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
553 self._digest_input(data) |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
554 return data |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
555 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
556 def readinto(self, dest): |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
557 self._digest_recursion_level += 1 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
558 got = super().readinto(dest) |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
559 self._digest_recursion_level -= 1 |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
560 if self._digest_recursion_level == 0: |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
561 self._digest_input(dest[:got]) |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
562 return got |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
563 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
564 def _close_conn(self): |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
565 self._digest_finished = True |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
566 return super().close() |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
567 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
568 response.__class__ = digestresponse |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
569 response._digest = self._digest |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
570 response._digest_consumed = 0 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
571 response._hasher = self._hasher.copy() |
51992
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
572 # Python 3.8 / 3.9 recurses internally between read/readinto. |
71658f79758a
clonebundle-digest: add recursion guards for Python 3.8
Joerg Sonnenberger <joerg@bec.de>
parents:
51982
diff
changeset
|
573 response._digest_recursion_level = 0 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
574 response._digest_finished = False |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
575 return response |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
576 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
577 https_response = http_response |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
578 |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
579 |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
580 handlerfuncs = [] |
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
581 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
582 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
583 def opener( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
584 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
585 authinfo=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
586 useragent=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
587 loggingfh=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
588 loggingname=b's', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
589 loggingopts=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
590 sendaccept=True, |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
591 digest=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
592 ): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45759
diff
changeset
|
593 """ |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
594 construct an opener suitable for urllib2 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
595 authinfo will be added to the password manager |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
596 |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
597 The opener can be configured to log socket events if the various |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
598 ``logging*`` arguments are specified. |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
599 |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
600 ``loggingfh`` denotes a file object to log events to. |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
601 ``loggingname`` denotes the name of the to print when logging. |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
602 ``loggingopts`` is a dict of keyword arguments to pass to the constructed |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
603 ``util.socketobserver`` instance. |
37045
a708e1e4d7a8
url: support suppressing Accept header
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37011
diff
changeset
|
604 |
a708e1e4d7a8
url: support suppressing Accept header
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37011
diff
changeset
|
605 ``sendaccept`` allows controlling whether the ``Accept`` request header |
a708e1e4d7a8
url: support suppressing Accept header
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37011
diff
changeset
|
606 is sent. The header is sent by default. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45759
diff
changeset
|
607 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
608 timeout = ui.configwith(float, b'http', b'timeout') |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
609 handlers = [] |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
610 |
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
611 if loggingfh: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
612 handlers.append( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
613 logginghttphandler( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
614 loggingfh, loggingname, loggingopts or {}, timeout=timeout |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
615 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
616 ) |
37011
02221d6fb041
url: add HTTP handler that uses a proxied socket
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36652
diff
changeset
|
617 else: |
40043
6509fcec830c
url: allow to configure timeout on http connection
Cédric Krier <ced@b2ck.com>
parents:
40034
diff
changeset
|
618 handlers.append(httphandler(timeout=timeout)) |
51828
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
619 if has_https: |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
620 # pytype get confused about the conditional existence for httpshandler here. |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
621 handlers.append( |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
622 httpshandler(ui, timeout=timeout) # pytype: disable=name-error |
b08de326bee4
debugwireproto: redo logging to also work for https
Joerg Sonnenberger <joerg@bec.de>
parents:
51827
diff
changeset
|
623 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
624 |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
625 handlers.append(proxyhandler(ui)) |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
626 |
29378
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29377
diff
changeset
|
627 passmgr = passwordmgr(ui, ui.httppasswordmgrdb) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
628 if authinfo is not None: |
29379
fc777c855d66
largefiles: make cloning not ask two times about password (issue4883)
liscju <piotr.listkiewicz@gmail.com>
parents:
29378
diff
changeset
|
629 realm, uris, user, passwd = authinfo |
fc777c855d66
largefiles: make cloning not ask two times about password (issue4883)
liscju <piotr.listkiewicz@gmail.com>
parents:
29378
diff
changeset
|
630 saveduser, savedpass = passmgr.find_stored_password(uris[0]) |
fc777c855d66
largefiles: make cloning not ask two times about password (issue4883)
liscju <piotr.listkiewicz@gmail.com>
parents:
29378
diff
changeset
|
631 if user != saveduser or passwd: |
fc777c855d66
largefiles: make cloning not ask two times about password (issue4883)
liscju <piotr.listkiewicz@gmail.com>
parents:
29378
diff
changeset
|
632 passmgr.add_password(realm, uris, user, passwd) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
633 ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
634 b'http auth: user %s, password %s\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
635 % (user, passwd and b'*' * len(passwd) or b'not set') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
636 ) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
637 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
638 handlers.extend( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
639 (httpbasicauthhandler(passmgr), httpdigestauthhandler(passmgr)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
640 ) |
9347
d0474b184347
url: add support for custom handlers in extensions
Henrik Stuart <hg@hstuart.dk>
parents:
9122
diff
changeset
|
641 handlers.extend([h(ui, passmgr) for h in handlerfuncs]) |
51830
208698117124
http: use urllib's cookie handler
Joerg Sonnenberger <joerg@bec.de>
parents:
51828
diff
changeset
|
642 handlers.append(urlreq.httpcookieprocessor(cookiejar=load_cookiejar(ui))) |
51827
ace0da86edd0
urllib2: redo response.readlines addition via class patching
Joerg Sonnenberger <joerg@bec.de>
parents:
50928
diff
changeset
|
643 handlers.append(readlinehandler()) |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
644 if digest: |
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
645 handlers.append(digesthandler(digest)) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28861
diff
changeset
|
646 opener = urlreq.buildopener(*handlers) |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
647 |
40034
393e44324037
httppeer: report http statistics
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40031
diff
changeset
|
648 # keepalive.py's handlers will populate these attributes if they exist. |
393e44324037
httppeer: report http statistics
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40031
diff
changeset
|
649 opener.requestscount = 0 |
393e44324037
httppeer: report http statistics
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40031
diff
changeset
|
650 opener.sentbytescount = 0 |
393e44324037
httppeer: report http statistics
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40031
diff
changeset
|
651 opener.receivedbytescount = 0 |
393e44324037
httppeer: report http statistics
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40031
diff
changeset
|
652 |
29589
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
653 # The user agent should should *NOT* be used by servers for e.g. |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
654 # protocol detection or feature negotiation: there are other |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
655 # facilities for that. |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
656 # |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
657 # "mercurial/proto-1.0" was the original user agent string and |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
658 # exists for backwards compatibility reasons. |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
659 # |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
660 # The "(Mercurial %s)" string contains the distribution |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
661 # name and version. Other client implementations should choose their |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
662 # own distribution name. Since servers should not be using the user |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
663 # agent string for anything, clients should be able to define whatever |
486de14eb394
url: add distribution and version to user-agent request header (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29455
diff
changeset
|
664 # user agent they deem appropriate. |
35439
e7bb5fc4570c
lfs: add git to the User-Agent header for blob transfers
Matt Harbison <matt_harbison@yahoo.com>
parents:
34694
diff
changeset
|
665 # |
e7bb5fc4570c
lfs: add git to the User-Agent header for blob transfers
Matt Harbison <matt_harbison@yahoo.com>
parents:
34694
diff
changeset
|
666 # The custom user agent is for lfs, because unfortunately some servers |
e7bb5fc4570c
lfs: add git to the User-Agent header for blob transfers
Matt Harbison <matt_harbison@yahoo.com>
parents:
34694
diff
changeset
|
667 # do look at this value. |
e7bb5fc4570c
lfs: add git to the User-Agent header for blob transfers
Matt Harbison <matt_harbison@yahoo.com>
parents:
34694
diff
changeset
|
668 if not useragent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
669 agent = b'mercurial/proto-1.0 (Mercurial %s)' % util.version() |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
670 opener.addheaders = [('User-agent', pycompat.sysstr(agent))] |
35439
e7bb5fc4570c
lfs: add git to the User-Agent header for blob transfers
Matt Harbison <matt_harbison@yahoo.com>
parents:
34694
diff
changeset
|
671 else: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
672 opener.addheaders = [('User-agent', pycompat.sysstr(useragent))] |
30763
a520aefb96f1
httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30664
diff
changeset
|
673 |
a520aefb96f1
httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30664
diff
changeset
|
674 # This header should only be needed by wire protocol requests. But it has |
a520aefb96f1
httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30664
diff
changeset
|
675 # been sent on all requests since forever. We keep sending it for backwards |
a520aefb96f1
httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30664
diff
changeset
|
676 # compatibility reasons. Modern versions of the wire protocol use |
a520aefb96f1
httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30664
diff
changeset
|
677 # X-HgProto-<N> for advertising client support. |
37045
a708e1e4d7a8
url: support suppressing Accept header
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37011
diff
changeset
|
678 if sendaccept: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
679 opener.addheaders.append(('Accept', 'application/mercurial-0.1')) |
37045
a708e1e4d7a8
url: support suppressing Accept header
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37011
diff
changeset
|
680 |
7270
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
681 return opener |
2db33c1a5654
factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff
changeset
|
682 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
683 |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
684 def open(ui, url_, data=None, sendaccept=True, digest=None): |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46819
diff
changeset
|
685 u = urlutil.url(url_) |
13818
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
686 if u.scheme: |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
687 u.scheme = u.scheme.lower() |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
688 url_, authinfo = u.authinfo() |
bf6156bab41b
url: use url.url in url.open()
Brodie Rao <brodie@bitheap.org>
parents:
13817
diff
changeset
|
689 else: |
47630
8e5192e41e0b
windows: use abspath in url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
690 path = util.normpath(util.abspath(url_)) |
44641
e74af49aa3c9
url: pass str to pathname2url
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44452
diff
changeset
|
691 url_ = b'file://' + pycompat.bytesurl( |
e74af49aa3c9
url: pass str to pathname2url
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44452
diff
changeset
|
692 urlreq.pathname2url(pycompat.fsdecode(path)) |
e74af49aa3c9
url: pass str to pathname2url
Gregory Szorc <gregory.szorc@gmail.com>
parents:
44452
diff
changeset
|
693 ) |
7284
ac81ffac0f35
url: fix file:// URL handling
Patrick Mezard <pmezard@gmail.com>
parents:
7270
diff
changeset
|
694 authinfo = None |
51982
aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
Joerg Sonnenberger <joerg@bec.de>
parents:
51863
diff
changeset
|
695 return opener(ui, authinfo, sendaccept=sendaccept, digest=digest).open( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
696 pycompat.strurl(url_), data |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
697 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
698 |
40018
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
699 |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
700 def wrapresponse(resp): |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
701 """Wrap a response object with common error handlers. |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
702 |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
703 This ensures that any I/O from any consumer raises the appropriate |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
704 error and messaging. |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
705 """ |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
706 origread = resp.read |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
707 |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
708 class readerproxy(resp.__class__): |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
709 def read(self, size=None): |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
710 try: |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
711 return origread(size) |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
712 except httplib.IncompleteRead as e: |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
713 # e.expected is an integer if length known or None otherwise. |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
714 if e.expected: |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
715 got = len(e.partial) |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
716 total = e.expected + got |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
717 msg = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
718 b'HTTP request error (incomplete response; ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
719 b'expected %d bytes got %d)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
720 ) % (total, got) |
40018
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
721 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
722 msg = _(b'HTTP request error (incomplete response)') |
40018
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
723 |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
724 raise error.PeerTransportError( |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
725 msg, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
726 hint=_( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
727 b'this may be an intermittent network failure; ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
728 b'if the error persists, consider contacting the ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
729 b'network or server operator' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
730 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
731 ) |
40018
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
732 except httplib.HTTPException as e: |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
733 raise error.PeerTransportError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
734 _(b'HTTP request error (%s)') % e, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
735 hint=_( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
736 b'this may be an intermittent network failure; ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
737 b'if the error persists, consider contacting the ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
738 b'network or server operator' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
739 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42109
diff
changeset
|
740 ) |
40018
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
741 |
f80db6adabbe
url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37735
diff
changeset
|
742 resp.__class__ = readerproxy |