tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Thomas <ma...@apache.org>
Subject Re: Byte Serving and PDFs with the DefaultServlet
Date Thu, 09 Oct 2008 15:22:11 GMT
vitor.swaid@embraer.com.br wrote:
> Hello, I'm new to the list. Hello to every one. Sorry if I'm posting this 
> message in the wrong place. If so please advise me to fix it.

>From a quick scan of your e-mail it looks like you have a valid bug
here. To make sure this doesn't get lost, please add it to the Tomcat
issue tracker at http://issues.apache.org/bugzilla

Cheers,

Mark

> 
> I was asked to make a PDF functionality called Fast Web View work in a 
> Tomcat application. In my initial tests, as I will describe, it did not 
> worked.
> 
> I started downloading the version 6.0.18 and after that I downloaded the 
> trunk SVN branch and compiled every thing (comment: a hard job at the 
> first time, ah? sorry, I had many web proxy issues), 
> 
> I wrote a small HTML just for testing purpose. The "index.html" file is 
> something like:
> 
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "
> http://www.w3.org/TR/html4/strict.dtd">
> <html>
>   <head>
>     <meta http-equiv="Accept-Ranges" content="bytes">
>   </head>
>   <body>
>     <table border="1" align="center">
>       <tr>   <td align='center' valign='middle'> 
>           <a href='FIRST_FAST_WEB_VIEW_READY.PDF' 
> type='application/pdf'>FIRST_FAST_WEB_VIEW_READY.PDF</a>
>         </td>
>         <td align='center' valign='middle'>32.09 MB   </td>
>       </tr>
>       <tr>  <td align='center' valign='middle'>
>         <a href='SECOND_FAST_WEB_VIEW_READY.PDF' 
> type='application/pdf'>SECOND_FAST_WEB_VIEW_READY.PDF</a>
>         </td>
>         <td align='center' valign='middle'>41.72 MB  </td>
>       </tr>
>       <tr> <td align='center' valign='middle'> 
>           <a href='NTH_FAST_WEB_VIEW_READY.PDF' 
> type='application/pdf'>NTH_FAST_WEB_VIEW_READY.PDF</a>
>         </td>
>         <td align='center' valign='middle'>25.83 MB   </td>
>       </tr>
>     </table>
>   </body>
> </html>
> 
> I just created a folder in the webapps folder named PDFs and placed 
> everything there.
> 
> When I started Tomcat, opened the page and click on the first PDF link (on 
> other link the result was the same) with the address 
> http://localhost:8080/PDFs/, I got the following result:
> - The file was found by Tomcat
> - Adobe Reader works properlly requesting a "byte served" content (I also 
> configured the property useAcceptRanges on the web.xml file)
> - Tomcat returned a header response 200 OK and some data
> - Adobe requests a partial content with a few range descriptors like: 
> 500-999, 7000-7999 (I rounded the sample here)
> - Tomcat send a response (http 206)  multipart/byterange for the above 
> ranges
> - Adobe Reader locks and don't ask any more ranges
> - The browser also locks and after a long wait time it returns a error 
> message of problems on file.
> 
> I started them analysing the response stream with an http protocol 
> analyser plug-in for the browser.
> 
> In the RFC2616 I noted that the response should be as the below sample 
> cutted from the RFC2616:
> 
>   HTTP/1.1 206 Partial Content
>    Date: Wed, 15 Nov 1995 06:25:24 GMT
>    Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
>    Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
> 
>    --THIS_STRING_SEPARATES
>    Content-type: application/pdf
>    Content-range: bytes 500-999/8000
> 
>    ...the first range...
>    --THIS_STRING_SEPARATES
>    Content-type: application/pdf
>    Content-range: bytes 7000-7999/8000
> 
>    ...the second range
>    --THIS_STRING_SEPARATES--
> 
> But I noted that Tomcat was returning the following stream:
> 
>   HTTP/1.1 206 Partial Content
>    Date: Wed, 15 Nov 1995 06:25:24 GMT
>    Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
>    Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
> 
>    --THIS_STRING_SEPARATES
>    Content-range: bytes 500-999/8000
> 
> 
>    ...the first range...
>    --THIS_STRING_SEPARATES
>    Content-range: bytes 7000-7999/8000
> 
> 
>    ...the second range
>    --THIS_STRING_SEPARATES--
> 
> 
> Please note the lack of the "Content-type: application/pdf" message and 
> additional line break from the RFC sample and the Tomcat stream.
> 
> After some research I found the DefaultServlet Class where the stream for 
> partial content and multi range requests are served.
> On Tomcat 6.0 at java\org\apache\catalina\servlets and on Tomcat 5.5 at 
> container\catalina\src\share\org\apache\catalina\servlets
> 
> The first thing that happens to make it work was the add of 
> "useAcceptRanges" on the config file (web.xml) and the fix for it on 
> Tomcat 6.0.x class source code on the SVN repository (thankyou). It really 
> made difference because the HTTP header response must have "Accept-Ranges: 
> bytes" string to allow clients make byte requests (at least Adobe Reader).
> 
> The second thing is in the "copy" methods. There is a check for the 
> "contentType" variable and for any reason the method that try to retrieve 
> its value, before the call for "copy" method, is always returning null.
> So, in the if statement within the "copy" methods:
> 
>             if (contentType != null)
>                 ostream.println("Content-Type: " + contentType);
> 
> and
> 
>             if (contentType != null)
>                 writer.println("Content-type: " + contentType);
> 
> I added a "forced" result of :
> 
>             if (contentType != null)
>                 ostream.println("Content-type: " + contentType);
>             else
>                 ostream.println("Content-type: application/pdf");
> 
> and 
> 
>             if (contentType != null)
>                 writer.println("Content-type: " + contentType);
>             else
>                 writer.println("Content-type: application/pdf");
> 
> In my environment it is sufficient because my big deal is with PDF files, 
> but I know that it is not the most elegant solution neither can be a 
> definitive solution.
> 
> As I am not a java programmer, I ask for the list to handle this issue.
> If it sound completely nuts please forgive me.
> I'm available to help with tests for this issue. Please contact me through 
> the list or directly.
> 
> Best regards to all. 
> Sincerely,
> 
> Antonio Vitor Elias Swaid Jr
> Technical Publications Development
> EMBRAER - São José dos Campos
> Fone: +55 12 3927-8364 Fax: +55 12 3927-3132
> This message is intended solely for the use of its addressee and may 
> contain privileged or confidential information. If you are not the 
> addressee you should not distribute, copy or file this message. In this 
> case, please notify the sender and destroy its contents immediately.
> Esta mensagem é para uso exclusivo de seu destinatário e pode conter 
> informações privilegiadas e confidenciais. Se você não é o destinatário 
> não deve distribuir, copiar ou arquivar a mensagem. Neste caso, por favor, 
> notifique o remetente da mesma e destrua imediatamente a mensagem.



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message