Commit 1c244492 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Move the actual pushing of objects through VDP to a new

function: VDP_DeliverObj()
parent d9f7e92c
......@@ -96,3 +96,47 @@ VDP_close(struct req *req)
while (!VTAILQ_EMPTY(&req->vdp))
vdp_pop(req, VTAILQ_FIRST(&req->vdp)->func);
}
/*--------------------------------------------------------------------*/
enum objiter_status
VDP_DeliverObj(struct req *req)
{
enum objiter_status ois;
ssize_t len;
void *oi;
void *ptr;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
if (req->res_mode & RES_ESI) {
ESI_Deliver(req);
return (OIS_DONE);
}
oi = ObjIterBegin(req->wrk, req->objcore);
XXXAN(oi);
AZ(req->synth_body);
do {
ois = ObjIter(req->objcore, oi, &ptr, &len);
switch(ois) {
case OIS_DONE:
AZ(len);
break;
case OIS_ERROR:
break;
case OIS_DATA:
case OIS_STREAM:
if (VDP_bytes(req,
ois == OIS_DATA ? VDP_NULL : VDP_FLUSH, ptr, len))
ois = OIS_ERROR;
break;
default:
WRONG("Wrong OIS value");
}
} while (ois == OIS_DATA || ois == OIS_STREAM);
ObjIterEnd(req->objcore, &oi);
return (ois);
}
......@@ -108,6 +108,7 @@ struct vdp_entry {
int VDP_bytes(struct req *, enum vdp_action act, const void *ptr, ssize_t len);
void VDP_push(struct req *, vdp_bytes *func, void *priv, int bottom);
void VDP_close(struct req *req);
enum objiter_status VDP_DeliverObj(struct req *req);
vdp_bytes VDP_gunzip;
vdp_bytes VED_pretend_gzip;
......
......@@ -188,44 +188,6 @@ v1d_dorange(struct req *req, struct busyobj *bo, const char *r)
VDP_push(req, v1d_range_bytes, v1rp, 0);
}
/*--------------------------------------------------------------------*/
static enum objiter_status
v1d_WriteDirObj(struct req *req)
{
enum objiter_status ois;
ssize_t len;
void *oi;
void *ptr;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
oi = ObjIterBegin(req->wrk, req->objcore);
XXXAN(oi);
AZ(req->synth_body);
do {
ois = ObjIter(req->objcore, oi, &ptr, &len);
switch(ois) {
case OIS_DONE:
AZ(len);
break;
case OIS_ERROR:
break;
case OIS_DATA:
case OIS_STREAM:
if (VDP_bytes(req,
ois == OIS_DATA ? VDP_NULL : VDP_FLUSH, ptr, len))
ois = OIS_ERROR;
break;
default:
WRONG("Wrong OIS value");
}
} while (ois == OIS_DATA || ois == OIS_STREAM);
ObjIterEnd(req->objcore, &oi);
return (ois);
}
/*--------------------------------------------------------------------
*/
void
......@@ -257,10 +219,7 @@ V1D_Deliver(struct req *req, struct busyobj *bo)
else if (!req->gzip_resp && i)
VDP_push(req, VDP_gunzip, NULL, 0);
if (req->res_mode & RES_ESI)
ESI_Deliver(req);
else
(void)v1d_WriteDirObj(req);
(void)VDP_DeliverObj(req);
}
(void)VDP_bytes(req, VDP_FLUSH, NULL, 0);
VDP_close(req);
......@@ -353,12 +312,8 @@ V1D_Deliver(struct req *req, struct busyobj *bo)
V1L_Chunked(req->wrk);
ois = OIS_DONE;
if (req->wantbody) {
if (req->res_mode & RES_ESI)
ESI_Deliver(req);
else
ois = v1d_WriteDirObj(req);
}
if (req->wantbody)
ois = VDP_DeliverObj(req);
(void)VDP_bytes(req, VDP_FLUSH, NULL, 0);
if (ois == OIS_DONE && (req->res_mode & RES_CHUNKED))
......
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