comparison mercurial/httppeer.py @ 33805:f913e90f15a0

httppeer: use peer interface This is similar to what we did to sshpeer. Quirks and all. Differential Revision: https://phab.mercurial-scm.org/D337
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 06 Aug 2017 18:00:19 -0700
parents 73fd395ee29e
children dedab036215d
comparison
equal deleted inserted replaced
33804:1f8460b55986 33805:f913e90f15a0
19 from . import ( 19 from . import (
20 bundle2, 20 bundle2,
21 error, 21 error,
22 httpconnection, 22 httpconnection,
23 pycompat, 23 pycompat,
24 repository,
24 statichttprepo, 25 statichttprepo,
25 url, 26 url,
26 util, 27 util,
27 wireproto, 28 wireproto,
28 ) 29 )
84 'if the error persists, consider contacting the ' 85 'if the error persists, consider contacting the '
85 'network or server operator')) 86 'network or server operator'))
86 87
87 resp.__class__ = readerproxy 88 resp.__class__ = readerproxy
88 89
89 class httppeer(wireproto.wirepeer): 90 class httppeer(wireproto.wirepeer, repository.legacypeer):
90 def __init__(self, ui, path): 91 def __init__(self, ui, path):
91 self._path = path 92 self._path = path
92 self._caps = None 93 self._caps = None
93 self._urlopener = None 94 self._urlopener = None
94 self._requestbuilder = None 95 self._requestbuilder = None
98 (u.query or u.fragment)) 99 (u.query or u.fragment))
99 100
100 # urllib cannot handle URLs with embedded user or passwd 101 # urllib cannot handle URLs with embedded user or passwd
101 self._url, authinfo = u.authinfo() 102 self._url, authinfo = u.authinfo()
102 103
103 self.ui = ui 104 self._ui = ui
104 self.ui.debug('using %s\n' % self._url) 105 ui.debug('using %s\n' % self._url)
105 106
106 self._urlopener = url.opener(ui, authinfo) 107 self._urlopener = url.opener(ui, authinfo)
107 self._requestbuilder = urlreq.request 108 self._requestbuilder = urlreq.request
109
110 # TODO remove once peerrepository isn't in inheritance.
111 self._capabilities = self.capabilities
108 112
109 def __del__(self): 113 def __del__(self):
110 urlopener = getattr(self, '_urlopener', None) 114 urlopener = getattr(self, '_urlopener', None)
111 if urlopener: 115 if urlopener:
112 for h in urlopener.handlers: 116 for h in urlopener.handlers:
113 h.close() 117 h.close()
114 getattr(h, "close_all", lambda : None)() 118 getattr(h, "close_all", lambda : None)()
115 119
120 # Begin of _basepeer interface.
121
122 @util.propertycache
123 def ui(self):
124 return self._ui
125
116 def url(self): 126 def url(self):
117 return self._path 127 return self._path
118 128
119 # look up capabilities only when needed 129 def local(self):
120 130 return None
121 def _fetchcaps(self): 131
122 self._caps = set(self._call('capabilities').split()) 132 def peer(self):
123 133 return self
124 def _capabilities(self): 134
135 def canpush(self):
136 return True
137
138 def close(self):
139 pass
140
141 # End of _basepeer interface.
142
143 # Begin of _basewirepeer interface.
144
145 def capabilities(self):
125 if self._caps is None: 146 if self._caps is None:
126 try: 147 try:
127 self._fetchcaps() 148 self._fetchcaps()
128 except error.RepoError: 149 except error.RepoError:
129 self._caps = set() 150 self._caps = set()
130 self.ui.debug('capabilities: %s\n' % 151 self.ui.debug('capabilities: %s\n' %
131 (' '.join(self._caps or ['none']))) 152 (' '.join(self._caps or ['none'])))
132 return self._caps 153 return self._caps
154
155 # End of _basewirepeer interface.
156
157 # look up capabilities only when needed
158
159 def _fetchcaps(self):
160 self._caps = set(self._call('capabilities').split())
133 161
134 def _callstream(self, cmd, _compressible=False, **args): 162 def _callstream(self, cmd, _compressible=False, **args):
135 if cmd == 'pushkey': 163 if cmd == 'pushkey':
136 args['data'] = '' 164 args['data'] = ''
137 data = args.pop('data', None) 165 data = args.pop('data', None)