X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=apt_p2p%2FHTTPServer.py;h=87e235f729fea40674086ef826975c12f88ef5c4;hb=a9f0deccc4673d5332622ce40407ff009af6c8a3;hp=d6c12bf3ce402a949700b53887a4fd94c5a06d2a;hpb=1e0537c366d9c95b4cda1b105fbcca52a9dbbb3a;p=quix0rs-apt-p2p.git diff --git a/apt_p2p/HTTPServer.py b/apt_p2p/HTTPServer.py index d6c12bf..87e235f 100644 --- a/apt_p2p/HTTPServer.py +++ b/apt_p2p/HTTPServer.py @@ -3,6 +3,7 @@ from urllib import quote_plus, unquote_plus from binascii import b2a_hex +import operator from twisted.python import log from twisted.internet import defer @@ -34,7 +35,8 @@ class FileDownloader(static.File): 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) + resp.addCallbacks(self._renderHTTP_done, self._renderHTTP_error, + callbackArgs = (req, ), errbackArgs = (req, )) else: resp = self._renderHTTP_done(resp, req) return resp @@ -52,6 +54,16 @@ class FileDownloader(static.File): return resp + def _renderHTTP_error(self, err, req): + log.msg('Failed to render %s: %r' % (req.uri, err)) + log.err(err) + + if self.manager: + path = 'http:/' + req.uri + return self.manager.get_resp(req, path) + + return err + def createSimilarFile(self, path): return self.__class__(path, self.manager, self.defaultType, self.ignoredExts, self.processors, self.indexNames[:]) @@ -137,6 +149,8 @@ class UploadThrottlingProtocol(ThrottlingProtocol): Uploads use L{FileUploaderStream} or L{twisted.web2.stream.MemorySTream}, apt uses L{CacheManager.ProxyFileStream} or L{twisted.web.stream.FileStream}. """ + + stats = None def __init__(self, factory, wrappedProtocol): ThrottlingProtocol.__init__(self, factory, wrappedProtocol) @@ -145,9 +159,19 @@ class UploadThrottlingProtocol(ThrottlingProtocol): def write(self, data): if self.throttle: ThrottlingProtocol.write(self, data) + if self.stats: + self.stats.sentBytes(len(data)) else: ProtocolWrapper.write(self, data) + def writeSequence(self, seq): + if self.throttle: + ThrottlingProtocol.writeSequence(self, seq) + if self.stats: + self.stats.sentBytes(reduce(operator.add, map(len, seq))) + else: + ProtocolWrapper.writeSequence(self, seq) + def registerProducer(self, producer, streaming): ThrottlingProtocol.registerProducer(self, producer, streaming) streamType = getattr(producer, 'stream', None) @@ -196,6 +220,8 @@ class TopLevel(resource.Resource): 'betweenRequestsTimeOut': 60}) self.factory = ThrottlingFactory(self.factory, writeLimit = self.uploadLimit) self.factory.protocol = UploadThrottlingProtocol + if self.manager: + self.factory.protocol.stats = self.manager.stats return self.factory def render(self, ctx):