Graham Dumpleton
graham.dumpleton at gmail.com
Thu Sep 25 01:16:38 EDT 2008
2008/9/25 Matt Barnicle <mattb at wageslavery.org>: >> 2008/9/24 Matt Barnicle <mattb at wageslavery.org>: >>>> Are you setting a content length on the response before calling >>>> req.sendfile()? >>>> >>>> How many concurrent requests for these files are you receiving and >>>> how long does it take to download a file? >>>> >>>> Graham >>> >>> yes, i believe so.. now that you mention it, i haven't verified the >>> file size from the code below, i will do that to be sure. here is >>> the code: >>> >>> file_path = self.conf.run.app_folder + 'public' + download.path >>> file_stat = os.stat(file_path) >>> file_size = str(file_stat.st_size) >>> >>> self.req.headers_out['Content-Length'] = file_size >>> self.req.headers_out['Content-Disposition'] = 'attachment; >>> filename=%s' % os.path.basename(file_path) >>> >>> bytes_sent = self.req.sendfile(file_path) >> >> BTW, now that you are using mod_python 3.3.1, instead of using >> req.sendfile(), you could possibly delegate serving of the static > file >> back to Apache. From memory this can be done using: >> >> req.filename = self.conf.run.app_folder + 'public' + download.path >> req.finfo = apache.stat(req.filename, apache.APR_FINFO_MIN) >> return apache.DECLINED >> >> By returning apache.DECLINED you say mod_python handler will not >> actually handle it, and by having updated req.filename and >> req.fileinfo updated to new file, when it falls through to >> default-handler it should serve it as static file. >> >> Doing it this way should bypass prior Apache access control checks. >> Thus file doesn't need to be in Apache document tree or anywhere else >> that is accessible. >> >> I believe doing it this way also has benefit that Apache will >> automatically set various headers that you probably wouldn't be. >> >> Please let us know if this alternate method works. >> >> Graham > > i'm trying to get this working, but running into a snag.. i'm > actually running a custom written MVC framework to serve the site > pages. the way it was written was to have mod_python be the handler > for all requests, and a rewrite rule is written to route all > requests through index.psp which sits in the document root. i tried > adding this code to the index.psp but found quickly that it wouldn't > work. so it seemed to me that the correct way to do it was to > change the way pages are served, and run everything through a proper > request handler, which could return the apache status as described > above. had to restructure some of the code, but i did eventually > *sort of* get it working. > > first, i can't seem to figure out how to get all requests, no matter > what the URI, to be processed through the handler (which for all > intents and purposes let's call the base controller). i tried the > following but it doesn't seem to do what i want: > > DocumentRoot /var/www/my/application/public > <Directory /var/www/my/application/public> > AddHandler python-program .py > PythonHandler myhandler > </Directory> Use SetHandler instead of AddHandler. DocumentRoot /var/www/my/application/public <Directory /var/www/my/application/public> SetHandler python-program PythonHandler myhandler </Directory> Graham > with the above configuration, when i go to the home page, i see a > directory listing instead of the handler being executed.. > > the previous way this was working was to put a rewrite rule in > .htaccess that routes all requests through index.psp. so i tried > changing that to route everything through myhandler.py, and that > does sort of work, but then i can't seem to read the uri that's in > the location bar. when i read req.uri, it's just /myhandler.py. > the way we were doing that before was with the following code, which > no longer works now that i'm serving out of a custom handler, it > throws an error: > > req.add_common_vars() > env_vars = req.subprocess_env > uri = env_vars['REDIRECT_URL'].strip('/') > > i'm so close to getting this working! > > thanks for your help, > > - m@ > >
|