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
...@@ -989,7 +989,7 @@ enum htc_status_e { ...@@ -989,7 +989,7 @@ enum htc_status_e {
HTC_S_TIMEOUT = -3, HTC_S_TIMEOUT = -3,
HTC_S_OVERFLOW = -2, HTC_S_OVERFLOW = -2,
HTC_S_EOF = -1, HTC_S_EOF = -1,
HTC_S_OK = 0, HTC_S_OK = 0,
HTC_S_COMPLETE = 1 HTC_S_COMPLETE = 1
}; };
......
...@@ -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,31 +331,55 @@ HTTP1_Session(struct worker *wrk, struct req *req) ...@@ -331,31 +331,55 @@ HTTP1_Session(struct worker *wrk, struct req *req)
return; return;
} }
/*
* Return from waitinglist. Check to see if the remote has left.
*/
if (req->req_step == R_STP_LOOKUP && VTCP_check_hup(sp->fd)) {
AN(req->hash_objhead);
(void)HSH_DerefObjHead(wrk, &req->hash_objhead);
AZ(req->hash_objhead);
SES_Close(sp, SC_REM_CLOSE);
AN(http1_cleanup(sp, wrk, req));
return;
}
while (1) { while (1) {
assert( switch (sp->sess_step) {
sp->sess_step == S_STP_H1NEWREQ || case S_STP_H1NEWSESS:
req->req_step == R_STP_LOOKUP || if (VTCP_blocking(sp->fd)) {
req->req_step == R_STP_RECV); 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.
*/
if (VTCP_check_hup(sp->fd)) {
AN(req->hash_objhead);
(void)HSH_DerefObjHead(wrk, &req->hash_objhead);
AZ(req->hash_objhead);
SES_Close(sp, SC_REM_CLOSE);
AN(http1_cleanup(sp, wrk, req));
return;
}
sp->sess_step = S_STP_H1WORKING;
break;
case S_STP_H1WORKING:
assert(
req->req_step == R_STP_LOOKUP ||
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