379 |
379 |
380 return respurl, proto, resp |
380 return respurl, proto, resp |
381 |
381 |
382 |
382 |
383 class httppeer(wireprotov1peer.wirepeer): |
383 class httppeer(wireprotov1peer.wirepeer): |
384 def __init__(self, ui, path, url, opener, requestbuilder, caps): |
384 def __init__( |
385 super().__init__(ui, path=path) |
385 self, ui, path, url, opener, requestbuilder, caps, remotehidden=False |
|
386 ): |
|
387 super().__init__(ui, path=path, remotehidden=remotehidden) |
|
388 if remotehidden: |
|
389 msg = _( |
|
390 b"ignoring `--remote-hidden` request\n" |
|
391 b"(access to hidden changeset for http peers not " |
|
392 b"supported yet)\n" |
|
393 ) |
|
394 ui.warn(msg) |
386 self._url = url |
395 self._url = url |
387 self._caps = caps |
396 self._caps = caps |
388 self.limitedarguments = caps is not None and b'httppostargs' not in caps |
397 self.limitedarguments = caps is not None and b'httppostargs' not in caps |
389 self._urlopener = opener |
398 self._urlopener = opener |
390 self._requestbuilder = requestbuilder |
399 self._requestbuilder = requestbuilder |
590 info = {b'v1capabilities': set(rawdata.split())} |
599 info = {b'v1capabilities': set(rawdata.split())} |
591 |
600 |
592 return respurl, info |
601 return respurl, info |
593 |
602 |
594 |
603 |
595 def _make_peer(ui, path, opener=None, requestbuilder=urlreq.request): |
604 def _make_peer( |
|
605 ui, path, opener=None, requestbuilder=urlreq.request, remotehidden=False |
|
606 ): |
596 """Construct an appropriate HTTP peer instance. |
607 """Construct an appropriate HTTP peer instance. |
597 |
608 |
598 ``opener`` is an ``url.opener`` that should be used to establish |
609 ``opener`` is an ``url.opener`` that should be used to establish |
599 connections, perform HTTP requests. |
610 connections, perform HTTP requests. |
600 |
611 |
613 opener = opener or urlmod.opener(ui, authinfo) |
624 opener = opener or urlmod.opener(ui, authinfo) |
614 |
625 |
615 respurl, info = performhandshake(ui, url, opener, requestbuilder) |
626 respurl, info = performhandshake(ui, url, opener, requestbuilder) |
616 |
627 |
617 return httppeer( |
628 return httppeer( |
618 ui, path, respurl, opener, requestbuilder, info[b'v1capabilities'] |
629 ui, |
|
630 path, |
|
631 respurl, |
|
632 opener, |
|
633 requestbuilder, |
|
634 info[b'v1capabilities'], |
|
635 remotehidden=remotehidden, |
619 ) |
636 ) |
620 |
637 |
621 |
638 |
622 def make_peer(ui, path, create, intents=None, createopts=None): |
639 def make_peer( |
|
640 ui, path, create, intents=None, createopts=None, remotehidden=False |
|
641 ): |
623 if create: |
642 if create: |
624 raise error.Abort(_(b'cannot create new http repository')) |
643 raise error.Abort(_(b'cannot create new http repository')) |
625 try: |
644 try: |
626 if path.url.scheme == b'https' and not urlmod.has_https: |
645 if path.url.scheme == b'https' and not urlmod.has_https: |
627 raise error.Abort( |
646 raise error.Abort( |
628 _(b'Python support for SSL and HTTPS is not installed') |
647 _(b'Python support for SSL and HTTPS is not installed') |
629 ) |
648 ) |
630 |
649 |
631 inst = _make_peer(ui, path) |
650 inst = _make_peer(ui, path, remotehidden=remotehidden) |
632 |
651 |
633 return inst |
652 return inst |
634 except error.RepoError as httpexception: |
653 except error.RepoError as httpexception: |
635 try: |
654 try: |
636 r = statichttprepo.make_peer(ui, b"static-" + path.loc, create) |
655 r = statichttprepo.make_peer(ui, b"static-" + path.loc, create) |