__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
# -*- test-case-name: twisted.internet.test.test_resolver -*-
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
IPv6-aware hostname resolution.
@see: L{IHostnameResolver}
"""
from socket import (
AF_INET,
AF_INET6,
AF_UNSPEC,
SOCK_DGRAM,
SOCK_STREAM,
AddressFamily,
SocketKind,
gaierror,
getaddrinfo,
)
from typing import (
TYPE_CHECKING,
Callable,
List,
NoReturn,
Optional,
Sequence,
Tuple,
Type,
Union,
)
from zope.interface import implementer
from twisted.internet._idna import _idnaBytes
from twisted.internet.address import IPv4Address, IPv6Address
from twisted.internet.defer import Deferred
from twisted.internet.error import DNSLookupError
from twisted.internet.interfaces import (
IAddress,
IHostnameResolver,
IHostResolution,
IReactorThreads,
IResolutionReceiver,
IResolverSimple,
)
from twisted.internet.threads import deferToThreadPool
from twisted.logger import Logger
from twisted.python.compat import nativeString
if TYPE_CHECKING:
from twisted.python.threadpool import ThreadPool
@implementer(IHostResolution)
class HostResolution:
"""
The in-progress resolution of a given hostname.
"""
def __init__(self, name: str):
"""
Create a L{HostResolution} with the given name.
"""
self.name = name
def cancel(self) -> NoReturn:
# IHostResolution.cancel
raise NotImplementedError()
_any = frozenset([IPv4Address, IPv6Address])
_typesToAF = {
frozenset([IPv4Address]): AF_INET,
frozenset([IPv6Address]): AF_INET6,
_any: AF_UNSPEC,
}
_afToType = {
AF_INET: IPv4Address,
AF_INET6: IPv6Address,
}
_transportToSocket = {
"TCP": SOCK_STREAM,
"UDP": SOCK_DGRAM,
}
_socktypeToType = {
SOCK_STREAM: "TCP",
SOCK_DGRAM: "UDP",
}
_GETADDRINFO_RESULT = List[
Tuple[
AddressFamily,
SocketKind,
int,
str,
Union[Tuple[str, int], Tuple[str, int, int, int]],
]
]
@implementer(IHostnameResolver)
class GAIResolver:
"""
L{IHostnameResolver} implementation that resolves hostnames by calling
L{getaddrinfo} in a thread.
"""
def __init__(
self,
reactor: IReactorThreads,
getThreadPool: Optional[Callable[[], "ThreadPool"]] = None,
getaddrinfo: Callable[[str, int, int, int], _GETADDRINFO_RESULT] = getaddrinfo,
):
"""
Create a L{GAIResolver}.
@param reactor: the reactor to schedule result-delivery on
@type reactor: L{IReactorThreads}
@param getThreadPool: a function to retrieve the thread pool to use for
scheduling name resolutions. If not supplied, the use the given
C{reactor}'s thread pool.
@type getThreadPool: 0-argument callable returning a
L{twisted.python.threadpool.ThreadPool}
@param getaddrinfo: a reference to the L{getaddrinfo} to use - mainly
parameterized for testing.
@type getaddrinfo: callable with the same signature as L{getaddrinfo}
"""
self._reactor = reactor
self._getThreadPool = (
reactor.getThreadPool if getThreadPool is None else getThreadPool
)
self._getaddrinfo = getaddrinfo
def resolveHostName(
self,
resolutionReceiver: IResolutionReceiver,
hostName: str,
portNumber: int = 0,
addressTypes: Optional[Sequence[Type[IAddress]]] = None,
transportSemantics: str = "TCP",
) -> IHostResolution:
"""
See L{IHostnameResolver.resolveHostName}
@param resolutionReceiver: see interface
@param hostName: see interface
@param portNumber: see interface
@param addressTypes: see interface
@param transportSemantics: see interface
@return: see interface
"""
pool = self._getThreadPool()
addressFamily = _typesToAF[
_any if addressTypes is None else frozenset(addressTypes)
]
socketType = _transportToSocket[transportSemantics]
def get() -> _GETADDRINFO_RESULT:
try:
return self._getaddrinfo(
hostName, portNumber, addressFamily, socketType
)
except gaierror:
return []
d = deferToThreadPool(self._reactor, pool, get)
resolution = HostResolution(hostName)
resolutionReceiver.resolutionBegan(resolution)
@d.addCallback
def deliverResults(result: _GETADDRINFO_RESULT) -> None:
for family, socktype, proto, cannoname, sockaddr in result:
addrType = _afToType[family]
resolutionReceiver.addressResolved(
addrType(_socktypeToType.get(socktype, "TCP"), *sockaddr)
)
resolutionReceiver.resolutionComplete()
return resolution
@implementer(IHostnameResolver)
class SimpleResolverComplexifier:
"""
A converter from L{IResolverSimple} to L{IHostnameResolver}.
"""
_log = Logger()
def __init__(self, simpleResolver: IResolverSimple):
"""
Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
"""
self._simpleResolver = simpleResolver
def resolveHostName(
self,
resolutionReceiver: IResolutionReceiver,
hostName: str,
portNumber: int = 0,
addressTypes: Optional[Sequence[Type[IAddress]]] = None,
transportSemantics: str = "TCP",
) -> IHostResolution:
"""
See L{IHostnameResolver.resolveHostName}
@param resolutionReceiver: see interface
@param hostName: see interface
@param portNumber: see interface
@param addressTypes: see interface
@param transportSemantics: see interface
@return: see interface
"""
# If it's str, we need to make sure that it's just ASCII.
try:
hostName_bytes = hostName.encode("ascii")
except UnicodeEncodeError:
# If it's not just ASCII, IDNA it. We don't want to give a Unicode
# string with non-ASCII in it to Python 3, as if anyone passes that
# to a Python 3 stdlib function, it will probably use the wrong
# IDNA version and break absolutely everything
hostName_bytes = _idnaBytes(hostName)
# Make sure it's passed down as a native str, to maintain the interface
hostName = nativeString(hostName_bytes)
resolution = HostResolution(hostName)
resolutionReceiver.resolutionBegan(resolution)
(
self._simpleResolver.getHostByName(hostName)
.addCallback(
lambda address: resolutionReceiver.addressResolved(
IPv4Address("TCP", address, portNumber)
)
)
.addErrback(
lambda error: None
if error.check(DNSLookupError)
else self._log.failure(
"while looking up {name} with {resolver}",
error,
name=hostName,
resolver=self._simpleResolver,
)
)
.addCallback(lambda nothing: resolutionReceiver.resolutionComplete())
)
return resolution
@implementer(IResolutionReceiver)
class FirstOneWins:
"""
An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
"""
def __init__(self, deferred: "Deferred[str]"):
"""
@param deferred: The L{Deferred} to fire when the first resolution
result arrives.
"""
self._deferred = deferred
self._resolved = False
def resolutionBegan(self, resolution: IHostResolution) -> None:
"""
See L{IResolutionReceiver.resolutionBegan}
@param resolution: See L{IResolutionReceiver.resolutionBegan}
"""
self._resolution = resolution
def addressResolved(self, address: IAddress) -> None:
"""
See L{IResolutionReceiver.addressResolved}
@param address: See L{IResolutionReceiver.addressResolved}
"""
if self._resolved:
return
self._resolved = True
# This is used by ComplexResolverSimplifier which specifies only results
# of IPv4Address.
assert isinstance(address, IPv4Address)
self._deferred.callback(address.host)
def resolutionComplete(self) -> None:
"""
See L{IResolutionReceiver.resolutionComplete}
"""
if self._resolved:
return
self._deferred.errback(DNSLookupError(self._resolution.name))
@implementer(IResolverSimple)
class ComplexResolverSimplifier:
"""
A converter from L{IHostnameResolver} to L{IResolverSimple}
"""
def __init__(self, nameResolver: IHostnameResolver):
"""
Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.
@param nameResolver: The L{IHostnameResolver} to use.
"""
self._nameResolver = nameResolver
def getHostByName(self, name: str, timeouts: Sequence[int] = ()) -> "Deferred[str]":
"""
See L{IResolverSimple.getHostByName}
@param name: see L{IResolverSimple.getHostByName}
@param timeouts: see L{IResolverSimple.getHostByName}
@return: see L{IResolverSimple.getHostByName}
"""
result: "Deferred[str]" = Deferred()
self._nameResolver.resolveHostName(FirstOneWins(result), name, 0, [IPv4Address])
return result
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| iocpreactor | Folder | 0755 |
|
|
| test | Folder | 0755 |
|
|
| __init__.py | File | 521 B | 0644 |
|
| _baseprocess.py | File | 1.96 KB | 0644 |
|
| _deprecate.py | File | 743 B | 0644 |
|
| _dumbwin32proc.py | File | 12.29 KB | 0644 |
|
| _glibbase.py | File | 12.61 KB | 0644 |
|
| _idna.py | File | 1.39 KB | 0644 |
|
| _newtls.py | File | 8.97 KB | 0644 |
|
| _pollingfile.py | File | 8.49 KB | 0644 |
|
| _posixserialport.py | File | 1.99 KB | 0644 |
|
| _posixstdio.py | File | 4.88 KB | 0644 |
|
| _producer_helpers.py | File | 3.82 KB | 0644 |
|
| _resolver.py | File | 9.46 KB | 0644 |
|
| _signals.py | File | 14.06 KB | 0644 |
|
| _sslverify.py | File | 70.68 KB | 0644 |
|
| _threadedselect.py | File | 11.31 KB | 0644 |
|
| _win32serialport.py | File | 4.69 KB | 0644 |
|
| _win32stdio.py | File | 3.04 KB | 0644 |
|
| abstract.py | File | 18.84 KB | 0644 |
|
| address.py | File | 5.14 KB | 0644 |
|
| asyncioreactor.py | File | 10.87 KB | 0644 |
|
| base.py | File | 46.82 KB | 0644 |
|
| cfreactor.py | File | 22.75 KB | 0644 |
|
| default.py | File | 1.85 KB | 0644 |
|
| defer.py | File | 95.88 KB | 0644 |
|
| endpoints.py | File | 76.59 KB | 0644 |
|
| epollreactor.py | File | 8.73 KB | 0644 |
|
| error.py | File | 13.14 KB | 0644 |
|
| fdesc.py | File | 3.16 KB | 0644 |
|
| gireactor.py | File | 3.42 KB | 0644 |
|
| glib2reactor.py | File | 1.24 KB | 0644 |
|
| gtk2reactor.py | File | 3.55 KB | 0644 |
|
| gtk3reactor.py | File | 512 B | 0644 |
|
| inotify.py | File | 14.06 KB | 0644 |
|
| interfaces.py | File | 95.89 KB | 0644 |
|
| kqreactor.py | File | 10.56 KB | 0644 |
|
| main.py | File | 1006 B | 0644 |
|
| pollreactor.py | File | 5.83 KB | 0644 |
|
| posixbase.py | File | 20.88 KB | 0644 |
|
| process.py | File | 43.14 KB | 0644 |
|
| protocol.py | File | 26.93 KB | 0644 |
|
| pyuisupport.py | File | 853 B | 0644 |
|
| reactor.py | File | 1.77 KB | 0644 |
|
| selectreactor.py | File | 5.96 KB | 0644 |
|
| serialport.py | File | 2.2 KB | 0644 |
|
| ssl.py | File | 8.47 KB | 0644 |
|
| stdio.py | File | 1006 B | 0644 |
|
| task.py | File | 32.9 KB | 0644 |
|
| tcp.py | File | 53.97 KB | 0644 |
|
| testing.py | File | 29.12 KB | 0644 |
|
| threads.py | File | 4.13 KB | 0644 |
|
| tksupport.py | File | 1.92 KB | 0644 |
|
| udp.py | File | 18.18 KB | 0644 |
|
| unix.py | File | 21.98 KB | 0644 |
|
| utils.py | File | 8.48 KB | 0644 |
|
| win32eventreactor.py | File | 14.84 KB | 0644 |
|
| wxreactor.py | File | 5.15 KB | 0644 |
|
| wxsupport.py | File | 1.27 KB | 0644 |
|