annotate mercurial/httppeer.py @ 47387:75e1104f23a2

revlog: use dedicated code for reading sidedata We are about to introduce a new, dedicated, file to store sidedata. Before doing so, we make sidedata reading go through different code as reading data chunk. This will simplify some of the complexity of the next changesets. The reading is very simple right now and will need some improvement later to reuse some of the caching strategy we use for the data file. Differential Revision: https://phab.mercurial-scm.org/D10785
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 27 May 2021 04:09:30 +0200
parents ffd3e823a7e5
children 04688c51f81f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 15246
diff changeset
1 # httppeer.py - HTTP repository proxy classes for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46480
diff changeset
3 # Copyright 2005, 2006 Olivia Mackall <olivia@selenic.com>
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2740
diff changeset
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9878
diff changeset
7 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
8
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
9 from __future__ import absolute_import
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
10
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
11 import errno
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
12 import io
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
13 import os
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
14 import socket
30763
a520aefb96f1 httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30759
diff changeset
15 import struct
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
16 import weakref
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
17
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
18 from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
19 from .pycompat import getattr
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
20 from . import (
28666
ae53ecc47414 bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 28530
diff changeset
21 bundle2,
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
22 error,
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
23 httpconnection,
30924
48dea083f66d py3: convert the mode argument of os.fdopen to unicodes (1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30763
diff changeset
24 pycompat,
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
25 statichttprepo,
36959
43815d87c6aa httppeer: alias url as urlmod
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36835
diff changeset
26 url as urlmod,
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
27 util,
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
28 wireprotoframing,
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
29 wireprototypes,
37614
a81d02ea65db wireproto: move version 1 peer functionality to standalone module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37611
diff changeset
30 wireprotov1peer,
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
31 wireprotov2peer,
37545
93397c4633f6 wireproto: extract HTTP version 2 code to own module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37544
diff changeset
32 wireprotov2server,
25954
7bbdb78d2842 httppeer: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
33 )
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
34 from .interfaces import (
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
35 repository,
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
36 util as interfaceutil,
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
37 )
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37738
diff changeset
38 from .utils import (
39445
cdb56f295b03 httppeer: use our CBOR decoder
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39437
diff changeset
39 cborutil,
39436
3fe028b657bf httppeer: log commands for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38783
diff changeset
40 stringutil,
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
41 urlutil,
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37738
diff changeset
42 )
4678
a814a5b11fff Work around urllib2 digest auth bug with Python < 2.5
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4633
diff changeset
43
29455
0c741fd6158a py3: conditionalize httplib import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29241
diff changeset
44 httplib = util.httplib
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28666
diff changeset
45 urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28666
diff changeset
46 urlreq = util.urlreq
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28666
diff changeset
47
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
48
30759
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
49 def encodevalueinheaders(value, header, limit):
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
50 """Encode a string value into multiple HTTP headers.
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
51
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
52 ``value`` will be encoded into 1 or more HTTP headers with the names
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
53 ``header-<N>`` where ``<N>`` is an integer starting at 1. Each header
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
54 name + value will be at most ``limit`` bytes long.
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
55
34732
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
56 Returns an iterable of 2-tuples consisting of header names and
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
57 values as native strings.
30759
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
58 """
34732
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
59 # HTTP Headers are ASCII. Python 3 requires them to be unicodes,
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
60 # not bytes. This function always takes bytes in as arguments.
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
61 fmt = pycompat.strurl(header) + r'-%s'
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
62 # Note: it is *NOT* a bug that the last bit here is a bytestring
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
63 # and not a unicode: we're just getting the encoded length anyway,
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
64 # and using an r-string to make it portable between Python 2 and 3
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
65 # doesn't work because then the \r is a literal backslash-r
67e9678efd98 httppeer: always produce native str header keys and values
Augie Fackler <augie@google.com>
parents: 34725
diff changeset
66 # instead of a carriage return.
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
67 valuelen = limit - len(fmt % '000') - len(b': \r\n')
30759
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
68 result = []
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
69
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
70 n = 0
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38502
diff changeset
71 for i in pycompat.xrange(0, len(value), valuelen):
30759
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
72 n += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
73 result.append((fmt % str(n), pycompat.strurl(value[i : i + valuelen])))
30759
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
74
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
75 return result
3f5f0c98cd18 httppeer: extract code for HTTP header spanning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30564
diff changeset
76
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
77
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
78 class _multifile(object):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
79 def __init__(self, *fileobjs):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
80 for f in fileobjs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
81 if not util.safehasattr(f, b'length'):
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
82 raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
83 b'_multifile only supports file objects that '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
84 b'have a length but this one does not:',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
85 type(f),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
86 f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
87 )
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
88 self._fileobjs = fileobjs
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
89 self._index = 0
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
90
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
91 @property
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
92 def length(self):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
93 return sum(f.length for f in self._fileobjs)
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
94
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
95 def read(self, amt=None):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
96 if amt <= 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
97 return b''.join(f.read() for f in self._fileobjs)
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
98 parts = []
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
99 while amt and self._index < len(self._fileobjs):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
100 parts.append(self._fileobjs[self._index].read(amt))
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
101 got = len(parts[-1])
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
102 if got < amt:
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
103 self._index += 1
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
104 amt -= got
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
105 return b''.join(parts)
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
106
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
107 def seek(self, offset, whence=os.SEEK_SET):
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
108 if whence != os.SEEK_SET:
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
109 raise NotImplementedError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 b'_multifile does not support anything other'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
111 b' than os.SEEK_SET for whence on seek()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
112 )
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
113 if offset != 0:
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
114 raise NotImplementedError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
115 b'_multifile only supports seeking to start, but that '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 b'could be fixed if you need it'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
117 )
33821
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
118 for f in self._fileobjs:
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
119 f.seek(0)
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
120 self._index = 0
3c91cc0c5fde httppeer: add support for httppostargs when we're sending a file
Augie Fackler <augie@google.com>
parents: 33806
diff changeset
121
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
122
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
123 def makev1commandrequest(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
124 ui, requestbuilder, caps, capablefn, repobaseurl, cmd, args
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
125 ):
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
126 """Make an HTTP request to run a command for a version 1 client.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
127
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
128 ``caps`` is a set of known server capabilities. The value may be
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
129 None if capabilities are not yet known.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
130
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
131 ``capablefn`` is a function to evaluate a capability.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
132
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
133 ``cmd``, ``args``, and ``data`` define the command, its arguments, and
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
134 raw data to pass to it.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
135 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
136 if cmd == b'pushkey':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
137 args[b'data'] = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
138 data = args.pop(b'data', None)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
139 headers = args.pop(b'headers', {})
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
140
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
141 ui.debug(b"sending %s command\n" % cmd)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
142 q = [(b'cmd', cmd)]
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
143 headersize = 0
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
144 # Important: don't use self.capable() here or else you end up
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
145 # with infinite recursion when trying to look up capabilities
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
146 # for the first time.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
147 postargsok = caps is not None and b'httppostargs' in caps
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
148
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
149 # Send arguments via POST.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
150 if postargsok and args:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
151 strargs = urlreq.urlencode(sorted(args.items()))
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
152 if not data:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
153 data = strargs
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
154 else:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
155 if isinstance(data, bytes):
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
156 i = io.BytesIO(data)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
157 i.length = len(data)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
158 data = i
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
159 argsio = io.BytesIO(strargs)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
160 argsio.length = len(strargs)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
161 data = _multifile(argsio, data)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
162 headers['X-HgArgs-Post'] = len(strargs)
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
163 elif args:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
164 # Calling self.capable() can infinite loop if we are calling
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
165 # "capabilities". But that command should never accept wire
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
166 # protocol arguments. So this should never happen.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
167 assert cmd != b'capabilities'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
168 httpheader = capablefn(b'httpheader')
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
169 if httpheader:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
170 headersize = int(httpheader.split(b',', 1)[0])
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
171
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
172 # Send arguments via HTTP headers.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
173 if headersize > 0:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
174 # The headers can typically carry more data than the URL.
46480
05dd091dfa6a wireprotopeer: clarify some variable names now that we allow snake_case
Martin von Zweigbergk <martinvonz@google.com>
parents: 46053
diff changeset
175 encoded_args = urlreq.urlencode(sorted(args.items()))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
176 for header, value in encodevalueinheaders(
46480
05dd091dfa6a wireprotopeer: clarify some variable names now that we allow snake_case
Martin von Zweigbergk <martinvonz@google.com>
parents: 46053
diff changeset
177 encoded_args, b'X-HgArg', headersize
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
178 ):
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
179 headers[header] = value
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
180 # Send arguments via query string (Mercurial <1.9).
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
181 else:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
182 q += sorted(args.items())
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
183
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
184 qs = b'?%s' % urlreq.urlencode(q)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
185 cu = b"%s%s" % (repobaseurl, qs)
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
186 size = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
187 if util.safehasattr(data, b'length'):
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
188 size = data.length
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
189 elif data is not None:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
190 size = len(data)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
191 if data is not None and 'Content-Type' not in headers:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
192 headers['Content-Type'] = 'application/mercurial-0.1'
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
193
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
194 # Tell the server we accept application/mercurial-0.2 and multiple
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
195 # compression formats if the server is capable of emitting those
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
196 # payloads.
37556
b77aa48ba690 httppeer: only advertise partial-pull if capabilities are known
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37555
diff changeset
197 # Note: Keep this set empty by default, as client advertisement of
b77aa48ba690 httppeer: only advertise partial-pull if capabilities are known
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37555
diff changeset
198 # protocol parameters should only occur after the handshake.
b77aa48ba690 httppeer: only advertise partial-pull if capabilities are known
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37555
diff changeset
199 protoparams = set()
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
200
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
201 mediatypes = set()
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
202 if caps is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
203 mt = capablefn(b'httpmediatype')
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
204 if mt:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
205 protoparams.add(b'0.1')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 mediatypes = set(mt.split(b','))
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
207
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
208 protoparams.add(b'partial-pull')
37556
b77aa48ba690 httppeer: only advertise partial-pull if capabilities are known
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37555
diff changeset
209
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
210 if b'0.2tx' in mediatypes:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
211 protoparams.add(b'0.2')
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
212
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
213 if b'0.2tx' in mediatypes and capablefn(b'compression'):
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
214 # We /could/ compare supported compression formats and prune
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
215 # non-mutually supported or error if nothing is mutually supported.
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
216 # For now, send the full list to the server and have it error.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
217 comps = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
218 e.wireprotosupport().name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
219 for e in util.compengines.supportedwireengines(util.CLIENTROLE)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
220 ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
221 protoparams.add(b'comp=%s' % b','.join(comps))
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
222
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
223 if protoparams:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
224 protoheaders = encodevalueinheaders(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
225 b' '.join(sorted(protoparams)), b'X-HgProto', headersize or 1024
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
226 )
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
227 for header, value in protoheaders:
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
228 headers[header] = value
37555
930c433eb311 httppeer: always add x-hg* headers to Vary header
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37554
diff changeset
229
930c433eb311 httppeer: always add x-hg* headers to Vary header
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37554
diff changeset
230 varyheaders = []
930c433eb311 httppeer: always add x-hg* headers to Vary header
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37554
diff changeset
231 for header in headers:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
232 if header.lower().startswith('x-hg'):
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
233 varyheaders.append(header)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
234
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
235 if varyheaders:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
236 headers['Vary'] = ','.join(sorted(varyheaders))
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
237
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
238 req = requestbuilder(pycompat.strurl(cu), data, headers)
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
239
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
240 if data is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 ui.debug(b"sending %d bytes\n" % size)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
242 req.add_unredirected_header('Content-Length', '%d' % size)
37549
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
243
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
244 return req, cu, qs
66d1001e1500 httppeer: extract code for creating a request into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37548
diff changeset
245
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
246
37738
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
247 def _reqdata(req):
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
248 """Get request data, if any. If no data, returns None."""
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
249 if pycompat.ispy3:
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
250 return req.data
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
251 if not req.has_data():
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
252 return None
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
253 return req.get_data()
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
255
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
256 def sendrequest(ui, opener, req):
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
257 """Send a prepared HTTP request.
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
258
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
259 Returns the response object.
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
260 """
38033
13b2812cff2b httppeer: declare 'dbg' at the function level
Boris Feld <boris.feld@octobus.net>
parents: 38032
diff changeset
261 dbg = ui.debug
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
262 if ui.debugflag and ui.configbool(b'devel', b'debug.peer-request'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
263 line = b'devel-peer-request: %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
264 dbg(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
265 line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
266 % b'%s %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
267 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
268 pycompat.bytesurl(req.get_method()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
269 pycompat.bytesurl(req.get_full_url()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
270 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
271 )
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
272 hgargssize = None
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
273
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
274 for header, value in sorted(req.header_items()):
37737
6cb7e3b91883 httppeer: no matter what Python 3 might think, http headers are bytes
Augie Fackler <augie@google.com>
parents: 37736
diff changeset
275 header = pycompat.bytesurl(header)
6cb7e3b91883 httppeer: no matter what Python 3 might think, http headers are bytes
Augie Fackler <augie@google.com>
parents: 37736
diff changeset
276 value = pycompat.bytesurl(value)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
277 if header.startswith(b'X-hgarg-'):
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
278 if hgargssize is None:
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
279 hgargssize = 0
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
280 hgargssize += len(value)
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
281 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
282 dbg(line % b' %s %s' % (header, value))
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
283
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
284 if hgargssize is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
285 dbg(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
286 line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
287 % b' %d bytes of commands arguments in headers'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
288 % hgargssize
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
289 )
37738
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
290 data = _reqdata(req)
a1f785148097 httppeer: work around API differences on urllib Request objects
Augie Fackler <augie@google.com>
parents: 37737
diff changeset
291 if data is not None:
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
292 length = getattr(data, 'length', None)
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
293 if length is None:
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
294 length = len(data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
295 dbg(line % b' %d bytes of data' % length)
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
296
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
297 start = util.timer()
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
298
38502
2279d90eed9a httppeer: fix use of uninitialized variable with devel logging
Martin von Zweigbergk <martinvonz@google.com>
parents: 38239
diff changeset
299 res = None
37550
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
300 try:
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
301 res = opener.open(req)
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
302 except urlerr.httperror as inst:
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
303 if inst.code == 401:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
304 raise error.Abort(_(b'authorization failed'))
37550
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
305 raise
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
306 except httplib.HTTPException as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
307 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
308 b'http error requesting %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
309 % urlutil.hidepassword(req.get_full_url())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
310 )
37550
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
311 ui.traceback()
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
312 raise IOError(None, inst)
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
313 finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
314 if ui.debugflag and ui.configbool(b'devel', b'debug.peer-request'):
38502
2279d90eed9a httppeer: fix use of uninitialized variable with devel logging
Martin von Zweigbergk <martinvonz@google.com>
parents: 38239
diff changeset
315 code = res.code if res else -1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
316 dbg(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
317 line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
318 % b' finished in %.4f seconds (%d)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
319 % (util.timer() - start, code)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
320 )
37550
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
321
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
322 # Insert error handlers for common I/O failures.
40018
f80db6adabbe url: move _wraphttpresponse() from httpeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39630
diff changeset
323 urlmod.wrapresponse(res)
37548
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
324
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
325 return res
8e7a4435ab6d httppeer: extract code for performing an HTTP request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37547
diff changeset
326
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
327
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
328 class RedirectedRepoError(error.RepoError):
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
329 def __init__(self, msg, respurl):
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
330 super(RedirectedRepoError, self).__init__(msg)
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
331 self.respurl = respurl
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
332
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
333
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
334 def parsev1commandresponse(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
335 ui, baseurl, requrl, qs, resp, compressible, allowcbor=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
336 ):
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
337 # record the url we got redirected to
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
338 redirected = False
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
339 respurl = pycompat.bytesurl(resp.geturl())
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
340 if respurl.endswith(qs):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
341 respurl = respurl[: -len(qs)]
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
342 qsdropped = False
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
343 else:
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
344 qsdropped = True
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
345
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
346 if baseurl.rstrip(b'/') != respurl.rstrip(b'/'):
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
347 redirected = True
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
348 if not ui.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
349 ui.warn(_(b'real URL is %s\n') % respurl)
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
350
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
351 try:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
352 proto = pycompat.bytesurl(resp.getheader('content-type', ''))
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
353 except AttributeError:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
354 proto = pycompat.bytesurl(resp.headers.get('content-type', ''))
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
355
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
356 safeurl = urlutil.hidepassword(baseurl)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
357 if proto.startswith(b'application/hg-error'):
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
358 raise error.OutOfBandError(resp.read())
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
359
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
360 # Pre 1.0 versions of Mercurial used text/plain and
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
361 # application/hg-changegroup. We don't support such old servers.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
362 if not proto.startswith(b'application/mercurial-'):
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
363 ui.debug(b"requested URL: '%s'\n" % urlutil.hidepassword(requrl))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
364 msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
365 b"'%s' does not appear to be an hg repository:\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 b"---%%<--- (%s)\n%s\n---%%<---\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
367 ) % (safeurl, proto or b'no content-type', resp.read(1024))
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
368
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
369 # Some servers may strip the query string from the redirect. We
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
370 # raise a special error type so callers can react to this specially.
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
371 if redirected and qsdropped:
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
372 raise RedirectedRepoError(msg, respurl)
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
373 else:
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
374 raise error.RepoError(msg)
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
375
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
376 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
377 subtype = proto.split(b'-', 1)[1]
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
378
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
379 # Unless we end up supporting CBOR in the legacy wire protocol,
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
380 # this should ONLY be encountered for the initial capabilities
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
381 # request during handshake.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
382 if subtype == b'cbor':
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
383 if allowcbor:
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
384 return respurl, proto, resp
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
385 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
386 raise error.RepoError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
387 _(b'unexpected CBOR response from server')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
388 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
389
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
390 version_info = tuple([int(n) for n in subtype.split(b'.')])
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
391 except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
392 raise error.RepoError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
393 _(b"'%s' sent a broken Content-Type header (%s)") % (safeurl, proto)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
394 )
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
395
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
396 # TODO consider switching to a decompression reader that uses
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
397 # generators.
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
398 if version_info == (0, 1):
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
399 if compressible:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
400 resp = util.compengines[b'zlib'].decompressorreader(resp)
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
401
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
402 elif version_info == (0, 2):
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
403 # application/mercurial-0.2 always identifies the compression
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
404 # engine in the payload header.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
405 elen = struct.unpack(b'B', util.readexactly(resp, 1))[0]
39484
98995b689e03 httppeer: use util.readexactly() to abort on incomplete responses
Anton Shestakov <av6@dwimlabs.net>
parents: 39483
diff changeset
406 ename = util.readexactly(resp, elen)
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
407 engine = util.compengines.forwiretype(ename)
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
408
37554
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
409 resp = engine.decompressorreader(resp)
301a1d2e8016 httppeer: don't accept very old media types (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37553
diff changeset
410 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
411 raise error.RepoError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 _(b"'%s' uses newer protocol %s") % (safeurl, subtype)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
413 )
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
414
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
415 return respurl, proto, resp
37551
946eb204ba67 httppeer: extract common response handling into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37550
diff changeset
416
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
417
37614
a81d02ea65db wireproto: move version 1 peer functionality to standalone module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37611
diff changeset
418 class httppeer(wireprotov1peer.wirepeer):
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
419 def __init__(self, ui, path, url, opener, requestbuilder, caps):
37321
e826fe7a08c7 peer: make ui an attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37320
diff changeset
420 self.ui = ui
33705
73fd395ee29e httppeer: make several instance attributes internal (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33704
diff changeset
421 self._path = path
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
422 self._url = url
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
423 self._caps = caps
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
424 self.limitedarguments = caps is not None and b'httppostargs' not in caps
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
425 self._urlopener = opener
37547
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
426 self._requestbuilder = requestbuilder
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4369
diff changeset
427
7752
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
428 def __del__(self):
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
429 for h in self._urlopener.handlers:
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
430 h.close()
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
431 getattr(h, "close_all", lambda: None)()
7752
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
432
37320
39f7d4ee8bcd repository: port peer interfaces to zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37006
diff changeset
433 # Begin of ipeerconnection interface.
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
434
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
435 def url(self):
33705
73fd395ee29e httppeer: make several instance attributes internal (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33704
diff changeset
436 return self._path
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
437
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
438 def local(self):
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
439 return None
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
440
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
441 def peer(self):
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
442 return self
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
443
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
444 def canpush(self):
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
445 return True
2442
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
446
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
447 def close(self):
40426
588f1e9a4d16 http: work around custom http client classes that refuse extra attrs
Augie Fackler <augie@google.com>
parents: 40171
diff changeset
448 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
449 reqs, sent, recv = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
450 self._urlopener.requestscount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
451 self._urlopener.sentbytescount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
452 self._urlopener.receivedbytescount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
453 )
40426
588f1e9a4d16 http: work around custom http client classes that refuse extra attrs
Augie Fackler <augie@google.com>
parents: 40171
diff changeset
454 except AttributeError:
588f1e9a4d16 http: work around custom http client classes that refuse extra attrs
Augie Fackler <augie@google.com>
parents: 40171
diff changeset
455 return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
456 self.ui.note(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
457 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
458 b'(sent %d HTTP requests and %d bytes; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
459 b'received %d bytes in responses)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
460 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
461 % (reqs, sent, recv)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
462 )
13603
395a84f78736 httprepo: use caps instead of between for compat check
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13555
diff changeset
463
37320
39f7d4ee8bcd repository: port peer interfaces to zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37006
diff changeset
464 # End of ipeerconnection interface.
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
465
37320
39f7d4ee8bcd repository: port peer interfaces to zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37006
diff changeset
466 # Begin of ipeercommands interface.
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
467
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
468 def capabilities(self):
33705
73fd395ee29e httppeer: make several instance attributes internal (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33704
diff changeset
469 return self._caps
2442
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
470
37320
39f7d4ee8bcd repository: port peer interfaces to zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37006
diff changeset
471 # End of ipeercommands interface.
33805
f913e90f15a0 httppeer: use peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33705
diff changeset
472
30464
e16e234b9ca3 httppeer: do decompression inside _callstream
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30241
diff changeset
473 def _callstream(self, cmd, _compressible=False, **args):
35359
98bc4c43f570 py3: handle keyword arguments correctly in httppeer.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35197
diff changeset
474 args = pycompat.byteskwargs(args)
36218
e4ccd7a69f77 httppeer: change logic around argument handling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35884
diff changeset
475
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
476 req, cu, qs = makev1commandrequest(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
477 self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
478 self._requestbuilder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
479 self._caps,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
480 self.capable,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
481 self._url,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
482 cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
483 args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
484 )
30763
a520aefb96f1 httppeer: advertise and support application/mercurial-0.2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30759
diff changeset
485
37550
b5862ee01abe httppeer: move error handling and response wrapping into sendrequest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37549
diff changeset
486 resp = sendrequest(self.ui, self._urlopener, req)
32002
bf855efe5664 httppeer: wrap HTTPResponse.read() globally
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30924
diff changeset
487
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
488 self._url, ct, resp = parsev1commandresponse(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
489 self.ui, self._url, cu, qs, resp, _compressible
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
490 )
30464
e16e234b9ca3 httppeer: do decompression inside _callstream
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30241
diff changeset
491
752
c693eafd5967 Simplify content type checking
mpm@selenic.com
parents: 751
diff changeset
492 return resp
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
493
11589
e8d22fe2ddab protocol: clean up call-like functions in http and ssh clients
Matt Mackall <mpm@selenic.com>
parents: 11588
diff changeset
494 def _call(self, cmd, **args):
e8d22fe2ddab protocol: clean up call-like functions in http and ssh clients
Matt Mackall <mpm@selenic.com>
parents: 11588
diff changeset
495 fp = self._callstream(cmd, **args)
2435
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
496 try:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
497 return fp.read()
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
498 finally:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
499 # if using keepalive, allow connection to be reused
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
500 fp.close()
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
501
11592
26e0782b8380 protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents: 11591
diff changeset
502 def _callpush(self, cmd, cg, **args):
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
503 # have to stream bundle to a temp file because we do not have
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
504 # http 1.1 chunked transfer.
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
505
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
506 types = self.capable(b'unbundle')
3703
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
507 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
508 types = types.split(b',')
3703
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
509 except AttributeError:
14060
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
510 # servers older than d1b16a746db6 will send 'unbundle' as a
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
511 # boolean capability. They only support headerless/uncompressed
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
512 # bundles.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
513 types = [b""]
14060
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
514 for x in types:
28666
ae53ecc47414 bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 28530
diff changeset
515 if x in bundle2.bundletypes:
14060
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
516 type = x
aaa9a5989405 bundle: more comments about the different header types, remove useless if
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13819
diff changeset
517 break
3613
cbf352b9a3cd Client support for hgweb unbundle with versions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3609
diff changeset
518
28666
ae53ecc47414 bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 28530
diff changeset
519 tempname = bundle2.writebundle(self.ui, cg, None, type)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
520 fp = httpconnection.httpsendfile(self.ui, tempname, b"rb")
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
521 headers = {'Content-Type': 'application/mercurial-0.1'}
11592
26e0782b8380 protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents: 11591
diff changeset
522
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
523 try:
25085
e05734cd7902 httppeer: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 23895
diff changeset
524 r = self._call(cmd, data=fp, headers=headers, **args)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
525 vals = r.split(b'\n', 1)
25085
e05734cd7902 httppeer: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 23895
diff changeset
526 if len(vals) < 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
527 raise error.ResponseError(_(b"unexpected response:"), r)
25085
e05734cd7902 httppeer: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 23895
diff changeset
528 return vals
36430
efebfa9b4cab httppeer: explicitly catch urlerr.httperror and re-raise
Augie Fackler <augie@google.com>
parents: 36426
diff changeset
529 except urlerr.httperror:
efebfa9b4cab httppeer: explicitly catch urlerr.httperror and re-raise
Augie Fackler <augie@google.com>
parents: 36426
diff changeset
530 # Catch and re-raise these so we don't try and treat them
efebfa9b4cab httppeer: explicitly catch urlerr.httperror and re-raise
Augie Fackler <augie@google.com>
parents: 36426
diff changeset
531 # like generic socket errors. They lack any values in
efebfa9b4cab httppeer: explicitly catch urlerr.httperror and re-raise
Augie Fackler <augie@google.com>
parents: 36426
diff changeset
532 # .args on Python 3 which breaks our socket.error block.
efebfa9b4cab httppeer: explicitly catch urlerr.httperror and re-raise
Augie Fackler <augie@google.com>
parents: 36426
diff changeset
533 raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25500
diff changeset
534 except socket.error as err:
25085
e05734cd7902 httppeer: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 23895
diff changeset
535 if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
536 raise error.Abort(_(b'push failed: %s') % err.args[1])
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25954
diff changeset
537 raise error.Abort(err.args[1])
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
538 finally:
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
539 fp.close()
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
540 os.unlink(tempname)
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2435
diff changeset
541
21074
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
542 def _calltwowaystream(self, cmd, fp, **args):
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
543 filename = None
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
544 try:
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
545 # dump bundle to disk
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
546 fd, filename = pycompat.mkstemp(prefix=b"hg-bundle-", suffix=b".hg")
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
547 with os.fdopen(fd, "wb") as fh:
21074
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
548 d = fp.read(4096)
42852
58f73e9ccfff httppeer: use context manager when writing temporary bundle to send
Martin von Zweigbergk <martinvonz@google.com>
parents: 42814
diff changeset
549 while d:
58f73e9ccfff httppeer: use context manager when writing temporary bundle to send
Martin von Zweigbergk <martinvonz@google.com>
parents: 42814
diff changeset
550 fh.write(d)
58f73e9ccfff httppeer: use context manager when writing temporary bundle to send
Martin von Zweigbergk <martinvonz@google.com>
parents: 42814
diff changeset
551 d = fp.read(4096)
21074
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
552 # start http push
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
553 with httpconnection.httpsendfile(self.ui, filename, b"rb") as fp_:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
554 headers = {'Content-Type': 'application/mercurial-0.1'}
42853
37debb6771f5 httppeer: use context manager when reading temporary bundle to send
Martin von Zweigbergk <martinvonz@google.com>
parents: 42852
diff changeset
555 return self._callstream(cmd, data=fp_, headers=headers, **args)
21074
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
556 finally:
42852
58f73e9ccfff httppeer: use context manager when writing temporary bundle to send
Martin von Zweigbergk <martinvonz@google.com>
parents: 42814
diff changeset
557 if filename is not None:
21074
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
558 os.unlink(filename)
f8a0d82b0463 httppeer: support for _calltwowaystream
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20905
diff changeset
559
20905
167047ba3cfa wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 18742
diff changeset
560 def _callcompressable(self, cmd, **args):
30464
e16e234b9ca3 httppeer: do decompression inside _callstream
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30241
diff changeset
561 return self._callstream(cmd, _compressible=True, **args)
11370
db3f6f0e4e7d pushkey: add http support
Matt Mackall <mpm@selenic.com>
parents: 11153
diff changeset
562
21188
d36440d84328 httppeer: reintroduce _abort that accidentally was removed in 167047ba3cfa
Mads Kiilerich <madski@unity3d.com>
parents: 21074
diff changeset
563 def _abort(self, exception):
d36440d84328 httppeer: reintroduce _abort that accidentally was removed in 167047ba3cfa
Mads Kiilerich <madski@unity3d.com>
parents: 21074
diff changeset
564 raise exception
d36440d84328 httppeer: reintroduce _abort that accidentally was removed in 167047ba3cfa
Mads Kiilerich <madski@unity3d.com>
parents: 21074
diff changeset
565
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
566
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
567 def sendv2request(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
568 ui, opener, requestbuilder, apiurl, permission, requests, redirect
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
569 ):
40133
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
570 wireprotoframing.populatestreamencoders()
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
571
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
572 uiencoders = ui.configlist(b'experimental', b'httppeer.v2-encoder-order')
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
573
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
574 if uiencoders:
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
575 encoders = []
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
576
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
577 for encoder in uiencoders:
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
578 if encoder not in wireprotoframing.STREAM_ENCODERS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
579 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
580 _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
581 b'wire protocol version 2 encoder referenced in '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
582 b'config (%s) is not known; ignoring\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
583 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
584 % encoder
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
585 )
40133
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
586 else:
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
587 encoders.append(encoder)
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
588
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
589 else:
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
590 encoders = wireprotoframing.STREAM_ENCODERS_ORDER
762ef19a07e3 wireprotov2: send protocol settings frame from client
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40129
diff changeset
591
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
592 reactor = wireprotoframing.clientreactor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
593 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
594 hasmultiplesend=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
595 buffersends=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
596 clientcontentencoders=encoders,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
597 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
598
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
599 handler = wireprotov2peer.clienthandler(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
600 ui, reactor, opener=opener, requestbuilder=requestbuilder
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
601 )
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
602
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
603 url = b'%s/%s' % (apiurl, permission)
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
604
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
605 if len(requests) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
606 url += b'/multirequest'
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
607 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
608 url += b'/%s' % requests[0][0]
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
609
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
610 ui.debug(b'sending %d commands\n' % len(requests))
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
611 for command, args, f in requests:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
612 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
613 b'sending command %s: %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
614 % (command, stringutil.pprint(args, indent=2))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
615 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
616 assert not list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
617 handler.callcommand(command, args, f, redirect=redirect)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
618 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
619
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
620 # TODO stream this.
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
621 body = b''.join(map(bytes, handler.flushcommands()))
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
622
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
623 # TODO modify user-agent to reflect v2
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
624 headers = {
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
625 'Accept': wireprotov2server.FRAMINGTYPE,
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
626 'Content-Type': wireprotov2server.FRAMINGTYPE,
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
627 }
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
628
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
629 req = requestbuilder(pycompat.strurl(url), body, headers)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
630 req.add_unredirected_header('Content-Length', '%d' % len(body))
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
631
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
632 try:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
633 res = opener.open(req)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
634 except urlerr.httperror as e:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
635 if e.code == 401:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
636 raise error.Abort(_(b'authorization failed'))
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
637
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
638 raise
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
639 except httplib.HTTPException as e:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
640 ui.traceback()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
641 raise IOError(None, e)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
642
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
643 return handler, res
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
644
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
645
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
646 class queuedcommandfuture(pycompat.futures.Future):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
647 """Wraps result() on command futures to trigger submission on call."""
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
648
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
649 def result(self, timeout=None):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
650 if self.done():
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
651 return pycompat.futures.Future.result(self, timeout)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
652
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
653 self._peerexecutor.sendcommands()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
654
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
655 # sendcommands() will restore the original __class__ and self.result
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
656 # will resolve to Future.result.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
657 return self.result(timeout)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
658
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
659
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37738
diff changeset
660 @interfaceutil.implementer(repository.ipeercommandexecutor)
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
661 class httpv2executor(object):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
662 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
663 self, ui, opener, requestbuilder, apiurl, descriptor, redirect
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
664 ):
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
665 self._ui = ui
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
666 self._opener = opener
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
667 self._requestbuilder = requestbuilder
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
668 self._apiurl = apiurl
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
669 self._descriptor = descriptor
40024
86b22a4cfab1 wireprotov2: client support for advertising redirect targets
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40019
diff changeset
670 self._redirect = redirect
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
671 self._sent = False
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
672 self._closed = False
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
673 self._neededpermissions = set()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
674 self._calls = []
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
675 self._futures = weakref.WeakSet()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
676 self._responseexecutor = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
677 self._responsef = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
678
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
679 def __enter__(self):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
680 return self
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
681
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
682 def __exit__(self, exctype, excvalue, exctb):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
683 self.close()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
684
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
685 def callcommand(self, command, args):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
686 if self._sent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
687 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
688 b'callcommand() cannot be used after commands are sent'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
689 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
690
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
691 if self._closed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
692 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
693 b'callcommand() cannot be used after close()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
694 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
695
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
696 # The service advertises which commands are available. So if we attempt
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
697 # to call an unknown command or pass an unknown argument, we can screen
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
698 # for this.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
699 if command not in self._descriptor[b'commands']:
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
700 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
701 b'wire protocol command %s is not available' % command
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
702 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
703
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
704 cmdinfo = self._descriptor[b'commands'][command]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
705 unknownargs = set(args.keys()) - set(cmdinfo.get(b'args', {}))
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
706
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
707 if unknownargs:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
708 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
709 b'wire protocol command %s does not accept argument: %s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
710 % (command, b', '.join(sorted(unknownargs)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
711 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
712
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
713 self._neededpermissions |= set(cmdinfo[b'permissions'])
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
714
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
715 # TODO we /could/ also validate types here, since the API descriptor
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
716 # includes types...
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
717
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
718 f = pycompat.futures.Future()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
719
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
720 # Monkeypatch it so result() triggers sendcommands(), otherwise result()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
721 # could deadlock.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
722 f.__class__ = queuedcommandfuture
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
723 f._peerexecutor = self
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
724
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
725 self._futures.add(f)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
726 self._calls.append((command, args, f))
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
727
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
728 return f
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
729
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
730 def sendcommands(self):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
731 if self._sent:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
732 return
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
733
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
734 if not self._calls:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
735 return
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
736
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
737 self._sent = True
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
738
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
739 # Unhack any future types so caller sees a clean type and so we
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
740 # break reference cycle.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
741 for f in self._futures:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
742 if isinstance(f, queuedcommandfuture):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
743 f.__class__ = pycompat.futures.Future
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
744 f._peerexecutor = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
745
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
746 # Mark the future as running and filter out cancelled futures.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
747 calls = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
748 (command, args, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
749 for command, args, f in self._calls
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
750 if f.set_running_or_notify_cancel()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
751 ]
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
752
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
753 # Clear out references, prevent improper object usage.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
754 self._calls = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
755
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
756 if not calls:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
757 return
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
758
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
759 permissions = set(self._neededpermissions)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
760
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
761 if b'push' in permissions and b'pull' in permissions:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
762 permissions.remove(b'pull')
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
763
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
764 if len(permissions) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
765 raise error.RepoError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
766 _(b'cannot make request requiring multiple permissions: %s')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
767 % _(b', ').join(sorted(permissions))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
768 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
769
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
770 permission = {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
771 b'push': b'rw',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
772 b'pull': b'ro',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
773 }[permissions.pop()]
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
774
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
775 handler, resp = sendv2request(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
776 self._ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
777 self._opener,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
778 self._requestbuilder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
779 self._apiurl,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
780 permission,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
781 calls,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
782 self._redirect,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
783 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
784
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
785 # TODO we probably want to validate the HTTP code, media type, etc.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
786
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
787 self._responseexecutor = pycompat.futures.ThreadPoolExecutor(1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
788 self._responsef = self._responseexecutor.submit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
789 self._handleresponse, handler, resp
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
790 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
791
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
792 def close(self):
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
793 if self._closed:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
794 return
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
795
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
796 self.sendcommands()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
797
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
798 self._closed = True
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
799
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
800 if not self._responsef:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
801 return
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
802
39437
3c6f7eebc010 httppeer: add TODO about delayed handling of ^C
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39436
diff changeset
803 # TODO ^C here may not result in immediate program termination.
3c6f7eebc010 httppeer: add TODO about delayed handling of ^C
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39436
diff changeset
804
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
805 try:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
806 self._responsef.result()
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
807 finally:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
808 self._responseexecutor.shutdown(wait=True)
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
809 self._responsef = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
810 self._responseexecutor = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
811
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
812 # If any of our futures are still in progress, mark them as
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
813 # errored, otherwise a result() could wait indefinitely.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
814 for f in self._futures:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
815 if not f.done():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
816 f.set_exception(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
817 error.ResponseError(_(b'unfulfilled command response'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
818 )
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
819
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
820 self._futures = None
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
821
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
822 def _handleresponse(self, handler, resp):
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
823 # Called in a thread to read the response.
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
824
40019
f5a05bb48116 wireprotov2: change name and behavior of readframe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40018
diff changeset
825 while handler.readdata(resp):
37719
a656cba08a04 wireprotov2: move response handling out of httppeer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
826 pass
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
827
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
828
40171
dac438b7346e httppeer: expose API descriptor on httpv2peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40133
diff changeset
829 @interfaceutil.implementer(repository.ipeerv2)
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
830 class httpv2peer(object):
42158
69921d02daaf peer: introduce a limitedarguments attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41315
diff changeset
831
69921d02daaf peer: introduce a limitedarguments attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41315
diff changeset
832 limitedarguments = False
69921d02daaf peer: introduce a limitedarguments attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41315
diff changeset
833
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
834 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
835 self, ui, repourl, apipath, opener, requestbuilder, apidescriptor
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
836 ):
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
837 self.ui = ui
40171
dac438b7346e httppeer: expose API descriptor on httpv2peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40133
diff changeset
838 self.apidescriptor = apidescriptor
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
839
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
840 if repourl.endswith(b'/'):
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
841 repourl = repourl[:-1]
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
842
37609
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
843 self._url = repourl
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
844 self._apipath = apipath
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
845 self._apiurl = b'%s/%s' % (repourl, apipath)
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
846 self._opener = opener
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
847 self._requestbuilder = requestbuilder
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
848
40024
86b22a4cfab1 wireprotov2: client support for advertising redirect targets
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40019
diff changeset
849 self._redirect = wireprotov2peer.supportedredirects(ui, apidescriptor)
86b22a4cfab1 wireprotov2: client support for advertising redirect targets
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40019
diff changeset
850
37609
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
851 # Start of ipeerconnection.
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
852
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
853 def url(self):
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
854 return self._url
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
855
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
856 def local(self):
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
857 return None
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
858
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
859 def peer(self):
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
860 return self
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
861
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
862 def canpush(self):
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
863 # TODO change once implemented.
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
864 return False
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
865
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
866 def close(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
867 self.ui.note(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
868 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
869 b'(sent %d HTTP requests and %d bytes; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
870 b'received %d bytes in responses)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
871 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
872 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
873 self._opener.requestscount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
874 self._opener.sentbytescount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
875 self._opener.receivedbytescount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
876 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
877 )
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
878
37609
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
879 # End of ipeerconnection.
01bfe5ad0c53 httppeer: implement ipeerconnection
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37558
diff changeset
880
37611
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
881 # Start of ipeercapabilities.
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
882
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
883 def capable(self, name):
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
884 # The capabilities used internally historically map to capabilities
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
885 # advertised from the "capabilities" wire protocol command. However,
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
886 # version 2 of that command works differently.
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
887
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
888 # Maps to commands that are available.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
889 if name in (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
890 b'branchmap',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
891 b'getbundle',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
892 b'known',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
893 b'lookup',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
894 b'pushkey',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
895 ):
37611
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
896 return True
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
897
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
898 # Other concepts.
46053
aad81032a128 wireprotov2: re-add tuple around `bundle2` check
Raphaël Gomès <rgomes@octobus.net>
parents: 45942
diff changeset
899 if name in (b'bundle2',):
37611
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
900 return True
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
901
39628
a5de21c9e370 httppeer: expose capabilities for each command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
902 # Alias command-* to presence of command of that name.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
903 if name.startswith(b'command-'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
904 return name[len(b'command-') :] in self.apidescriptor[b'commands']
39628
a5de21c9e370 httppeer: expose capabilities for each command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
905
37611
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
906 return False
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
907
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
908 def requirecap(self, name, purpose):
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
909 if self.capable(name):
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
910 return
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
911
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
912 raise error.CapabilityError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
913 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
914 b'cannot %s; client or remote repository does not support the '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
915 b'\'%s\' capability'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
916 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
917 % (purpose, name)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
918 )
37611
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
919
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
920 # End of ipeercapabilities.
ae8730877371 httppeer: basic implementation of capabilities interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37609
diff changeset
921
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
922 def _call(self, name, **args):
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
923 with self.commandexecutor() as e:
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
924 return e.callcommand(name, args).result()
37543
01361be9e2dc wireproto: introduce a reactor for client-side state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37498
diff changeset
925
37651
950294e28136 httppeer: implement command executor for version 2 peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37644
diff changeset
926 def commandexecutor(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
927 return httpv2executor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
928 self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
929 self._opener,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
930 self._requestbuilder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
931 self._apiurl,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
932 self.apidescriptor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
933 self._redirect,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
934 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
935
37483
61e405fb6372 wireproto: crude support for version 2 HTTP peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37411
diff changeset
936
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
937 # Registry of API service names to metadata about peers that handle it.
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
938 #
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
939 # The following keys are meaningful:
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
940 #
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
941 # init
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
942 # Callable receiving (ui, repourl, servicepath, opener, requestbuilder,
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
943 # apidescriptor) to create a peer.
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
944 #
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
945 # priority
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
946 # Integer priority for the service. If we could choose from multiple
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
947 # services, we choose the one with the highest priority.
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
948 API_PEERS = {
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
949 wireprototypes.HTTP_WIREPROTO_V2: {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
950 b'init': httpv2peer,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
951 b'priority': 50,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
952 },
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
953 }
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
954
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
955
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
956 def performhandshake(ui, url, opener, requestbuilder):
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
957 # The handshake is a request to the capabilities command.
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
958
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
959 caps = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
960
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
961 def capable(x):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
962 raise error.ProgrammingError(b'should not be called')
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
963
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
964 args = {}
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
965
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
966 # The client advertises support for newer protocols by adding an
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
967 # X-HgUpgrade-* header with a list of supported APIs and an
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
968 # X-HgProto-* header advertising which serializing formats it supports.
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
969 # We only support the HTTP version 2 transport and CBOR responses for
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
970 # now.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
971 advertisev2 = ui.configbool(b'experimental', b'httppeer.advertise-v2')
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
972
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
973 if advertisev2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
974 args[b'headers'] = {
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
975 'X-HgProto-1': 'cbor',
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
976 }
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
977
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
978 args[b'headers'].update(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
979 encodevalueinheaders(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
980 b' '.join(sorted(API_PEERS)),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
981 b'X-HgUpgrade',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
982 # We don't know the header limit this early.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
983 # So make it small.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
984 1024,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
985 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
986 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
987
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
988 req, requrl, qs = makev1commandrequest(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
989 ui, requestbuilder, caps, capable, url, b'capabilities', args
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
990 )
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
991 resp = sendrequest(ui, opener, req)
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
992
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
993 # The server may redirect us to the repo root, stripping the
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
994 # ?cmd=capabilities query string from the URL. The server would likely
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
995 # return HTML in this case and ``parsev1commandresponse()`` would raise.
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
996 # We catch this special case and re-issue the capabilities request against
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
997 # the new URL.
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
998 #
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
999 # We should ideally not do this, as a redirect that drops the query
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1000 # string from the URL is arguably a server bug. (Garbage in, garbage out).
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1001 # However, Mercurial clients for several years appeared to handle this
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1002 # issue without behavior degradation. And according to issue 5860, it may
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1003 # be a longstanding bug in some server implementations. So we allow a
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1004 # redirect that drops the query string to "just work."
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1005 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1006 respurl, ct, resp = parsev1commandresponse(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1007 ui, url, requrl, qs, resp, compressible=False, allowcbor=advertisev2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1008 )
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1009 except RedirectedRepoError as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1010 req, requrl, qs = makev1commandrequest(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1011 ui, requestbuilder, caps, capable, e.respurl, b'capabilities', args
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1012 )
37832
6169d95dce3b httppeer: detect redirect to URL without query string (issue5860)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37810
diff changeset
1013 resp = sendrequest(ui, opener, req)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1014 respurl, ct, resp = parsev1commandresponse(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1015 ui, url, requrl, qs, resp, compressible=False, allowcbor=advertisev2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1016 )
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1017
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1018 try:
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1019 rawdata = resp.read()
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1020 finally:
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1021 resp.close()
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1022
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1023 if not ct.startswith(b'application/mercurial-'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1024 raise error.ProgrammingError(b'unexpected content-type: %s' % ct)
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1025
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1026 if advertisev2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1027 if ct == b'application/mercurial-cbor':
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1028 try:
39445
cdb56f295b03 httppeer: use our CBOR decoder
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39437
diff changeset
1029 info = cborutil.decodeall(rawdata)[0]
cdb56f295b03 httppeer: use our CBOR decoder
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39437
diff changeset
1030 except cborutil.CBORDecodeError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1031 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1032 _(b'error decoding CBOR from remote server'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1033 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1034 b'try again and consider contacting '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1035 b'the server operator'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1036 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1037 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1038
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1039 # We got a legacy response. That's fine.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1040 elif ct in (b'application/mercurial-0.1', b'application/mercurial-0.2'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1041 info = {b'v1capabilities': set(rawdata.split())}
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1042
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1043 else:
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1044 raise error.RepoError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1045 _(b'unexpected response type from server: %s') % ct
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1046 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1047 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1048 info = {b'v1capabilities': set(rawdata.split())}
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1049
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1050 return respurl, info
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1051
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1052
37553
6b08cf6b900f httppeer: allow opener to be passed to makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37552
diff changeset
1053 def makepeer(ui, path, opener=None, requestbuilder=urlreq.request):
37547
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
1054 """Construct an appropriate HTTP peer instance.
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
1055
37553
6b08cf6b900f httppeer: allow opener to be passed to makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37552
diff changeset
1056 ``opener`` is an ``url.opener`` that should be used to establish
6b08cf6b900f httppeer: allow opener to be passed to makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37552
diff changeset
1057 connections, perform HTTP requests.
6b08cf6b900f httppeer: allow opener to be passed to makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37552
diff changeset
1058
37547
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
1059 ``requestbuilder`` is the type used for constructing HTTP requests.
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
1060 It exists as an argument so extensions can override the default.
835ccc2a5ef1 httppeer: move requestbuilder defaults into makepeer() argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37546
diff changeset
1061 """
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
1062 u = urlutil.url(path)
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1063 if u.query or u.fragment:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1064 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1065 _(b'unsupported URL component: "%s"') % (u.query or u.fragment)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1066 )
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1067
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1068 # urllib cannot handle URLs with embedded user or passwd.
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1069 url, authinfo = u.authinfo()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1070 ui.debug(b'using %s\n' % url)
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1071
37553
6b08cf6b900f httppeer: allow opener to be passed to makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37552
diff changeset
1072 opener = opener or urlmod.opener(ui, authinfo)
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1073
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1074 respurl, info = performhandshake(ui, url, opener, requestbuilder)
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1075
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1076 # Given the intersection of APIs that both we and the server support,
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1077 # sort by their advertised priority and pick the first one.
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1078 #
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1079 # TODO consider making this request-based and interface driven. For
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1080 # example, the caller could say "I want a peer that does X." It's quite
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1081 # possible that not all peers would do that. Since we know the service
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1082 # capabilities, we could filter out services not meeting the
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1083 # requirements. Possibly by consulting the interfaces defined by the
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1084 # peer type.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1085 apipeerchoices = set(info.get(b'apis', {}).keys()) & set(API_PEERS.keys())
37552
8b8a845c85fc httppeer: perform capabilities request in makepeer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37551
diff changeset
1086
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1087 preferredchoices = sorted(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1088 apipeerchoices, key=lambda x: API_PEERS[x][b'priority'], reverse=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1089 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1090
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1091 for service in preferredchoices:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1092 apipath = b'%s/%s' % (info[b'apibase'].rstrip(b'/'), service)
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1093
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1094 return API_PEERS[service][b'init'](
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1095 ui, respurl, apipath, opener, requestbuilder, info[b'apis'][service]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1096 )
37558
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1097
8a73132214a3 httppeer: support protocol upgrade
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37556
diff changeset
1098 # Failed to construct an API peer. Fall back to legacy.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1099 return httppeer(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1100 ui, path, respurl, opener, requestbuilder, info[b'v1capabilities']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1101 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1102
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1103
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39484
diff changeset
1104 def instance(ui, path, create, intents=None, createopts=None):
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
1105 if create:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1106 raise error.Abort(_(b'cannot create new http repository'))
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
1107 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1108 if path.startswith(b'https:') and not urlmod.has_https:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1109 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43089
diff changeset
1110 _(b'Python support for SSL and HTTPS is not installed')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1111 )
35884
197d10e157ce httppeer: remove support for connecting to <0.9.1 servers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35698
diff changeset
1112
37006
8e89c2bec1f7 httppeer: refactor how httppeer is created (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36961
diff changeset
1113 inst = makepeer(ui, path)
35884
197d10e157ce httppeer: remove support for connecting to <0.9.1 servers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35698
diff changeset
1114
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
1115 return inst
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25500
diff changeset
1116 except error.RepoError as httpexception:
14148
cc9366a3751b httprepo: use the original exception after falling back to static-http failed
Mads Kiilerich <mads@kiilerich.com>
parents: 14094
diff changeset
1117 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1118 r = statichttprepo.instance(ui, b"static-" + path, create)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1119 ui.note(_(b'(falling back to static-http)\n'))
14148
cc9366a3751b httprepo: use the original exception after falling back to static-http failed
Mads Kiilerich <mads@kiilerich.com>
parents: 14094
diff changeset
1120 return r
cc9366a3751b httprepo: use the original exception after falling back to static-http failed
Mads Kiilerich <mads@kiilerich.com>
parents: 14094
diff changeset
1121 except error.RepoError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42853
diff changeset
1122 raise httpexception # use the original http RepoError instead