X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=apt_dht%2FHTTPServer.py;h=20f94cdfa5e3088193591455b269a1fbd6963b15;hb=2995ddfcfe23b24e366156530b2207d434fb8344;hp=688b29694ee5e14dbe6d13bbddd15179dc06d4ae;hpb=dd75e47b4d4ee40dae492753a226d5a42ac73c1c;p=quix0rs-apt-p2p.git diff --git a/apt_dht/HTTPServer.py b/apt_dht/HTTPServer.py index 688b296..20f94cd 100644 --- a/apt_dht/HTTPServer.py +++ b/apt_dht/HTTPServer.py @@ -1,5 +1,10 @@ -import os.path, time +from urllib import unquote_plus + +from twisted.python import log +from twisted.internet import defer +#from twisted.protocols import htb +#from twisted.protocols.policies import ThrottlingFactory from twisted.web2 import server, http, resource, channel from twisted.web2 import static, http_headers, responsecode @@ -9,37 +14,60 @@ class FileDownloader(static.File): self.manager = manager super(FileDownloader, self).__init__(path, defaultType, ignoredExts, processors, indexNames) - def render(self, req): - resp = super(FileDownloader, self).render(req) + def renderHTTP(self, req): + log.msg('Got request for %s from %s' % (req.uri, req.remoteAddr)) + resp = super(FileDownloader, self).renderHTTP(req) + if isinstance(resp, defer.Deferred): + resp.addCallback(self._renderHTTP_done, req) + else: + resp = self._renderHTTP_done(resp, req) + return resp + + def _renderHTTP_done(self, resp, req): + log.msg('Initial response to %s: %r' % (req.uri, resp)) if self.manager: - if resp != responsecode.NOT_FOUND: - return self.manager.check_freshness(req.uri, resp.headers.getHeader('Last-Modified'), resp) + path = 'http:/' + req.uri + if resp.code >= 200 and resp.code < 400: + return self.manager.check_freshness(req, path, resp.headers.getHeader('Last-Modified'), resp) - return self.manager.get_resp(req.uri) + log.msg('Not found, trying other methods for %s' % req.uri) + return self.manager.get_resp(req, path) return resp def createSimilarFile(self, path): return self.__class__(path, self.manager, self.defaultType, self.ignoredExts, self.processors, self.indexNames[:]) + + class TopLevel(resource.Resource): addSlash = True - def __init__(self, directory, manager): + def __init__(self, directory, db, manager): self.directory = directory + self.db = db self.manager = manager - self.subdirs = [] + self.factory = None + + def getHTTPFactory(self): + if self.factory is None: + self.factory = channel.HTTPFactory(server.Site(self), + **{'maxPipeline': 10, + 'betweenRequestsTimeOut': 60}) +# serverFilter = htb.HierarchicalBucketFilter() +# serverBucket = htb.Bucket() +# +# # Cap total server traffic at 20 kB/s +# serverBucket.maxburst = 20000 +# serverBucket.rate = 20000 +# +# serverFilter.buckets[None] = serverBucket +# +# self.factory.protocol = htb.ShapedProtocolFactory(self.factory.protocol, serverFilter) +# self.factory = ThrottlingFactory(self.factory, writeLimit = 300*1024) + return self.factory - def addDirectory(self, directory): - path = "~" + str(len(self.subdirs)) - self.subdirs.append(directory) - return path - - def removeDirectory(self, directory): - loc = self.subdirs.index(directory) - self.subdirs[loc] = '' - def render(self, ctx): return http.Response( 200, @@ -49,32 +77,40 @@ class TopLevel(resource.Resource):
TODO: eventually some stats will be shown here.