61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
|
"""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
|