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