You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2002/10/15 20:05:43 UTC
DO NOT REPLY [Bug 13662] New: -
If-Modifed-Since results in incorrect Content-Type header
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13662>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13662
If-Modifed-Since results in incorrect Content-Type header
Summary: If-Modifed-Since results in incorrect Content-Type
header
Product: Tomcat 3
Version: 3.3.1 Final
Platform: All
OS/Version: Other
Status: NEW
Severity: Normal
Priority: Other
Component: Unknown
AssignedTo: tomcat-dev@jakarta.apache.org
ReportedBy: puckman@taglab.com
When doing an "If-Modified-Since" request against a static file
(StaticInterceptor), in the case of a "304 Not Modified", the Content-Type
header is always supplied as "text/html".
This results in problems in our apache httpd 1.3.26 mod_proxy reverse proxy
cache. mod_proxy updates the Content-Type field of the object with the new
data. E.g. a gif file will upon entering the cache have the correct
type "image/gif", but when anyone does an "If-Modified-Since" request and the
cache asks tomcat if the content is up to date, the type gets overwritten
with "text/html" which was supplied by tomcat. This then results in images
with the wrong content type.
According to W3C spec of 304 response header
(http://www.w3.org/Protocols/HTTP/HTRESP.html):
"Response headers are as if the client had sent a HEAD request, but limited to
only those headers which make sense in this context. This means only headers
that are relevant to cache managers and which may have changed independently
of the document's Last-Modified date. Examples include Date , Server and
Expires . "
I suspect mod_proxy interprets this *very* broadly and updates most headers
that are sent over. Arguably changing the Content-Type does not make sense in
this context, and such both Apache httpd and Apache Tomcat should change the
behaviour.
Consider the following:
$ curl -I http://mytomcat:18000/images/bit.gif
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 48
Last-Modified: Thu, 03 Oct 2002 15:49:27 GMT
Date: Tue, 15 Oct 2002 16:46:03 GMT
Server: Tomcat Web Server/3.3.1 Final ( JSP 1.1; Servlet 2.2 )
$ curl -I http://mytomcat:18000/images/bit.gif -H "If-Modified-Since: Thu, 03
Oct 2002 15:49:27 GMT"
HTTP/1.0 304 Not Modified
Content-Type: text/html
Date: Tue, 15 Oct 2002 16:46:22 GMT
Server: Tomcat Web Server/3.3.1 Final ( JSP 1.1; Servlet 2.2 )
The second 'curl' shows the problem.
A quick fix is not to send the Content-Type header on 304. I believe that
would also be more close to spec. Looking at the Tomcat code I've found that
the internal StatusHandler always sets "text/html". Here is a patch that makes
the StatusHandler only do that in case it isn't a 304:
$ diff -u ErrorHandler.java-2002-10-15 ErrorHandler.java
--- ErrorHandler.java-2002-10-15 Tue Mar 26 15:36:55 2002
+++ ErrorHandler.java Tue Oct 15 18:56:23 2002
@@ -683,7 +683,6 @@
String msg=(String)req.getAttribute("javax.servlet.error.message");
String errorURI = res.getErrorURI();
- res.setContentType("text/html");
// res is reset !!!
// status is already set
int sc=res.getStatus();
@@ -691,6 +690,11 @@
if( sc == 304 ) {
//NotModified must not return a body
return;
+ } else {
+ // don't set a content type if we are answering If-Modified-Since.
+ // Proxy caches might update their cached content-type with this
+ // info (mod_proxy does it). Martin Algesten 15th Oct, 2002.
+ res.setContentType("text/html");
}
if( sbNote==0 ) {
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>