m2m模型翻译
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

6 months ago
  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