图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.8 KiB

  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. from _typeshed import SizedBuffer
  13. logger = logging.getLogger(__name__)
  14. class PipXmlrpcTransport(xmlrpc.client.Transport):
  15. """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
  16. object.
  17. """
  18. def __init__(
  19. self, index_url: str, session: PipSession, use_datetime: bool = False
  20. ) -> None:
  21. super().__init__(use_datetime)
  22. index_parts = urllib.parse.urlparse(index_url)
  23. self._scheme = index_parts.scheme
  24. self._session = session
  25. def request(
  26. self,
  27. host: "_HostType",
  28. handler: str,
  29. request_body: "SizedBuffer",
  30. verbose: bool = False,
  31. ) -> Tuple["_Marshallable", ...]:
  32. assert isinstance(host, str)
  33. parts = (self._scheme, host, handler, None, None, None)
  34. url = urllib.parse.urlunparse(parts)
  35. try:
  36. headers = {"Content-Type": "text/xml"}
  37. response = self._session.post(
  38. url,
  39. data=request_body,
  40. headers=headers,
  41. stream=True,
  42. )
  43. raise_for_status(response)
  44. self.verbose = verbose
  45. return self.parse_response(response.raw)
  46. except NetworkConnectionError as exc:
  47. assert exc.response
  48. logger.critical(
  49. "HTTP error %s while getting %s",
  50. exc.response.status_code,
  51. url,
  52. )
  53. raise