From f74cdabfeba6895f549e41b055f50e29d710c802 Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Wed, 12 Feb 2025 10:49:31 -0500 Subject: [PATCH] server: detect if ipv6 is available When ipv6 is not available make sure that http and websocket clients set the "allow_ipv6" flag to false. Signed-off-by: Eric Callahan --- moonraker/components/http_client.py | 7 +++++-- moonraker/components/simplyprint.py | 9 ++++++--- moonraker/components/spoolman.py | 8 ++++++-- moonraker/server.py | 3 +++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/moonraker/components/http_client.py b/moonraker/components/http_client.py index fc23f6b7..25d01d2c 100644 --- a/moonraker/components/http_client.py +++ b/moonraker/components/http_client.py @@ -108,7 +108,8 @@ async def request( req_args: Dict[str, Any] = dict( body=body, request_timeout=request_timeout, - connect_timeout=connect_timeout + connect_timeout=connect_timeout, + allow_ipv6=self.server.ipv6_enabled() ) if basic_auth_user is not None: assert basic_auth_pass is not None @@ -261,8 +262,10 @@ async def download_file( url, headers={"Accept": content_type}, connect_timeout=connect_timeout, request_timeout=request_timeout, + allow_ipv6=self.server.ipv6_enabled(), streaming_callback=dl.on_chunk_recd, - header_callback=dl.on_headers_recd) + header_callback=dl.on_headers_recd + ) timeout = connect_timeout + request_timeout + 1. resp = await asyncio.wait_for(fut, timeout) except asyncio.CancelledError: diff --git a/moonraker/components/simplyprint.py b/moonraker/components/simplyprint.py index a9af7d76..3403e64e 100644 --- a/moonraker/components/simplyprint.py +++ b/moonraker/components/simplyprint.py @@ -12,6 +12,7 @@ import pathlib import base64 import tornado.websocket +from tornado.httpclient import HTTPRequest from tornado.escape import url_escape import logging.handlers import tempfile @@ -197,10 +198,12 @@ async def _connect(self) -> None: if log_connect: logging.info(f"Connecting To SimplyPrint: {url}") log_connect = False + req = HTTPRequest( + url, connect_timeout=5., + allow_ipv6=self.server.ipv6_enabled() + ) try: - self.ws = await tornado.websocket.websocket_connect( - url, connect_timeout=5., - ) + self.ws = await tornado.websocket.websocket_connect(req) setattr(self.ws, "on_ping", self._on_ws_ping) cur_time = self.eventloop.get_loop_time() self._last_ping_received = cur_time diff --git a/moonraker/components/spoolman.py b/moonraker/components/spoolman.py index d8a3e1d0..db2b6c13 100644 --- a/moonraker/components/spoolman.py +++ b/moonraker/components/spoolman.py @@ -10,6 +10,7 @@ import re import contextlib import tornado.websocket as tornado_ws +from tornado.httpclient import HTTPRequest from ..common import RequestType, HistoryFieldData from ..utils import json_wrapper as jsonw from typing import ( @@ -128,10 +129,13 @@ async def _connect_websocket(self) -> None: if log_connect: logging.info(f"Connecting To Spoolman: {self.ws_url}") log_connect = False + req = HTTPRequest( + self.ws_url, connect_timeout=5., + allow_ipv6=self.server.ipv6_enabled() + ) try: self.spoolman_ws = await tornado_ws.websocket_connect( - self.ws_url, - connect_timeout=5., + req, ping_interval=20., ping_timeout=60. ) diff --git a/moonraker/server.py b/moonraker/server.py index 40177a81..a57a3974 100755 --- a/moonraker/server.py +++ b/moonraker/server.py @@ -160,6 +160,9 @@ def is_debug_enabled(self) -> bool: def is_verbose_enabled(self) -> bool: return self.app_args["verbose"] + def ipv6_enabled(self) -> bool: + return socket.has_ipv6 + def _parse_config(self) -> confighelper.ConfigHelper: config = confighelper.get_configuration(self, self.app_args) # log config file