CLEANUP: cache: take the context out of appctx.ctx

The context was moved to a local definition in the cache code, and
there's nothing specific to the cache anymore in the appctx. The
struct is stored into the appctx's storage area via the svcctx.
diff --git a/include/haproxy/applet-t.h b/include/haproxy/applet-t.h
index 6b9a710..ee77093 100644
--- a/include/haproxy/applet-t.h
+++ b/include/haproxy/applet-t.h
@@ -132,16 +132,6 @@
 				 __attribute__((deprecated)) size_t o0, o1;
 				 __attribute__((deprecated)) int i0, i1;
 			} cli;                          /* context used by the CLI */
-			struct {
-				struct cache_entry *entry;  /* Entry to be sent from cache. */
-				unsigned int sent;          /* The number of bytes already sent for this cache entry. */
-				unsigned int offset;        /* start offset of remaining data relative to beginning of the next block */
-				unsigned int rem_data;      /* Remaining bytes for the last data block (HTX only, 0 means process next block) */
-				unsigned int send_notmodified:1;   /* In case of conditional request, we might want to send a "304 Not Modified"
-	                                                            * response instead of the stored data. */
-				unsigned int unused:31;
-				struct shared_block *next;  /* The next block of data to be sent for this cache entry. */
-			} cache;
 		} ctx;					/* context-specific variables used by any applet */
 	}; /* end of anon union */
 };
diff --git a/src/cache.c b/src/cache.c
index 057d8b6..f62aff8 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -57,6 +57,17 @@
 	char id[33];             /* cache name */
 };
 
+/* the appctx context of a cache applet, stored in appctx->svcctx */
+struct cache_appctx {
+	struct cache_entry *entry;       /* Entry to be sent from cache. */
+	unsigned int sent;               /* The number of bytes already sent for this cache entry. */
+	unsigned int offset;             /* start offset of remaining data relative to beginning of the next block */
+	unsigned int rem_data;           /* Remaining bytes for the last data block (HTX only, 0 means process next block) */
+	unsigned int send_notmodified:1; /* In case of conditional request, we might want to send a "304 Not Modified" response instead of the stored data. */
+	unsigned int unused:31;
+	struct shared_block *next;       /* The next block of data to be sent for this cache entry. */
+};
+
 /* cache config for filters */
 struct cache_flt_conf {
 	union {
@@ -1259,8 +1270,9 @@
 
 static void http_cache_applet_release(struct appctx *appctx)
 {
+	struct cache_appctx *ctx = appctx->svcctx;
 	struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0];
-	struct cache_entry *cache_ptr = appctx->ctx.cache.entry;
+	struct cache_entry *cache_ptr = ctx->entry;
 	struct cache *cache = cconf->c.cache;
 	struct shared_block *first = block_ptr(cache_ptr);
 
@@ -1273,6 +1285,7 @@
 static unsigned int htx_cache_dump_blk(struct appctx *appctx, struct htx *htx, enum htx_blk_type type,
 				       uint32_t info, struct shared_block *shblk, unsigned int offset)
 {
+	struct cache_appctx *ctx = appctx->svcctx;
 	struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0];
 	struct shared_context *shctx = shctx_ptr(cconf->c.cache);
 	struct htx_blk *blk;
@@ -1308,16 +1321,16 @@
 			offset = 0;
 		}
 	}
-	appctx->ctx.cache.offset = offset;
-	appctx->ctx.cache.next   = shblk;
-	appctx->ctx.cache.sent  += total;
+	ctx->offset = offset;
+	ctx->next   = shblk;
+	ctx->sent  += total;
 	return total;
 }
 
 static unsigned int htx_cache_dump_data_blk(struct appctx *appctx, struct htx *htx,
 					    uint32_t info, struct shared_block *shblk, unsigned int offset)
 {
-
+	struct cache_appctx *ctx = appctx->svcctx;
 	struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0];
 	struct shared_context *shctx = shctx_ptr(cconf->c.cache);
 	unsigned int max, total, rem_data;
@@ -1328,8 +1341,8 @@
 		return 0;
 
 	rem_data = 0;
-	if (appctx->ctx.cache.rem_data) {
-		blksz = appctx->ctx.cache.rem_data;
+	if (ctx->rem_data) {
+		blksz = ctx->rem_data;
 		total = 0;
 	}
 	else {
@@ -1357,16 +1370,17 @@
 		}
 	}
 
-	appctx->ctx.cache.offset   = offset;
-	appctx->ctx.cache.next     = shblk;
-	appctx->ctx.cache.sent    += total;
-	appctx->ctx.cache.rem_data = rem_data + blksz;
+	ctx->offset   = offset;
+	ctx->next     = shblk;
+	ctx->sent    += total;
+	ctx->rem_data = rem_data + blksz;
 	return total;
 }
 
 static size_t htx_cache_dump_msg(struct appctx *appctx, struct htx *htx, unsigned int len,
 				 enum htx_blk_type mark)
 {
+	struct cache_appctx *ctx = appctx->svcctx;
 	struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0];
 	struct shared_context *shctx = shctx_ptr(cconf->c.cache);
 	struct shared_block   *shblk;
@@ -1377,9 +1391,9 @@
 		enum htx_blk_type type;
 		uint32_t info;
 
-		shblk  = appctx->ctx.cache.next;
-		offset = appctx->ctx.cache.offset;
-		if (appctx->ctx.cache.rem_data) {
+		shblk  = ctx->next;
+		offset = ctx->offset;
+		if (ctx->rem_data) {
 			type = HTX_BLK_DATA;
 			info = 0;
 			goto add_data_blk;
@@ -1409,7 +1423,7 @@
 		total += ret;
 		len   -= ret;
 
-		if (appctx->ctx.cache.rem_data || type == mark)
+		if (ctx->rem_data || type == mark)
 			break;
 	}
 
@@ -1418,7 +1432,8 @@
 
 static int htx_cache_add_age_hdr(struct appctx *appctx, struct htx *htx)
 {
-	struct cache_entry *cache_ptr = appctx->ctx.cache.entry;
+	struct cache_appctx *ctx = appctx->svcctx;
+	struct cache_entry *cache_ptr = ctx->entry;
 	unsigned int age;
 	char *end;
 
@@ -1435,7 +1450,8 @@
 
 static void http_cache_io_handler(struct appctx *appctx)
 {
-	struct cache_entry *cache_ptr = appctx->ctx.cache.entry;
+	struct cache_appctx *ctx = appctx->svcctx;
+	struct cache_entry *cache_ptr = ctx->entry;
 	struct shared_block *first = block_ptr(cache_ptr);
 	struct conn_stream *cs = appctx->owner;
 	struct channel *req = cs_oc(cs);
@@ -1461,16 +1477,16 @@
 		appctx->st0 = HTX_CACHE_END;
 
 	if (appctx->st0 == HTX_CACHE_INIT) {
-		appctx->ctx.cache.next = block_ptr(cache_ptr);
-		appctx->ctx.cache.offset = sizeof(*cache_ptr);
-		appctx->ctx.cache.sent = 0;
-		appctx->ctx.cache.rem_data = 0;
+		ctx->next = block_ptr(cache_ptr);
+		ctx->offset = sizeof(*cache_ptr);
+		ctx->sent = 0;
+		ctx->rem_data = 0;
 		appctx->st0 = HTX_CACHE_HEADER;
 	}
 
 	if (appctx->st0 == HTX_CACHE_HEADER) {
 		/* Headers must be dump at once. Otherwise it is an error */
-		len = first->len - sizeof(*cache_ptr) - appctx->ctx.cache.sent;
+		len = first->len - sizeof(*cache_ptr) - ctx->sent;
 		ret = htx_cache_dump_msg(appctx, res_htx, len, HTX_BLK_EOH);
 		if (!ret || (htx_get_tail_type(res_htx) != HTX_BLK_EOH) ||
 		    !htx_cache_add_age_hdr(appctx, res_htx))
@@ -1478,23 +1494,23 @@
 
 		/* In case of a conditional request, we might want to send a
 		 * "304 Not Modified" response instead of the stored data. */
-		if (appctx->ctx.cache.send_notmodified) {
+		if (ctx->send_notmodified) {
 			if (!http_replace_res_status(res_htx, ist("304"), ist("Not Modified"))) {
 				/* If replacing the status code fails we need to send the full response. */
-				appctx->ctx.cache.send_notmodified = 0;
+				ctx->send_notmodified = 0;
 			}
 		}
 
 		/* Skip response body for HEAD requests or in case of "304 Not
 		 * Modified" response. */
-		if (__cs_strm(cs)->txn->meth == HTTP_METH_HEAD || appctx->ctx.cache.send_notmodified)
+		if (__cs_strm(cs)->txn->meth == HTTP_METH_HEAD || ctx->send_notmodified)
 			appctx->st0 = HTX_CACHE_EOM;
 		else
 			appctx->st0 = HTX_CACHE_DATA;
 	}
 
 	if (appctx->st0 == HTX_CACHE_DATA) {
-		len = first->len - sizeof(*cache_ptr) - appctx->ctx.cache.sent;
+		len = first->len - sizeof(*cache_ptr) - ctx->sent;
 		if (len) {
 			ret = htx_cache_dump_msg(appctx, res_htx, len, HTX_BLK_UNUSED);
 			if (ret < len) {
@@ -1823,12 +1839,14 @@
 
 		s->target = &http_cache_applet.obj_type;
 		if ((appctx = cs_applet_create(s->csb, objt_applet(s->target)))) {
+			struct cache_appctx *ctx = applet_reserve_svcctx(appctx, sizeof(*ctx));
+
 			appctx->st0 = HTX_CACHE_INIT;
 			appctx->rule = rule;
-			appctx->ctx.cache.entry = res;
-			appctx->ctx.cache.next = NULL;
-			appctx->ctx.cache.sent = 0;
-			appctx->ctx.cache.send_notmodified =
+			ctx->entry = res;
+			ctx->next = NULL;
+			ctx->sent = 0;
+			ctx->send_notmodified =
                                 should_send_notmodified_response(cache, htxbuf(&s->req.buf), res);
 
 			if (px == strm_fe(s))