(self)
| 286 | ) |
| 287 | |
| 288 | async def run(self) -> None: |
| 289 | try: |
| 290 | self.parsed = urllib.parse.urlsplit(_unicode(self.request.url)) |
| 291 | if self.parsed.scheme not in ("http", "https"): |
| 292 | raise ValueError("Unsupported url scheme: %s" % self.request.url) |
| 293 | # urlsplit results have hostname and port results, but they |
| 294 | # didn't support ipv6 literals until python 2.7. |
| 295 | netloc = self.parsed.netloc |
| 296 | if "@" in netloc: |
| 297 | userpass, _, netloc = netloc.rpartition("@") |
| 298 | host, port = httputil.split_host_and_port(netloc) |
| 299 | if port is None: |
| 300 | port = 443 if self.parsed.scheme == "https" else 80 |
| 301 | if re.match(r"^\[.*\]$", host): |
| 302 | # raw ipv6 addresses in urls are enclosed in brackets |
| 303 | host = host[1:-1] |
| 304 | self.parsed_hostname = host # save final host for _on_connect |
| 305 | |
| 306 | if self.request.allow_ipv6 is False: |
| 307 | af = socket.AF_INET |
| 308 | else: |
| 309 | af = socket.AF_UNSPEC |
| 310 | |
| 311 | ssl_options = self._get_ssl_options(self.parsed.scheme) |
| 312 | |
| 313 | source_ip = None |
| 314 | if self.request.network_interface: |
| 315 | if is_valid_ip(self.request.network_interface): |
| 316 | source_ip = self.request.network_interface |
| 317 | else: |
| 318 | raise ValueError( |
| 319 | "Unrecognized IPv4 or IPv6 address for network_interface, got %r" |
| 320 | % (self.request.network_interface,) |
| 321 | ) |
| 322 | |
| 323 | if self.request.connect_timeout and self.request.request_timeout: |
| 324 | timeout = min( |
| 325 | self.request.connect_timeout, self.request.request_timeout |
| 326 | ) |
| 327 | elif self.request.connect_timeout: |
| 328 | timeout = self.request.connect_timeout |
| 329 | elif self.request.request_timeout: |
| 330 | timeout = self.request.request_timeout |
| 331 | else: |
| 332 | timeout = 0 |
| 333 | if timeout: |
| 334 | self._timeout = self.io_loop.add_timeout( |
| 335 | self.start_time + timeout, |
| 336 | functools.partial(self._on_timeout, "while connecting"), |
| 337 | ) |
| 338 | stream = await self.tcp_client.connect( |
| 339 | host, |
| 340 | port, |
| 341 | af=af, |
| 342 | ssl_options=ssl_options, |
| 343 | max_buffer_size=self.max_buffer_size, |
| 344 | source_ip=source_ip, |
| 345 | ) |
no test coverage detected