Commit fb711185 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Try to make the H1 state engine look more like one.

parent dedff8e1
...@@ -330,7 +330,6 @@ SES_Proto_Sess(struct worker *wrk, void *arg) ...@@ -330,7 +330,6 @@ SES_Proto_Sess(struct worker *wrk, void *arg)
cache_param->http_req_size, cache_param->http_req_hdr_len); cache_param->http_req_size, cache_param->http_req_hdr_len);
if (sp->sess_step < S_STP_H1_LAST) { if (sp->sess_step < S_STP_H1_LAST) {
sp->sess_step = S_STP_H1NEWREQ;
wrk->task.func = SES_Proto_Req; wrk->task.func = SES_Proto_Req;
wrk->task.priv = req; wrk->task.priv = req;
} else if (sp->sess_step < S_STP_PROXY_LAST) { } else if (sp->sess_step < S_STP_PROXY_LAST) {
......
...@@ -331,10 +331,33 @@ HTTP1_Session(struct worker *wrk, struct req *req) ...@@ -331,10 +331,33 @@ HTTP1_Session(struct worker *wrk, struct req *req)
return; return;
} }
while (1) {
switch (sp->sess_step) {
case S_STP_H1NEWSESS:
if (VTCP_blocking(sp->fd)) {
if (errno == ECONNRESET)
SES_Close(sp, SC_REM_CLOSE);
else
SES_Close(sp, SC_TX_ERROR);
AN(http1_cleanup(sp, wrk, req));
return;
}
sp->sess_step = S_STP_H1NEWREQ;
break;
case S_STP_H1NEWREQ:
nxt = http1_wait(sp, wrk, req);
if (nxt != REQ_FSM_MORE)
return;
sp->sess_step = S_STP_H1WORKING;
req->req_step = R_STP_RECV;
break;
case S_STP_H1BUSY:
/* /*
* Return from waitinglist. Check to see if the remote has left. * Return from waitinglist.
* Check to see if the remote has left.
*/ */
if (req->req_step == R_STP_LOOKUP && VTCP_check_hup(sp->fd)) { if (VTCP_check_hup(sp->fd)) {
AN(req->hash_objhead); AN(req->hash_objhead);
(void)HSH_DerefObjHead(wrk, &req->hash_objhead); (void)HSH_DerefObjHead(wrk, &req->hash_objhead);
AZ(req->hash_objhead); AZ(req->hash_objhead);
...@@ -342,20 +365,21 @@ HTTP1_Session(struct worker *wrk, struct req *req) ...@@ -342,20 +365,21 @@ HTTP1_Session(struct worker *wrk, struct req *req)
AN(http1_cleanup(sp, wrk, req)); AN(http1_cleanup(sp, wrk, req));
return; return;
} }
sp->sess_step = S_STP_H1WORKING;
while (1) { break;
case S_STP_H1WORKING:
assert( assert(
sp->sess_step == S_STP_H1NEWREQ ||
req->req_step == R_STP_LOOKUP || req->req_step == R_STP_LOOKUP ||
req->req_step == R_STP_RECV); req->req_step == R_STP_RECV);
if (sp->sess_step == S_STP_H1WORKING) {
if (req->req_step == R_STP_RECV) if (req->req_step == R_STP_RECV)
nxt = http1_dissect(wrk, req); nxt = http1_dissect(wrk, req);
if (nxt == REQ_FSM_MORE) if (nxt == REQ_FSM_MORE)
nxt = CNT_Request(wrk, req); nxt = CNT_Request(wrk, req);
if (nxt == REQ_FSM_DISEMBARK) if (nxt == REQ_FSM_DISEMBARK) {
sp->sess_step = S_STP_H1BUSY;
return; return;
}
assert(nxt == REQ_FSM_DONE); assert(nxt == REQ_FSM_DONE);
if (http1_cleanup(sp, wrk, req)) if (http1_cleanup(sp, wrk, req))
return; return;
...@@ -373,14 +397,10 @@ HTTP1_Session(struct worker *wrk, struct req *req) ...@@ -373,14 +397,10 @@ HTTP1_Session(struct worker *wrk, struct req *req)
wrk->stats->sess_readahead++; wrk->stats->sess_readahead++;
sp->sess_step = S_STP_H1NEWREQ; sp->sess_step = S_STP_H1NEWREQ;
} }
break;
default:
WRONG("Wrong H1 session state");
} }
if (sp->sess_step == S_STP_H1NEWREQ) {
nxt = http1_wait(sp, wrk, req);
if (nxt != REQ_FSM_MORE)
return;
sp->sess_step = S_STP_H1WORKING;
req->req_step = R_STP_RECV;
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment