comparison mercurial/httppeer.py @ 37548:8e7a4435ab6d

httppeer: extract code for performing an HTTP request This is generic and doesn't need to live as a method of httppeer. Differential Revision: https://phab.mercurial-scm.org/D3233
author Gregory Szorc <gregory.szorc@gmail.com>
date Tue, 10 Apr 2018 10:27:49 -0700
parents 835ccc2a5ef1
children 66d1001e1500
comparison
equal deleted inserted replaced
37547:835ccc2a5ef1 37548:8e7a4435ab6d
136 'could be fixed if you need it') 136 'could be fixed if you need it')
137 for f in self._fileobjs: 137 for f in self._fileobjs:
138 f.seek(0) 138 f.seek(0)
139 self._index = 0 139 self._index = 0
140 140
141 def sendrequest(ui, opener, req):
142 """Send a prepared HTTP request.
143
144 Returns the response object.
145 """
146 if (ui.debugflag
147 and ui.configbool('devel', 'debug.peer-request')):
148 dbg = ui.debug
149 line = 'devel-peer-request: %s\n'
150 dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
151 hgargssize = None
152
153 for header, value in sorted(req.header_items()):
154 if header.startswith('X-hgarg-'):
155 if hgargssize is None:
156 hgargssize = 0
157 hgargssize += len(value)
158 else:
159 dbg(line % ' %s %s' % (header, value))
160
161 if hgargssize is not None:
162 dbg(line % ' %d bytes of commands arguments in headers'
163 % hgargssize)
164
165 if req.has_data():
166 data = req.get_data()
167 length = getattr(data, 'length', None)
168 if length is None:
169 length = len(data)
170 dbg(line % ' %d bytes of data' % length)
171
172 start = util.timer()
173
174 res = opener.open(req)
175 if ui.configbool('devel', 'debug.peer-request'):
176 dbg(line % ' finished in %.4f seconds (%s)'
177 % (util.timer() - start, res.code))
178
179 return res
180
141 class httppeer(wireproto.wirepeer): 181 class httppeer(wireproto.wirepeer):
142 def __init__(self, ui, path, url, opener, requestbuilder): 182 def __init__(self, ui, path, url, opener, requestbuilder):
143 self.ui = ui 183 self.ui = ui
144 self._path = path 184 self._path = path
145 self._url = url 185 self._url = url
149 189
150 def __del__(self): 190 def __del__(self):
151 for h in self._urlopener.handlers: 191 for h in self._urlopener.handlers:
152 h.close() 192 h.close()
153 getattr(h, "close_all", lambda: None)() 193 getattr(h, "close_all", lambda: None)()
154
155 def _openurl(self, req):
156 if (self.ui.debugflag
157 and self.ui.configbool('devel', 'debug.peer-request')):
158 dbg = self.ui.debug
159 line = 'devel-peer-request: %s\n'
160 dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
161 hgargssize = None
162
163 for header, value in sorted(req.header_items()):
164 if header.startswith('X-hgarg-'):
165 if hgargssize is None:
166 hgargssize = 0
167 hgargssize += len(value)
168 else:
169 dbg(line % ' %s %s' % (header, value))
170
171 if hgargssize is not None:
172 dbg(line % ' %d bytes of commands arguments in headers'
173 % hgargssize)
174
175 if req.has_data():
176 data = req.get_data()
177 length = getattr(data, 'length', None)
178 if length is None:
179 length = len(data)
180 dbg(line % ' %d bytes of data' % length)
181
182 start = util.timer()
183
184 ret = self._urlopener.open(req)
185 if self.ui.configbool('devel', 'debug.peer-request'):
186 dbg(line % ' finished in %.4f seconds (%s)'
187 % (util.timer() - start, ret.code))
188 return ret
189 194
190 # Begin of ipeerconnection interface. 195 # Begin of ipeerconnection interface.
191 196
192 def url(self): 197 def url(self):
193 return self._path 198 return self._path
320 325
321 if data is not None: 326 if data is not None:
322 self.ui.debug("sending %d bytes\n" % size) 327 self.ui.debug("sending %d bytes\n" % size)
323 req.add_unredirected_header(r'Content-Length', r'%d' % size) 328 req.add_unredirected_header(r'Content-Length', r'%d' % size)
324 try: 329 try:
325 resp = self._openurl(req) 330 resp = sendrequest(self.ui, self._urlopener, req)
326 except urlerr.httperror as inst: 331 except urlerr.httperror as inst:
327 if inst.code == 401: 332 if inst.code == 401:
328 raise error.Abort(_('authorization failed')) 333 raise error.Abort(_('authorization failed'))
329 raise 334 raise
330 except httplib.HTTPException as inst: 335 except httplib.HTTPException as inst: