<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>