Matt Barnicle
mattb at wageslavery.org
Fri Sep 26 03:04:19 EDT 2008
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@ >> >> >
|