--------------------- PatchSet 476 Date: 2002/12/24 20:49:24 Author: rbcollins Branch: esi Tag: (none) Log: fully working AST Cache Members: src/ESI.cc:1.1.2.81->1.1.2.82 Index: squid3/src/ESI.cc =================================================================== RCS file: /cvsroot/squid-sf//squid3/src/ESI.cc,v retrieving revision 1.1.2.81 retrieving revision 1.1.2.82 diff -u -r1.1.2.81 -r1.1.2.82 --- squid3/src/ESI.cc 24 Dec 2002 11:23:09 -0000 1.1.2.81 +++ squid3/src/ESI.cc 24 Dec 2002 20:49:24 -0000 1.1.2.82 @@ -1,6 +1,6 @@ /* - * $Id: ESI.cc,v 1.1.2.81 2002/12/24 11:23:09 rbcollins Exp $ + * $Id: ESI.cc,v 1.1.2.82 2002/12/24 20:49:24 rbcollins Exp $ * * DEBUG: section 86 ESI processing * AUTHOR: Robert Collins @@ -309,7 +309,7 @@ esiStreamContext *alt; ESISegment::Pointer srccontent; ESISegment::Pointer altcontent; - ESIContext *context; + esiVarState *varState; char *srcurl, *alturl; void fail(esiStreamContext *); void finish(); @@ -702,6 +702,15 @@ return; } + if (context->flags.oktosend && context->flags.finished && context->outbound.getRaw()) { + debug (86,5)("all processing complete, but outbound data still buffered\n"); + assert (!context->flags.clientwantsdata); + /* client MUST be processing the last reply */ + cbdataReferenceDone (context); + return; + } + + if (context->flags.oktosend && context->flags.finished) { StoreIOBuffer tempBuffer = EMPTYIOBUFFER; assert (!context->outbound.getRaw()); @@ -1462,7 +1471,7 @@ if (!hasCachedAST()) parse(); - else + else if (!flags.finishedtemplate) getCachedAST(); if (flags.error) { @@ -2030,6 +2039,7 @@ void esiSequence::provideData (ESISegment::Pointer data, ESIElement *source) { + ESIElement::Pointer lockthis = this; if (processing) debug (86,5) ("esiSequence::provideData: %p data provided during processing\n", this); debug (86,5) ("esiSequence::provideData %p %p %p\n", this, data.getRaw(), source); @@ -2244,7 +2254,7 @@ debug (86,5)("esiInclude::Free %p\n", this); ESISegmentFreeList (srccontent); ESISegmentFreeList (altcontent); - cbdataReferenceDone (context); + cbdataReferenceDone (varState); safe_free (srcurl); safe_free (alturl); } @@ -2285,13 +2295,20 @@ ESIElement::Pointer esiInclude::makeUsable(esiTreeParentPtr newParent, esiVarState &newVarState) const { - assert (0); - return NULL; + esiInclude *resultI = new esiInclude (*this); + ESIElement::Pointer result = resultI; + resultI->parent = newParent; + resultI->varState = cbdataReference (&newVarState); + if (resultI->srcurl) + resultI->src = esiStreamContextNew (resultI); + if (resultI->alturl) + resultI->alt = esiStreamContextNew (resultI); + return result; } esiInclude::esiInclude(esiInclude const &old) : parent (NULL), started (false), sent (false) { - context = NULL; + varState = NULL; flags.onerrorcontinue = old.flags.onerrorcontinue; if (old.srcurl) srcurl = xstrdup (old.srcurl); @@ -2358,7 +2375,7 @@ */ } } - context = cbdataReference(aContext); + varState = cbdataReference(aContext->varState); } void @@ -2370,10 +2387,10 @@ return; started = true; if (src) { - esiIncludeStart (src, srcurl, context->varState); + esiIncludeStart (src, srcurl, varState); /* eaten by the request */ srcurl = NULL; - esiIncludeStart (alt, alturl, context->varState); + esiIncludeStart (alt, alturl, varState); /* eaten by the request */ alturl = NULL; } else { @@ -2497,7 +2514,7 @@ if (flags.finished || flags.failed) { /* Kick ESI Processor */ debug (86,5)("esiInclude %p SubRequest %p completed, kicking processor , status %s\n", this, stream, flags.finished ? "OK" : "FAILED"); - assert (context); + assert (parent.getRaw()); if (!flags.failed) { sent = true; parent->provideData (srccontent.getRaw() ? srccontent:altcontent,this); @@ -2817,9 +2834,9 @@ resultT->parent = newParent; if (attempt.getRaw()) - resultT->attempt = attempt->makeUsable(newParent, newVarState); + resultT->attempt = attempt->makeUsable(resultT, newVarState); if (except.getRaw()) - resultT->except = except->makeUsable(newParent, newVarState); + resultT->except = except->makeUsable(resultT, newVarState); return result; } @@ -3692,7 +3709,7 @@ resultC->makeUsableElements(*this, newVarState); resultC->selectElement(); if (otherwise.getRaw()) - resultC->otherwise = otherwise->makeUsable(this, newVarState); + resultC->otherwise = otherwise->makeUsable(resultC, newVarState); return result; }