)
+
class Backend(object):
"""A backend for the Git smart server implementation."""
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()
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)