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

Streamline the H1->H2 handover a bit

parent 409114f5
......@@ -70,6 +70,8 @@ extern struct transport PROXY_transport;
extern struct transport HTTP1_transport;
extern struct transport H2_transport;
htc_complete_f H2_prism_complete;
void H2_PU_Sess(struct worker *, struct sess *, struct req *);
void H2_OU_Sess(struct worker *, struct sess *, struct req *);
const struct transport *XPORT_ByNumber(uint16_t no);
void VPX_Send_Proxy(int fd, int version, const struct sess *);
......@@ -408,11 +408,8 @@ HTTP1_Session(struct worker *wrk, struct req *req)
http1_setstate(sp, H1CLEANUP);
continue;
}
VSLb(req->vsl, SLT_Debug,
"H2 Prior Knowledge Upgrade");
http1_setstate(sp, NULL);
req->err_code = 1;
SES_SetTransport(wrk, sp, req, &H2_transport);
H2_PU_Sess(wrk, sp, req);
return;
}
......@@ -433,12 +430,9 @@ HTTP1_Session(struct worker *wrk, struct req *req)
VSLb(req->vsl, SLT_Debug,
"H2 upgrade attempt has body");
} else {
VSLb(req->vsl, SLT_Debug,
"H2 Upgrade");
http1_setstate(sp, NULL);
req->err_code = 2;
SES_SetTransport(wrk, sp, req,
&H2_transport);
H2_OU_Sess(wrk, sp, req);
return;
}
}
......
......@@ -288,6 +288,28 @@ h2_new_ou_session(struct worker *wrk, struct h2_sess *h2,
return (1);
}
/**********************************************************************
*/
#define H2_PU_MARKER 1
#define H2_OU_MARKER 2
void
H2_PU_Sess(struct worker *wrk, struct sess *sp, struct req *req)
{
VSLb(req->vsl, SLT_Debug, "H2 Prior Knowledge Upgrade");
req->err_code = H2_PU_MARKER;
SES_SetTransport(wrk, sp, req, &H2_transport);
}
void
H2_OU_Sess(struct worker *wrk, struct sess *sp, struct req *req)
{
VSLb(req->vsl, SLT_Debug, "H2 Optimistic Upgrade");
req->err_code = H2_OU_MARKER;
SES_SetTransport(wrk, sp, req, &H2_transport);
}
static void __match_proto__(task_func_t)
h2_new_session(struct worker *wrk, void *arg)
{
......@@ -304,35 +326,17 @@ h2_new_session(struct worker *wrk, void *arg)
assert(req->transport == &H2_transport);
assert (req->err_code == H2_PU_MARKER || req->err_code == H2_OU_MARKER);
switch(req->err_code) {
case 0:
/* Direct H2 connection (via Proxy) */
h2 = h2_new_sess(wrk, sp, req);
wsp = WS_Snapshot(h2->ws);
(void)h2_new_req(wrk, h2, 0, NULL);
break;
case 1:
/* Prior Knowledge H1->H2 upgrade */
h2 = h2_new_sess(wrk, sp, req);
wsp = WS_Snapshot(h2->ws);
(void)h2_new_req(wrk, h2, 0, NULL);
if (!h2_new_pu_session(wrk, h2))
return;
break;
case 2:
/* Optimistic H1->H2 upgrade */
h2 = h2_new_sess(wrk, sp, NULL);
wsp = WS_Snapshot(h2->ws);
(void)h2_new_req(wrk, h2, 0, NULL);
if (!h2_new_ou_session(wrk, h2, req))
return;
break;
default:
WRONG("Bad req->err_code");
}
h2 = h2_new_sess(wrk, sp, req->err_code == H2_PU_MARKER ? req : NULL);
wsp = WS_Snapshot(h2->ws);
(void)h2_new_req(wrk, h2, 0, NULL);
if (req->err_code == H2_PU_MARKER && !h2_new_pu_session(wrk, h2))
return;
if (req->err_code == H2_OU_MARKER && !h2_new_ou_session(wrk, h2, req))
return;
THR_SetRequest(h2->srq);
......
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