From: cecilihf Date: Thu, 18 Oct 2007 13:38:45 +0000 (+0000) Subject: Make pass mode work for POST requests. Solves ticket #47. X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=566361058f1a8da8c3462cc1f9ba86ebf2fb2df4;p=varnish Make pass mode work for POST requests. Solves ticket #47. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2115 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/cache_fetch.c b/varnish-cache/bin/varnishd/cache_fetch.c index c894f958..37e0298d 100644 --- a/varnish-cache/bin/varnishd/cache_fetch.c +++ b/varnish-cache/bin/varnishd/cache_fetch.c @@ -261,6 +261,9 @@ Fetch(struct sess *sp) int mklen, is_head; struct http_conn htc[1]; int i; + int content_length; + char hdr[20]; + char *ptr; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); @@ -287,6 +290,17 @@ Fetch(struct sess *sp) return (__LINE__); WRK_Reset(w, &vc->fd); http_Write(w, hp, 0); + + /* If a POST request was passed to fetch, we must send + * any pipelined bytes to the backend as well */ + if (!strcmp(http_GetReq(sp->http), "POST")) { + sprintf(hdr, "%ccontent-length:", 15); + assert(http_GetHdr(sp->http, hdr, &ptr)); + content_length = atoi(ptr); + if (sp->htc->pipeline.b != NULL && content_length > 0) + WRK_Write(w, sp->htc->pipeline.b, content_length); + } + if (WRK_Flush(w)) { VBE_UpdateHealth(sp, vc, -1); VBE_ClosedFd(sp->wrk, vc);