r2123 - trunk/varnish-cache/bin/varnishd

cecilihf at projects.linpro.no cecilihf at projects.linpro.no
Fri Oct 19 10:51:41 CEST 2007


Author: cecilihf
Date: 2007-10-19 10:51:40 +0200 (Fri, 19 Oct 2007)
New Revision: 2123

Modified:
   trunk/varnish-cache/bin/varnishd/cache_fetch.c
Log:
Improved handling of pass for POST requests.


Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_fetch.c	2007-10-19 08:50:50 UTC (rev 2122)
+++ trunk/varnish-cache/bin/varnishd/cache_fetch.c	2007-10-19 08:51:40 UTC (rev 2123)
@@ -261,9 +261,10 @@
 	int mklen, is_head;
 	struct http_conn htc[1];
 	int i;
-	int content_length;
-	char hdr[20];
-	char *ptr;
+	int content_length, content_written;
+	int read;
+	char *ptr, *endp;
+	char *p = NULL;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
@@ -293,12 +294,21 @@
 	
 	/* 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(http_GetHdr(sp->http, H_Content_Length, &ptr)) {
+		endp = ptr + strlen(ptr);
+		content_length = (int)strtol(ptr, &endp, 10);
+		content_written = 0;
+		while (content_written < content_length) {
+			p = malloc(content_length);
+			read = HTC_Read(sp->htc, p, content_length);
+			content_written += WRK_Write(w, p, read);
+			if (WRK_Flush(w)) {
+				VBE_UpdateHealth(sp, vc, -1);
+				VBE_ClosedFd(sp->wrk, vc);
+				return (__LINE__);
+			}
+			free(p);
+		}
 	}
 	
 	if (WRK_Flush(w)) {




More information about the varnish-commit mailing list