[master] 89ab873 Make http1_dissect() return a simple good/bad status.

Poul-Henning Kamp phk at FreeBSD.org
Tue Mar 24 13:02:48 CET 2015


commit 89ab87370b41d4125e1cb1cf250df2709d856cb0
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Mar 24 09:51:56 2015 +0000

    Make http1_dissect() return a simple good/bad status.

diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 2a3c3fb..ac76ca2 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -201,7 +201,7 @@ http1_cleanup(struct sess *sp, struct worker *wrk, struct req *req)
 /*----------------------------------------------------------------------
  */
 
-static enum req_fsm_nxt
+static int
 http1_dissect(struct worker *wrk, struct req *req)
 {
 	const char *r_100 = "HTTP/1.1 100 Continue\r\n\r\n";
@@ -242,8 +242,8 @@ http1_dissect(struct worker *wrk, struct req *req)
 		r = write(req->sp->fd, r_400, strlen(r_400));
 		if (r > 0)
 			req->acct.resp_hdrbytes += r;
-		SES_Close(req->sp, SC_RX_JUNK);
-		return (REQ_FSM_DONE);
+		req->doclose = SC_RX_JUNK;
+		return (-1);
 	}
 
 	assert (req->req_body_status == REQ_BODY_INIT);
@@ -267,15 +267,15 @@ http1_dissect(struct worker *wrk, struct req *req)
 			r = write(req->sp->fd, r_417, strlen(r_417));
 			if (r > 0)
 				req->acct.resp_hdrbytes += r;
-			SES_Close(req->sp, SC_RX_JUNK);
-			return (REQ_FSM_DONE);
+			req->doclose = SC_RX_JUNK;
+			return (-1);
 		}
 		r = write(req->sp->fd, r_100, strlen(r_100));
 		if (r > 0)
 			req->acct.resp_hdrbytes += r;
 		if (r != strlen(r_100)) {
-			SES_Close(req->sp, SC_REM_CLOSE);
-			return (REQ_FSM_DONE);
+			req->doclose = SC_REM_CLOSE;
+			return (-1);
 		}
 		http_Unset(req->http, H_Expect);
 	}
@@ -291,15 +291,14 @@ http1_dissect(struct worker *wrk, struct req *req)
 		r = write(req->sp->fd, r_400, strlen(r_400));
 		if (r > 0)
 			req->acct.resp_hdrbytes += r;
-		SES_Close(req->sp, req->doclose);
-		return (REQ_FSM_DONE);
+		return (-1);
 	}
 
 	assert(req->req_body_status != REQ_BODY_INIT);
 
 	HTTP_Copy(req->http0, req->http);	// For ESI & restart
 
-	return (REQ_FSM_MORE);
+	return (0);
 }
 
 /*----------------------------------------------------------------------
@@ -372,8 +371,14 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 			    req->req_step == R_STP_LOOKUP ||
 			    req->req_step == R_STP_RECV);
 
-			if (req->req_step == R_STP_RECV)
-				nxt = http1_dissect(wrk, req);
+			if (req->req_step == R_STP_RECV) {
+				if (http1_dissect(wrk, req)) {
+					SES_Close(req->sp, req->doclose);
+					nxt = REQ_FSM_DONE;
+				} else {
+					nxt = REQ_FSM_MORE;
+				}
+			}
 			if (nxt == REQ_FSM_MORE)
 				nxt = CNT_Request(wrk, req);
 			if (nxt == REQ_FSM_DISEMBARK) {



More information about the varnish-commit mailing list