From eb1e48bcc367e78945024cc642a59693aa3ecf09 Mon Sep 17 00:00:00 2001 From: Itamar Turner-Trauring Date: Thu, 23 Jun 2022 12:47:33 -0400 Subject: [PATCH] Add a timeout. --- src/allmydata/protocol_switch.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/allmydata/protocol_switch.py b/src/allmydata/protocol_switch.py index 899c1258f..2d2590977 100644 --- a/src/allmydata/protocol_switch.py +++ b/src/allmydata/protocol_switch.py @@ -2,13 +2,14 @@ Support for listening with both HTTP and Foolscap on the same port. """ -from typing import Optional, Tuple +from typing import Optional from twisted.internet.protocol import Protocol -from twisted.internet.interfaces import ITransport +from twisted.internet.interfaces import IDelayedCall from twisted.internet.ssl import CertificateOptions, PrivateCertificate from twisted.web.server import Site from twisted.protocols.tls import TLSMemoryBIOFactory +from twisted.internet import reactor from foolscap.negotiate import Negotiation @@ -36,6 +37,8 @@ class FoolscapOrHttp(Protocol, metaclass=PretendToBeNegotiation): certificate: PrivateCertificate storage_server: StorageServer + _timeout: IDelayedCall + def __init__(self, *args, **kwargs): self._foolscap: Negotiation = Negotiation(*args, **kwargs) self._buffer: bytes = b"" @@ -69,6 +72,9 @@ class FoolscapOrHttp(Protocol, metaclass=PretendToBeNegotiation): self._convert_to_negotiation() return self.initClient(*args, **kwargs) + def connectionMade(self): + self._timeout = reactor.callLater(30, self.transport.abortConnection) + def dataReceived(self, data: bytes) -> None: """Handle incoming data. @@ -80,7 +86,8 @@ class FoolscapOrHttp(Protocol, metaclass=PretendToBeNegotiation): return # Check if it looks like a Foolscap request. If so, it can handle this - # and later data: + # and later data, otherwise assume HTTPS. + self._timeout.cancel() if self._buffer.startswith(b"GET /id/"): transport = self.transport buf = self._buffer