You may have solved it by now, but I did play with it a few months ago
and worked out a proof-of-concept file upload monitor application. I
got rid of some paste.progress annoyances with my own Monitor
middleware extending paste.progress.UploadProgressMonitor.



import time
from decimal import Decimal

from paste.progress import _ProgressFile, UploadProgressMonitor,
catch_errors
from paste.progress import ENVIRON_RECEIVED, REQUEST_STARTED,
REQUEST_FINISHED
from pylons.wsgiapp import PylonsBaseWSGIApp
from pylons import config

# testing emulated bandwidth
KBPS = 'progress.kbps'
KBPS_DEFAULT = '28.8'


class ProgressFile(_ProgressFile):

    def __init__(self, environ, rfile):
        self._ProgressFile_environ = environ
        self._ProgressFile_rfile = rfile

        if config.get('debug', False):
            kbps = config.get(KBPS, KBPS_DEFAULT)
            self.bps = Decimal(kbps) * 1024

    def readline(self, hint=None):
        if hint is None:
            hint = -1
        chunk = self._ProgressFile_rfile.readline(hint)
        if hasattr(self, 'bps'):
            time.sleep(len(chunk) / self.bps)
        self._ProgressFile_environ[ENVIRON_RECEIVED] += len(chunk)
        return chunk


class Monitor(UploadProgressMonitor):

    def __call__(self, environ, start_response):
        length = environ.get('CONTENT_LENGTH', 0)
        if length and int(length) > self.threshold:
            # replace input file object
            self.monitor.append(environ)
            environ[ENVIRON_RECEIVED] = 0
            environ[REQUEST_STARTED] = time.time()
            environ[REQUEST_FINISHED] = None
            environ['wsgi.input'] = ProgressFile(environ,
environ['wsgi.input'])
            def finalizer(exc_info=None):
                environ[REQUEST_FINISHED] = time.time()
            return catch_errors(self.application, environ,
start_response, finalizer, finalizer)
        return self.application(environ, start_response)


Never tested with newer releases of Pylons and related dependencies,
but please contact me if you still get errors or want to see the
sample app.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to pylons-discuss@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to