internal redirect with byterange (was: open downloaded file)

2001-08-30 Thread Thomas Bach

Hello again

I'm still having troubles delivering my pdf-files ... I'm using the 
code-snippets Geoffrey Young gave me, but i need to use an internal 
redirect, because i provide the files with better (longer) filenames. I 
can't find any tutorials or example-code for it, so I hope you guys can 
help me ...

so what I'm actually doing is:

initial request:
- check permissions
- search the filename of the filesystem
- if it is not a static file: generate  deliever file
- otherwise: make an internal redirect to the specific file

handle the internal redirect:
- generating header
- deliver file (if necessary with byterange ...)

this looks approx. like this:

if ($r-is_initial_req) {
   if (static ()) {
 $r-internal_redirect (newfilename);
   }
   else {
 $r-send_header ();
 $r-send_fd($fh);
   };
}
else {
   $s-headers_out-set('Accept-Ranges' = 'bytes');
   $r-headers_out-set(Content-Disposition =
inline; filename=$name);
   my $size = stat($file)-size;
   $r-set_content_length($size);

   $r-content_type($contenttypes{$type});

   # determine if the request is a range request
   my $range_request = $r-set_byterange;

   # yea or nea
   if ((my $status = $r-meets_conditions) == OK) {
 $r-send_http_header;
   }
   else {
 return $status;
   }

   my $fh = IO::File-new($file);

   # handle a range request properly
   if (($type eq 'pdf')  $range_request) {
 while( my($offset, $length) = $r-each_byterange) {
   seek $fh, $offset, 0;
   $r-send_fd($fh, $length);
 }
   }
   else {
 $r-send_fd($fh);
   };
   $fh-close();
   return DONE;
}

My problem is now, that i know not exactly what i should return if i make 
an internal_redirect and what i have to return handling this internal_redirect

accessing a file like this results in the access-log in:

[30/Aug/2001:17:13:13 +0200] GET 
/files/sid00017/AR_1000A-TSS_report-TSS.PDF HTTP/1.1 200 32768 
https://ida.festbrueder.ch/site/files.pl?siteid=17; Mozilla/4.0 
(compatible; MSIE 5.01; Windows

[30/Aug/2001:17:13:14 +0200] GET /files/sid00017/AR_1000A-TSS_report-TSS.PDF
HTTP/1.1 200 40960 - Mozilla/4.0 (compatible; MSIE 5.01; Windows 
NT)195.141.44.1 - -

[30/Aug/2001:17:13:14 +0200] GET 
/files/sid00017/AR_1000A-TSS_report-TSS.PDF HTTP/1.1 206 397776 - 
Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)

All three entries comes out of an access to one file ... *?* am i doing 
this right?


Il'd be very thankfull if you could help me inhere ...
I'm really in trouble with this, and i won't loose my pleasure using 
mod_perl ;-)

Thank you very much in advance!!

Thomas Bach


think karo.. www.bkaro.net




RE: internal redirect with byterange (was: open downloaded file)

2001-08-30 Thread Geoffrey Young

 

 
 accessing a file like this results in the access-log in:
 
 [30/Aug/2001:17:13:13 +0200] GET 
 /files/sid00017/AR_1000A-TSS_report-TSS.PDF HTTP/1.1 200 32768 
 https://ida.festbrueder.ch/site/files.pl?siteid=17; Mozilla/4.0 
 (compatible; MSIE 5.01; Windows
 
 [30/Aug/2001:17:13:14 +0200] GET 
 /files/sid00017/AR_1000A-TSS_report-TSS.PDF
 HTTP/1.1 200 40960 - Mozilla/4.0 (compatible; MSIE 5.01; Windows 
 NT)195.141.44.1 - -
 
 [30/Aug/2001:17:13:14 +0200] GET 
 /files/sid00017/AR_1000A-TSS_report-TSS.PDF HTTP/1.1 206 397776 - 
 Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)
 
 All three entries comes out of an access to one file ... *?* 
 am i doing 
 this right?
 

yes, that's right - this is how your browser plugin handles byterange
requests, usually by terminating the current request and initiating a new
one with the appropriate Range headers.  last time I checked Netscape ended
up with 2 requests and MSIE with 3.  that final request ought to be a 206,
though.  add a PerlLogHandler that spits out $r-as_string (such as
Apache::DumpHeaders or Apache::DebugInfo) to see what is really going on.

fear not - Apache detects the closed connection and all writes to the wire
are changed into noops, meaning your handler will still run but not send any
data to the client.  sounds strange, but the point of Range requests was to
reduce bandwith, not the processes of your server ;)

other than that, your code looks ok on first glance.  what this the only
problem?

HTH

--Geoff
--Geoff