cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Klimetschek <alexander.klimetsc...@mindquarry.com>
Subject Re: Broken caching of servlet: source in some cases
Date Fri, 20 Apr 2007 13:14:28 GMT
Grzegorz Kossakowski schrieb:
> Grek (nickname/easier form for English speaking people) or Grzegorz (real name) :-)

Sorry, Grek, I didn't know this! Would be interesting to know how your name 
is pronounced? Does one simply skip the first "z"?

> Could you also provide some minimal block setup where the bug occurs?
 > This way we would think about writing test case for it.

Yup, but I still don't understand why it appears in that specific case 
although I know multiple ways to fix it ;-)

Problem
=======

My sitemaps look like that (Note that I am running everything with a 
NonCaching pipeline):

<transform src="servlet:/aaa.xsl" />
  ->

     <generate src="servlet:resources:/bbb.xsl>

      ->
         <read src="bbb.xsl"/>
      <-

     <serialize type="xml" />

  <- // response is empty, because its misinterpreted as not modified

The response is misinterpreted as not modified, but it is not cached either 
thus he returns an empty result.

The problem disappears when the generate/serialize of bbb.xsl is replaced by 
a reader. This is because the ResourceReader behaves different than the 
pipeline when the Last-Modified is set (see below).


Solutions
=========

Well, there are multiple fixes. The best one IMHO is to fix a bug in 
HttpEnvironment.isResponseModified() [1]. It should *not* set the 
Last-Modified value if it is invalid == -1 (which is the case if the servlet 
source cannot determine the last modified value). The other two places where 
this is set (ResourceReader [2] and LinkRewriterReader [3] .setupHeaders()) 
do a > 0 check:

     if (lastModified > 0) {
         response.setDateHeader("Last-Modified", lastModified);
     }

AFAIK setting a "-1" last modified header is not according the HTTP spec, 
one should not include the header in that case. But why am I the first one 
to spot that problem? It's a central part of cocoon's caching algorithm.

WDYT?

Another way to fix that is by making sure 
ServletConnection.getLastModified() returns 0 in case the header has the 
value -1.

[1] 
http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/http/HttpEnvironment.java

[2] 
http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-components/src/main/java/org/apache/cocoon/reading/ResourceReader.java

[3] 
http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-components/src/main/java/org/apache/cocoon/servletservice/components/LinkRewriterReader.java



Alex

-- 
Alexander Klimetschek
http://www.mindquarry.com


Mime
View raw message