X-Git-Url: http://git.samba.org/samba.git/?p=jelmer%2Fdulwich-libgit2.git;a=blobdiff_plain;f=dulwich%2Fserver.py;fp=dulwich%2Fserver.py;h=24dd90693d7abd5acf6477b1549ad4fd3dde93f6;hp=76344739f355fa3f24c6f525fd0792ce0aace570;hb=eacdaab69297593fcc02f0046a3099f7533de03d;hpb=476e9d8ef85c26ef1b78a6b5a0d682783eacf17c diff --git a/dulwich/server.py b/dulwich/server.py index 7634473..24dd906 100644 --- a/dulwich/server.py +++ b/dulwich/server.py @@ -58,6 +58,7 @@ from dulwich.protocol import ( ) + class Backend(object): """A backend for the Git smart server implementation.""" @@ -654,20 +655,26 @@ class ReceivePackHandler(Handler): self.proto.write_pkt_line(None) +# Default handler classes for git services. +DEFAULT_HANDLERS = { + 'git-upload-pack': UploadPackHandler, + 'git-receive-pack': ReceivePackHandler, + } + + class TCPGitRequestHandler(SocketServer.StreamRequestHandler): + def __init__(self, handlers, *args, **kwargs): + self.handlers = handlers and handlers or DEFAULT_HANDLERS + SocketServer.StreamRequestHandler.__init__(self, *args, **kwargs) + def handle(self): proto = ReceivableProtocol(self.connection.recv, self.wfile.write) command, args = proto.read_cmd() - # switch case to handle the specific git command - if command == 'git-upload-pack': - cls = UploadPackHandler - elif command == 'git-receive-pack': - cls = ReceivePackHandler - else: - return - + cls = self.handlers.get(command, None) + if not callable(cls): + raise GitProtocolError('Invalid service %s' % command) h = cls(self.server.backend, args, proto) h.handle() @@ -677,6 +684,11 @@ class TCPGitServer(SocketServer.TCPServer): allow_reuse_address = True serve = SocketServer.TCPServer.serve_forever - def __init__(self, backend, listen_addr, port=TCP_GIT_PORT): + def _make_handler(self, *args, **kwargs): + return TCPGitRequestHandler(self.handlers, *args, **kwargs) + + def __init__(self, backend, listen_addr, port=TCP_GIT_PORT, handlers=None): self.backend = backend - SocketServer.TCPServer.__init__(self, (listen_addr, port), TCPGitRequestHandler) + self.handlers = handlers + SocketServer.TCPServer.__init__(self, (listen_addr, port), + self._make_handler)