comparison mercurial/wireprotov2peer.py @ 43077:687b865b95ad

formatting: byteify all mercurial/ and hgext/ string literals Done with python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py') black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**') # skip-blame mass-reformatting only Differential Revision: https://phab.mercurial-scm.org/D6972
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:48:39 -0400
parents 2372284d9457
children 9f70512ae2cf
comparison
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
56 ``target`` should come from the capabilities data structure emitted by 56 ``target`` should come from the capabilities data structure emitted by
57 the server. 57 the server.
58 """ 58 """
59 if target.get(b'protocol') not in SUPPORTED_REDIRECT_PROTOCOLS: 59 if target.get(b'protocol') not in SUPPORTED_REDIRECT_PROTOCOLS:
60 ui.note( 60 ui.note(
61 _('(remote redirect target %s uses unsupported protocol: %s)\n') 61 _(b'(remote redirect target %s uses unsupported protocol: %s)\n')
62 % (target[b'name'], target.get(b'protocol', b'')) 62 % (target[b'name'], target.get(b'protocol', b''))
63 ) 63 )
64 return False 64 return False
65 65
66 if target.get(b'snirequired') and not sslutil.hassni: 66 if target.get(b'snirequired') and not sslutil.hassni:
67 ui.note( 67 ui.note(
68 _('(redirect target %s requires SNI, which is unsupported)\n') 68 _(b'(redirect target %s requires SNI, which is unsupported)\n')
69 % target[b'name'] 69 % target[b'name']
70 ) 70 )
71 return False 71 return False
72 72
73 if b'tlsversions' in target: 73 if b'tlsversions' in target:
79 supported.add(v[3:]) 79 supported.add(v[3:])
80 80
81 if not tlsversions & supported: 81 if not tlsversions & supported:
82 ui.note( 82 ui.note(
83 _( 83 _(
84 '(remote redirect target %s requires unsupported TLS ' 84 b'(remote redirect target %s requires unsupported TLS '
85 'versions: %s)\n' 85 b'versions: %s)\n'
86 ) 86 )
87 % (target[b'name'], b', '.join(sorted(tlsversions))) 87 % (target[b'name'], b', '.join(sorted(tlsversions)))
88 ) 88 )
89 return False 89 return False
90 90
91 ui.note(_('(remote redirect target %s is compatible)\n') % target[b'name']) 91 ui.note(_(b'(remote redirect target %s is compatible)\n') % target[b'name'])
92 92
93 return True 93 return True
94 94
95 95
96 def supportedredirects(ui, apidescriptor): 96 def supportedredirects(ui, apidescriptor):
179 # content redirect is the only object in the stream. Fail 179 # content redirect is the only object in the stream. Fail
180 # if we see a misbehaving server. 180 # if we see a misbehaving server.
181 if self._redirect: 181 if self._redirect:
182 raise error.Abort( 182 raise error.Abort(
183 _( 183 _(
184 'received unexpected response data ' 184 b'received unexpected response data '
185 'after content redirect; the remote is ' 185 b'after content redirect; the remote is '
186 'buggy' 186 b'buggy'
187 ) 187 )
188 ) 188 )
189 189
190 self._pendingevents.append(o) 190 self._pendingevents.append(o)
191 191
213 serverdercerts=l.get(b'serverdercerts'), 213 serverdercerts=l.get(b'serverdercerts'),
214 servercadercerts=l.get(b'servercadercerts'), 214 servercadercerts=l.get(b'servercadercerts'),
215 ) 215 )
216 return 216 return
217 217
218 atoms = [{'msg': o[b'error'][b'message']}] 218 atoms = [{b'msg': o[b'error'][b'message']}]
219 if b'args' in o[b'error']: 219 if b'args' in o[b'error']:
220 atoms[0]['args'] = o[b'error'][b'args'] 220 atoms[0][b'args'] = o[b'error'][b'args']
221 221
222 raise error.RepoError(formatrichmessage(atoms)) 222 raise error.RepoError(formatrichmessage(atoms))
223 223
224 def objects(self): 224 def objects(self):
225 """Obtained decoded objects from this response. 225 """Obtained decoded objects from this response.
291 """ 291 """
292 request, action, meta = self._reactor.callcommand( 292 request, action, meta = self._reactor.callcommand(
293 command, args, redirect=redirect 293 command, args, redirect=redirect
294 ) 294 )
295 295
296 if action != 'noop': 296 if action != b'noop':
297 raise error.ProgrammingError('%s not yet supported' % action) 297 raise error.ProgrammingError(b'%s not yet supported' % action)
298 298
299 rid = request.requestid 299 rid = request.requestid
300 self._requests[rid] = request 300 self._requests[rid] = request
301 self._futures[rid] = f 301 self._futures[rid] = f
302 # TODO we need some kind of lifetime on response instances otherwise 302 # TODO we need some kind of lifetime on response instances otherwise
310 310
311 Returns an iterable of frames that should be sent over the wire. 311 Returns an iterable of frames that should be sent over the wire.
312 """ 312 """
313 action, meta = self._reactor.flushcommands() 313 action, meta = self._reactor.flushcommands()
314 314
315 if action != 'sendframes': 315 if action != b'sendframes':
316 raise error.ProgrammingError('%s not yet supported' % action) 316 raise error.ProgrammingError(b'%s not yet supported' % action)
317 317
318 return meta['framegen'] 318 return meta[b'framegen']
319 319
320 def readdata(self, framefh): 320 def readdata(self, framefh):
321 """Attempt to read data and do work. 321 """Attempt to read data and do work.
322 322
323 Returns None if no data was read. Presumably this means we're 323 Returns None if no data was read. Presumably this means we're
327 frame = wireprotoframing.readframe(framefh) 327 frame = wireprotoframing.readframe(framefh)
328 if frame is None: 328 if frame is None:
329 # TODO tell reactor? 329 # TODO tell reactor?
330 self._frameseof = True 330 self._frameseof = True
331 else: 331 else:
332 self._ui.debug('received %r\n' % frame) 332 self._ui.debug(b'received %r\n' % frame)
333 self._processframe(frame) 333 self._processframe(frame)
334 334
335 # Also try to read the first redirect. 335 # Also try to read the first redirect.
336 if self._redirects: 336 if self._redirects:
337 if not self._processredirect(*self._redirects[0]): 337 if not self._processredirect(*self._redirects[0]):
345 def _processframe(self, frame): 345 def _processframe(self, frame):
346 """Process a single read frame.""" 346 """Process a single read frame."""
347 347
348 action, meta = self._reactor.onframerecv(frame) 348 action, meta = self._reactor.onframerecv(frame)
349 349
350 if action == 'error': 350 if action == b'error':
351 e = error.RepoError(meta['message']) 351 e = error.RepoError(meta[b'message'])
352 352
353 if frame.requestid in self._responses: 353 if frame.requestid in self._responses:
354 self._responses[frame.requestid]._oninputcomplete() 354 self._responses[frame.requestid]._oninputcomplete()
355 355
356 if frame.requestid in self._futures: 356 if frame.requestid in self._futures:
358 del self._futures[frame.requestid] 358 del self._futures[frame.requestid]
359 else: 359 else:
360 raise e 360 raise e
361 361
362 return 362 return
363 elif action == 'noop': 363 elif action == b'noop':
364 return 364 return
365 elif action == 'responsedata': 365 elif action == b'responsedata':
366 # Handled below. 366 # Handled below.
367 pass 367 pass
368 else: 368 else:
369 raise error.ProgrammingError('action not handled: %s' % action) 369 raise error.ProgrammingError(b'action not handled: %s' % action)
370 370
371 if frame.requestid not in self._requests: 371 if frame.requestid not in self._requests:
372 raise error.ProgrammingError( 372 raise error.ProgrammingError(
373 'received frame for unknown request; this is either a bug in ' 373 b'received frame for unknown request; this is either a bug in '
374 'the clientreactor not screening for this or this instance was ' 374 b'the clientreactor not screening for this or this instance was '
375 'never told about this request: %r' % frame 375 b'never told about this request: %r' % frame
376 ) 376 )
377 377
378 response = self._responses[frame.requestid] 378 response = self._responses[frame.requestid]
379 379
380 if action == 'responsedata': 380 if action == b'responsedata':
381 # Any failures processing this frame should bubble up to the 381 # Any failures processing this frame should bubble up to the
382 # future tracking the request. 382 # future tracking the request.
383 try: 383 try:
384 self._processresponsedata(frame, meta, response) 384 self._processresponsedata(frame, meta, response)
385 except BaseException as e: 385 except BaseException as e:
395 response._oninputcomplete() 395 response._oninputcomplete()
396 else: 396 else:
397 response._onerror(e) 397 response._onerror(e)
398 else: 398 else:
399 raise error.ProgrammingError( 399 raise error.ProgrammingError(
400 'unhandled action from clientreactor: %s' % action 400 b'unhandled action from clientreactor: %s' % action
401 ) 401 )
402 402
403 def _processresponsedata(self, frame, meta, response): 403 def _processresponsedata(self, frame, meta, response):
404 # This can raise. The caller can handle it. 404 # This can raise. The caller can handle it.
405 response._onresponsedata(meta['data']) 405 response._onresponsedata(meta[b'data'])
406 406
407 # We need to be careful about resolving futures prematurely. If a 407 # We need to be careful about resolving futures prematurely. If a
408 # response is a redirect response, resolving the future before the 408 # response is a redirect response, resolving the future before the
409 # redirect is processed would result in the consumer seeing an 409 # redirect is processed would result in the consumer seeing an
410 # empty stream of objects, since they'd be consuming our 410 # empty stream of objects, since they'd be consuming our
412 # 412 #
413 # Our strategy is to not resolve/finish the request until either 413 # Our strategy is to not resolve/finish the request until either
414 # EOS occurs or until the initial response object is fully received. 414 # EOS occurs or until the initial response object is fully received.
415 415
416 # Always react to eos. 416 # Always react to eos.
417 if meta['eos']: 417 if meta[b'eos']:
418 response._oninputcomplete() 418 response._oninputcomplete()
419 del self._requests[frame.requestid] 419 del self._requests[frame.requestid]
420 420
421 # Not EOS but we haven't decoded the initial response object yet. 421 # Not EOS but we haven't decoded the initial response object yet.
422 # Return and wait for more data. 422 # Return and wait for more data.
444 self._futures[frame.requestid].set_result(decoded) 444 self._futures[frame.requestid].set_result(decoded)
445 del self._futures[frame.requestid] 445 del self._futures[frame.requestid]
446 446
447 def _followredirect(self, requestid, redirect): 447 def _followredirect(self, requestid, redirect):
448 """Called to initiate redirect following for a request.""" 448 """Called to initiate redirect following for a request."""
449 self._ui.note(_('(following redirect to %s)\n') % redirect.url) 449 self._ui.note(_(b'(following redirect to %s)\n') % redirect.url)
450 450
451 # TODO handle framed responses. 451 # TODO handle framed responses.
452 if redirect.mediatype != b'application/mercurial-cbor': 452 if redirect.mediatype != b'application/mercurial-cbor':
453 raise error.Abort( 453 raise error.Abort(
454 _('cannot handle redirects for the %s media type') 454 _(b'cannot handle redirects for the %s media type')
455 % redirect.mediatype 455 % redirect.mediatype
456 ) 456 )
457 457
458 if redirect.fullhashes: 458 if redirect.fullhashes:
459 self._ui.warn( 459 self._ui.warn(
460 _( 460 _(
461 '(support for validating hashes on content ' 461 b'(support for validating hashes on content '
462 'redirects not supported)\n' 462 b'redirects not supported)\n'
463 ) 463 )
464 ) 464 )
465 465
466 if redirect.serverdercerts or redirect.servercadercerts: 466 if redirect.serverdercerts or redirect.servercadercerts:
467 self._ui.warn( 467 self._ui.warn(
468 _( 468 _(
469 '(support for pinning server certificates on ' 469 b'(support for pinning server certificates on '
470 'content redirects not supported)\n' 470 b'content redirects not supported)\n'
471 ) 471 )
472 ) 472 )
473 473
474 headers = { 474 headers = {
475 r'Accept': redirect.mediatype, 475 r'Accept': redirect.mediatype,
479 479
480 try: 480 try:
481 res = self._opener.open(req) 481 res = self._opener.open(req)
482 except util.urlerr.httperror as e: 482 except util.urlerr.httperror as e:
483 if e.code == 401: 483 if e.code == 401:
484 raise error.Abort(_('authorization failed')) 484 raise error.Abort(_(b'authorization failed'))
485 raise 485 raise
486 except util.httplib.HTTPException as e: 486 except util.httplib.HTTPException as e:
487 self._ui.debug('http error requesting %s\n' % req.get_full_url()) 487 self._ui.debug(b'http error requesting %s\n' % req.get_full_url())
488 self._ui.traceback() 488 self._ui.traceback()
489 raise IOError(None, e) 489 raise IOError(None, e)
490 490
491 urlmod.wrapresponse(res) 491 urlmod.wrapresponse(res)
492 492
565 def decodepushkey(objs): 565 def decodepushkey(objs):
566 return next(objs) 566 return next(objs)
567 567
568 568
569 COMMAND_DECODERS = { 569 COMMAND_DECODERS = {
570 'branchmap': decodebranchmap, 570 b'branchmap': decodebranchmap,
571 'heads': decodeheads, 571 b'heads': decodeheads,
572 'known': decodeknown, 572 b'known': decodeknown,
573 'listkeys': decodelistkeys, 573 b'listkeys': decodelistkeys,
574 'lookup': decodelookup, 574 b'lookup': decodelookup,
575 'pushkey': decodepushkey, 575 b'pushkey': decodepushkey,
576 } 576 }