xmlrpc.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. """xmlrpclib.Transport implementation
  2. """
  3. import logging
  4. import urllib.parse
  5. import xmlrpc.client
  6. from typing import TYPE_CHECKING, Tuple
  7. from pip._internal.exceptions import NetworkConnectionError
  8. from pip._internal.network.session import PipSession
  9. from pip._internal.network.utils import raise_for_status
  10. if TYPE_CHECKING:
  11. from xmlrpc.client import _HostType, _Marshallable
  12. logger = logging.getLogger(__name__)
  13. class PipXmlrpcTransport(xmlrpc.client.Transport):
  14. """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
  15. object.
  16. """
  17. def __init__(self, index_url, session, use_datetime=False):
  18. # type: (str, PipSession, bool) -> None
  19. super().__init__(use_datetime)
  20. index_parts = urllib.parse.urlparse(index_url)
  21. self._scheme = index_parts.scheme
  22. self._session = session
  23. def request(self, host, handler, request_body, verbose=False):
  24. # type: (_HostType, str, bytes, bool) -> Tuple[_Marshallable, ...]
  25. assert isinstance(host, str)
  26. parts = (self._scheme, host, handler, None, None, None)
  27. url = urllib.parse.urlunparse(parts)
  28. try:
  29. headers = {'Content-Type': 'text/xml'}
  30. response = self._session.post(url, data=request_body,
  31. headers=headers, stream=True)
  32. raise_for_status(response)
  33. self.verbose = verbose
  34. return self.parse_response(response.raw)
  35. except NetworkConnectionError as exc:
  36. assert exc.response
  37. logger.critical(
  38. "HTTP error %s while getting %s",
  39. exc.response.status_code, url,
  40. )
  41. raise