Graham Dumpleton
graham.dumpleton at gmail.com
Fri Sep 26 02:43:30 EDT 2008
One last thing to add then. If this doesn't work, I'll have to just try it myself. :-) req.handler = 'default-handler' Graham 2008/9/26 Matt Barnicle <mattb at wageslavery.org>: > ok, that worked.. but unfortunately the blocking issue is still > happening. i've verified that the download controller is returning > apache.DECLINED and the file downloads ok. > > - m@ > >> Try adding: >> >> req.path_info = '' >> >> Graham >> >> 2008/9/26 Matt Barnicle <mattb at wageslavery.org>: >>>> 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 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 >>> >>> ok, getting closer.. now i get a 404 error in the browser saying >>> 'The requested URL /download/file/3 was not found on this server.' >>> and in the apache logs: >>> >>> File does not exist: >>> /var/www/application/public/downloads/music/music.zip/file/3 >>> >>> so it looks like it's taking the last part of the URI and >>> appending >>> it to the physical filename and looking for that... the request >>> URI >>> is 'http://example.com/download/file/3'. the 'download' >>> controller >>> is what manages the music downloads. >>> >>> - m@ >>> >>> >> > > >
|