async def _spawn_protocol(self, message): if message.unresolved_remote is None: host = message.opt.uri_host port = message.opt.uri_port or self._default_port if host is None: raise ValueError( "No location found to send message to (neither in .opt.uri_host nor in .remote)" ) else: host, port = util.hostportsplit(message.unresolved_remote) port = port or self._default_port if (host, port) in self._pool: return self._pool[(host, port)] try: _, protocol = await self.loop.create_connection( lambda: TcpConnection(self, self.log, self.loop, hostinfo=util.hostportjoin(host, port)), host, port, ssl=self._ssl_context_factory()) except socket.gaierror: raise error.ResolutionError( "No address information found for requests to %r" % host) except OSError: raise error.NetworkError("Connection failed to %r" % host) self._pool[(host, port)] = protocol return protocol
async def connection(self, message): if message.unresolved_remote is None: host = message.opt.uri_host port = message.opt.uri_port or self.default_port if host is None: raise ValueError( "No location found to send message to (neither in .opt.uri_host nor in .remote)" ) else: host, port = util.hostportsplit(message.unresolved_remote) port = port or self.default_port try: ipaddress.ip_address(host) server_name = None except ValueError as ve: server_name = host infos = await self.loop.getaddrinfo(host, port, type=socket.SOCK_DGRAM) self.addr = infos[0][4] config = QuicConfiguration(is_client=True, alpn_protocols='coap', idle_timeout=864000, server_name=server_name) config.verify_mode = ssl.CERT_NONE if config.server_name is None: config.server_name = server_name connection = QuicConnection(configuration=config) self.quic = Quic(connection) self.quic.ctx = self try: transport, protocol = await self.loop.create_datagram_endpoint( lambda: self.quic, remote_addr=(host, port)) protocol.connect(self.addr) await protocol.wait_connected() self.con = True except OSError: raise error.NetworkError("Connection failed to %r" % host) return protocol