<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Varnish folks,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Apologies for the repost, but I’m still stuck, and close to running out of ideas.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m trying to combine Varnish with a Tomcat  servlet  to make a fancy reverse proxy.  The idea is that Varnish forwards a URL to the servlet, which uses a 302 redirect to tell Varnish what the “real” URL should be.  For this to work I need Varnish to do two things: 1) cache the 302 redirects from the servlet, and also 2) hide the redirect from the client. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Rob S pointed me to the following trac ticket, which addresses exactly this problem:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><a href="https://www.varnish-cache.org/trac/ticket/411">https://www.varnish-cache.org/trac/ticket/411</a><o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:12.0pt'>But when I use the solution described in the ticket, Varnish errors out. (To be precise, it gets into my vcl_deliver, and then dies with an INCOMPLETE AT error message.)   Here is the relevant part of my default.vcl:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'>sub vcl_hit {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  if (obj.http.X-Magic-Redirect == "1") {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    set req.url = obj.http.Location;<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    restart;<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  }<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>}<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>sub vcl_fetch {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  if (beresp.status == 302) {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    set beresp.http.X-Magic-Redirect = "1";<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    return(deliver);<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  }<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>}<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>sub vcl_deliver {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  if (resp.http.X-Magic-Redirect == "1") {<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    unset resp.http.X-Magic-Redirect;<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    restart;<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  }<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>  return(deliver);<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>}<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p><p class=MsoNormal>So far as I can tell, I have duplicated the solution from the ticket exactly (except for vcl syntax updates corresponding to the evolution of varnish since the ticket was filed).  Here’s what I see in varnishlog:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>    0 CLI          - Rd ping<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Wr 200 PONG 1315497816 1.0<o:p></o:p></p><p class=MsoNormal>   12 SessionOpen  c ::1 57092 :6081<o:p></o:p></p><p class=MsoNormal>   12 ReqStart     c ::1 57092 611991685<o:p></o:p></p><p class=MsoNormal>   12 RxRequest    c GET<o:p></o:p></p><p class=MsoNormal>   12 RxURL        c /create<o:p></o:p></p><p class=MsoNormal>   12 RxProtocol   c HTTP/1.1<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Host: localhost:6081<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.22) Gecko/20110905 Ubuntu/10.10 (maverick) Firefox/3.6.22<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Accept-Language: en-us,en;q=0.5<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Accept-Encoding: gzip,deflate<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Keep-Alive: 115<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Connection: keep-alive<o:p></o:p></p><p class=MsoNormal>   12 RxHeader     c Cache-Control: max-age=0<o:p></o:p></p><p class=MsoNormal>   12 VCL_call     c recv<o:p></o:p></p><p class=MsoNormal>   12 VCL_return   c lookup<o:p></o:p></p><p class=MsoNormal>   12 VCL_call     c hash<o:p></o:p></p><p class=MsoNormal>   12 VCL_return   c hash<o:p></o:p></p><p class=MsoNormal>   12 VCL_call     c miss<o:p></o:p></p><p class=MsoNormal>   12 VCL_return   c fetch<o:p></o:p></p><p class=MsoNormal>   14 BackendOpen  b default 127.0.0.1 37812 127.0.0.1 8080<o:p></o:p></p><p class=MsoNormal>   12 Backend      c 14 default default<o:p></o:p></p><p class=MsoNormal>   14 TxRequest    b GET<o:p></o:p></p><p class=MsoNormal>   14 TxURL        b /urlredirector/#a02/create<o:p></o:p></p><p class=MsoNormal>   14 TxProtocol   b HTTP/1.1<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b Host: localhost:6081<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.22) Gecko/20110905 Ubuntu/10.10 (maverick) Firefox/3.6.22<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b Accept-Language: en-us,en;q=0.5<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b Accept-Encoding: gzip,deflate<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b X-cip: ::1<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b X-Bucket: a02<o:p></o:p></p><p class=MsoNormal>   14 TxHeader     b X-Varnish: 611991685<o:p></o:p></p><p class=MsoNormal>   14 RxProtocol   b HTTP/1.1<o:p></o:p></p><p class=MsoNormal>   14 RxStatus     b 302<o:p></o:p></p><p class=MsoNormal>   14 RxResponse   b Moved Temporarily<o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Server: Apache-Coyote/1.1<o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Location: <a href="http://redirected-localhost:6081/production_webapp/production_env/create">http://redirected-localhost:6081/production_webapp/production_env/create</a><o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Max-Age: 300<o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Content-Type: text/html<o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Content-Length: 86<o:p></o:p></p><p class=MsoNormal>   14 RxHeader     b Date: Thu, 08 Sep 2011 16:03:38 GMT<o:p></o:p></p><p class=MsoNormal>   12 TTL          c 611991685 RFC 120 1315497818 0 0 0 0<o:p></o:p></p><p class=MsoNormal>   12 VCL_call     c fetch<o:p></o:p></p><p class=MsoNormal>   12 VCL_return   c deliver<o:p></o:p></p><p class=MsoNormal>   12 ObjProtocol  c HTTP/1.1<o:p></o:p></p><p class=MsoNormal>   12 ObjStatus    c 302<o:p></o:p></p><p class=MsoNormal>   12 ObjResponse  c Moved Temporarily<o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c Server: Apache-Coyote/1.1<o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c Location: <a href="http://redirected-localhost:6081/production_webapp/production_env/create">http://redirected-localhost:6081/production_webapp/production_env/create</a><o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c Max-Age: 300<o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c Content-Type: text/html<o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c Date: Thu, 08 Sep 2011 16:03:38 GMT<o:p></o:p></p><p class=MsoNormal>   12 ObjHeader    c X-Magic-Redirect: 1<o:p></o:p></p><p class=MsoNormal>   14 Length       b 86<o:p></o:p></p><p class=MsoNormal>   14 BackendReuse b default<o:p></o:p></p><p class=MsoNormal>    0 Debug        - "INCOMPLETE AT: cnt_deliver(196)"<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Rd vcl.load "boot" ./vcl.1P9zoqAU.so<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Wr 200 Loaded "./vcl.1P9zoqAU.so" as "boot"<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Rd vcl.use "boot"<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Wr 200 <o:p></o:p></p><p class=MsoNormal>    0 CLI          - Rd start<o:p></o:p></p><p class=MsoNormal>    0 Debug        - "Acceptor is epoll"<o:p></o:p></p><p class=MsoNormal>    0 CLI          - Wr 200 <o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f587a7f1be0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f5879ff0be0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f58797efbe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f5878feebe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f58787edbe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f5877fecbe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f58777ebbe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f5876feabe0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f58767e9be0 start<o:p></o:p></p><p class=MsoNormal>    0 WorkThread   - 0x7f5875fe8be0 start<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So far as I can tell, my servlet issues the 302 redirect, which gets me into my vcl_fetch subroutine.  vcl_fetch gets me into vcl_deliver, which is where I try to do a restart.  If, in my vcl_fetch, I do a restart instead of a return(deliver), then everything works beautifully (but, of course, then  I don’t get my 302 redirect cached).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m running Varnish 2.1.3 under Ubuntu 10.10, but see the same problem under Varnish 2.1.4 on Ubuntu 11.04.  Thanks in advance for the help. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Jeff<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>