Graham Dumpleton
grahamd at dscpl.com.au
Mon Apr 17 17:44:30 EDT 2006
On 18/04/2006, at 3:05 AM, greg wrote: > Thanks Graham, for sharing your insight. > > A question about the example: > What does the normal content handler do with the request after the > fixup handler returns apache.DONE? Nothing, no further handler phases for the request will be called. DONE means the request has been satisfied and nothing else needs to be done. > I expect I will keep the file check and upload monitoring inside a > single handler for now. I am working on commercial deployment, so I > have to take a 'wait-and-see' approach with features, despite my > personal curiousity about how the dev team is shaping the libs. > > What would mod_python.conf look like? If one handler is doing > everything, is this correct? > > <Directory myserver/www/uploads> > AddHandler mod_python * You might mean: SetHandler mod_python if your expectation is that everything against the directory is to be processed by the handler. Or: AddHandler mod_python .py if request must have .py extension in URL. Ie., can't be '*'. > PythonPath "['/foo/mypy/'] + sys.path" > PythonHandler fixup > #PythonDebug On > </Directory> The reason why I did it as a separate handler is that you can't avoid it if you are using something like mod_python.publisher or mod_python.psp to implement your upload handler. This is because both process the form before any code of you own would have a chance to run, thus making the check useless. If you are using mod_python.publisher you choices thus are: <Directory myserver/www/uploads> SetHandler mod_python PythonFixupHandler check_for_large_uploads PythonHandler mod_python.publisher ... </Directory> or if you have some philosophical problem with using the fixup handler phase, use a stacked handler in content phase. <Directory myserver/www/uploads> SetHandler mod_python PythonHandler check_for_large_uploads PythonHandler mod_python.publisher ... </Directory> If you aren't using mod_python.publisher, then yes you could incorporate the check from check_for_large_uploads into your own custom handler instead. <Directory myserver/www/uploads> SetHandler mod_python PythonHandler your_upload_handler ... </Directory> Graham > Greg > >> Because some handlers such as mod_python.publisher have already >> consumed request content by the time your code has been called, >> the simplest thing to do is to do the check in a fixup handler >> which is >> run in addition too, but before the normal content handler. >> For example: >> PythonFixupHandler check_for_large_uploads >> # check_for_large_uploads.py >> from mod_python import apache >> UPLOAD_LIMIT = 1000000 >> def fixuphandler(req): >> length = int(req.headers_in.get("Content-Length", "0")) >> if length >= UPLOAD_LIMIT: >> req.content_type = 'text/plain' >> req.status = apache.HTTP_BAD_REQUEST >> req.write('upload too big\n') >> return apache.DONE >> return apache.OK >> The important bit is that the fixup handler must cause call to >> following >> content handler to be aborted. This is why it explicitly sets >> req.status >> and then returns apache.DONE instead of apache.OK. The handler >> needs to also construct any custom response. >> Not sure there is a simple way of handling an upload that takes too >> long. I haven't looked at the file_callback feature to see whether >> that >> might make it easier. >> Graham > > _______________________________________________ > Mod_python mailing list > Mod_python at modpython.org > http://mailman.modpython.org/mailman/listinfo/mod_python
|