Add working HTTP support.

This commit is contained in:
Itamar Turner-Trauring
2022-06-23 07:59:43 -04:00
parent c5724c1d0a
commit 1579530895
3 changed files with 24 additions and 6 deletions

View File

@ -64,7 +64,7 @@ from allmydata.interfaces import (
from allmydata.nodemaker import NodeMaker
from allmydata.blacklist import Blacklist
from allmydata import node
from .protocol_switch import FoolscapOrHttp
from .protocol_switch import update_foolscap_or_http_class
KiB=1024
@ -820,11 +820,7 @@ class _Client(node.Node, pollmixin.PollMixin):
furl_file = self.config.get_private_path("storage.furl").encode(get_filesystem_encoding())
furl = self.tub.registerReference(FoolscapStorageServer(ss), furlFile=furl_file)
(_, _, swissnum) = furl.rpartition("/")
class FoolscapOrHttpWithCert(FoolscapOrHttp):
certificate = self.tub.myCertificate
storage_server = ss
swissnum = swissnum
self.tub.negotiationClass = FoolscapOrHttpWithCert
update_foolscap_or_http_class(self.tub.negotiationClass, self.tub.myCertificate, ss, swissnum.encode("ascii"))
announcement["anonymous-storage-FURL"] = furl

View File

@ -55,6 +55,8 @@ from allmydata.util.yamlutil import (
from . import (
__full_version__,
)
from .protocol_switch import create_foolscap_or_http_class
def _common_valid_config():
return configutil.ValidConfiguration({
@ -707,6 +709,7 @@ def create_tub(tub_options, default_connection_handlers, foolscap_connection_han
the new Tub via `Tub.setOption`
"""
tub = Tub(**kwargs)
tub.negotiationClass = create_foolscap_or_http_class()
for (name, value) in list(tub_options.items()):
tub.setOption(name, value)
handlers = default_connection_handlers.copy()

View File

@ -14,6 +14,7 @@ from twisted.protocols.tls import TLSMemoryBIOFactory
from foolscap.negotiate import Negotiation
from .storage.http_server import HTTPServer
from .storage.server import StorageServer
class ProtocolMode(Enum):
@ -38,6 +39,11 @@ class FoolscapOrHttp(Protocol, metaclass=PretendToBeNegotiation):
Pretends to be a ``foolscap.negotiate.Negotiation`` instance.
"""
# These three will be set by a subclass
swissnum: bytes
certificate = None # TODO figure out type
storage_server: StorageServer
_foolscap: Optional[Negotiation] = None
_protocol_mode: ProtocolMode = ProtocolMode.UNDECIDED
_buffer: bytes = b""
@ -113,3 +119,16 @@ class FoolscapOrHttp(Protocol, metaclass=PretendToBeNegotiation):
def connectionLost(self, reason: Failure) -> None:
if self._protocol_mode == ProtocolMode.FOOLSCAP:
return self._foolscap.connectionLost(reason)
def create_foolscap_or_http_class():
class FoolscapOrHttpWithCert(FoolscapOrHttp):
pass
return FoolscapOrHttpWithCert
def update_foolscap_or_http_class(cls, certificate, storage_server, swissnum):
cls.certificate = certificate
cls.storage_server = storage_server
cls.swissnum = swissnum