| """xmlrpclib.Transport implementation |
| """ |
| |
| import logging |
| import urllib.parse |
| import xmlrpc.client |
| from typing import TYPE_CHECKING, Tuple |
| |
| from pip._internal.exceptions import NetworkConnectionError |
| from pip._internal.network.session import PipSession |
| from pip._internal.network.utils import raise_for_status |
| |
| if TYPE_CHECKING: |
| from xmlrpc.client import _HostType, _Marshallable |
| |
| logger = logging.getLogger(__name__) |
| |
| |
| class PipXmlrpcTransport(xmlrpc.client.Transport): |
| """Provide a `xmlrpclib.Transport` implementation via a `PipSession` |
| object. |
| """ |
| |
| def __init__( |
| self, index_url: str, session: PipSession, use_datetime: bool = False |
| ) -> None: |
| super().__init__(use_datetime) |
| index_parts = urllib.parse.urlparse(index_url) |
| self._scheme = index_parts.scheme |
| self._session = session |
| |
| def request( |
| self, |
| host: "_HostType", |
| handler: str, |
| request_body: bytes, |
| verbose: bool = False, |
| ) -> Tuple["_Marshallable", ...]: |
| assert isinstance(host, str) |
| parts = (self._scheme, host, handler, None, None, None) |
| url = urllib.parse.urlunparse(parts) |
| try: |
| headers = {"Content-Type": "text/xml"} |
| response = self._session.post( |
| url, |
| data=request_body, |
| headers=headers, |
| stream=True, |
| ) |
| raise_for_status(response) |
| self.verbose = verbose |
| return self.parse_response(response.raw) |
| except NetworkConnectionError as exc: |
| assert exc.response |
| logger.critical( |
| "HTTP error %s while getting %s", |
| exc.response.status_code, |
| url, |
| ) |
| raise |