Commit 4cff3b99 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Rename cache_response.c to cache_http1_deliver.c and make it responsible

for all deliveries, streaming or non-streaming
parent b115ccfd
......@@ -39,7 +39,7 @@ varnishd_SOURCES = \
cache/cache_pipe.c \
cache/cache_pool.c \
cache/cache_req_fsm.c \
cache/cache_response.c \
cache/cache_http1_deliver.c \
cache/cache_rfc2616.c \
cache/cache_session.c \
cache/cache_shmlog.c \
......
......@@ -815,6 +815,9 @@ int HTTP1_DiscardReqBody(struct req *req);
int HTTP1_CacheReqBody(struct req *req, ssize_t maxsize);
int HTTP1_IterateReqBody(struct req *req, req_body_iter_f *func, void *priv);
/* cache_http1_deliver.c */
void V1D_Deliver(struct req *);
/* cache_req_fsm.c [CNT] */
enum req_fsm_nxt CNT_Request(struct worker *, struct req *);
......@@ -1052,10 +1055,6 @@ void VSL_Flush(struct vsl_log *, int overflow);
#endif
/* cache_response.c */
void RES_BuildHttp(struct req *);
void RES_WriteObj(struct req *);
/* cache_vary.c */
int VRY_Create(struct busyobj *bo, struct vsb **psb);
int VRY_Match(struct req *, const uint8_t *vary);
......
......@@ -101,7 +101,7 @@ res_dorange(const struct req *req, const char *r, ssize_t *plow, ssize_t *phigh)
/*--------------------------------------------------------------------*/
void
static void
RES_BuildHttp(struct req *req)
{
......@@ -262,7 +262,7 @@ res_WriteDirObj(struct req *req, ssize_t low, ssize_t high)
* Attempt optimizations like 304 and 206 here.
*/
void
static void
RES_WriteObj(struct req *req)
{
char *r;
......@@ -323,3 +323,13 @@ RES_WriteObj(struct req *req)
if (WRW_FlushRelease(req->wrk) && req->sp->fd >= 0)
SES_Close(req->sp, SC_REM_CLOSE);
}
void
V1D_Deliver(struct req *req)
{
while (req->obj->objcore->busyobj)
(void)usleep(10000);
RES_BuildHttp(req);
RES_WriteObj(req);
}
......@@ -75,72 +75,6 @@ DOT acceptor -> recv [style=bold,color=green]
#include "compat/srandomdev.h"
#endif
/*--------------------------------------------------------------------
* We have a refcounted object on the session, and possibly the busyobj
* which is fetching it, prepare a response.
*
DOT stream [
DOT shape=record
DOT label="{cnt_stream:}"
DOT ]
DOT stream:deliver:s -> DONE [style=bold,color=red]
DOT stream:deliver:s -> DONE [style=bold,color=blue]
*
*/
static enum req_fsm_nxt
cnt_stream(struct worker *wrk, struct req *req)
{
struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
bo = req->obj->objcore->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AN(bo->do_stream);
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
AZ(bo->do_esi);
if (wrk->handling == VCL_RET_RESTART) {
assert(req->obj == bo->fetch_obj);
req->obj = NULL;
VBO_DerefBusyObj(wrk, &bo);
AZ(req->obj);
http_Teardown(req->resp);
req->req_step = R_STP_RESTART;
return (REQ_FSM_MORE);
}
assert(wrk->handling == VCL_RET_DELIVER);
VBO_waitstate(bo, BOS_FINISHED);
assert(bo->state >= BOS_FINISHED);
if (bo->state == BOS_FAILED) {
(void)HSH_DerefObj(&wrk->stats, &req->obj);
VBO_DerefBusyObj(wrk, &bo);
req->err_code = 503;
req->req_step = R_STP_ERROR;
return (REQ_FSM_MORE);
}
VBO_DerefBusyObj(wrk, &bo);
AZ(bo);
RES_WriteObj(req);
/* No point in saving the body if it is hit-for-pass */
if (req->obj->objcore->flags & OC_F_PASS)
STV_Freestore(req->obj);
assert(WRW_IsReleased(wrk));
(void)HSH_DerefObj(&wrk->stats, &req->obj);
http_Teardown(req->resp);
return (REQ_FSM_DONE);
}
/*--------------------------------------------------------------------
* Deliver an already stored object
*
......@@ -202,13 +136,6 @@ cnt_deliver(struct worker *wrk, struct req *req)
VCL_deliver_method(req->vcl, wrk, req, NULL, req->http->ws);
while (req->obj->objcore->busyobj) {
VSLb(req->vsl, SLT_Debug, "HERE %s %d", __func__, __LINE__);
(void)usleep(10000);
}
RES_BuildHttp(req);
/* Stop the insanity before it turns "Hotel California" on us */
if (req->restarts >= cache_param->max_restarts)
wrk->handling = VCL_RET_DELIVER;
......@@ -220,9 +147,10 @@ cnt_deliver(struct worker *wrk, struct req *req)
req->req_step = R_STP_RESTART;
return (REQ_FSM_MORE);
}
assert(wrk->handling == VCL_RET_DELIVER);
RES_WriteObj(req);
V1D_Deliver(req);
/* No point in saving the body if it is hit-for-pass */
if (req->obj->objcore->flags & OC_F_PASS)
......
......@@ -44,7 +44,6 @@ REQ_STEP(lookup, LOOKUP, (wrk, req))
REQ_STEP(purge, PURGE, (wrk, req))
REQ_STEP(miss, MISS, (wrk, req))
REQ_STEP(fetch, FETCH, (wrk, req))
REQ_STEP(stream, STREAM, (wrk, req))
REQ_STEP(deliver, DELIVER, (wrk, req))
REQ_STEP(error, ERROR, (wrk, req))
#endif
......
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