MEDIUM: compression: start to move to the new buffer API
This part is tricky, it passes a channel where we used to have a buffer,
in order to reduce the API changes during the big switch. This way all
the channel's wrappers to distinguish between input and output are
available. It also makes sense given that the compression applies on
a channel since it's in the forwarding path.
diff --git a/src/compression.c b/src/compression.c
index 2abe904..eb74661 100644
--- a/src/compression.c
+++ b/src/compression.c
@@ -343,11 +343,11 @@
in_len = comp_ctx->direct_len;
if (comp_ctx->queued) {
- in_ptr = comp_ctx->queued->p;
- in_len = comp_ctx->queued->i;
+ in_ptr = b_head(comp_ctx->queued);
+ in_len = b_data(comp_ctx->queued);
}
- out_len = out->i;
+ out_len = b_data(out);
if (in_ptr)
b_add(out, slz_encode(strm, b_tail(out), in_ptr, in_len, !finish));
@@ -355,7 +355,7 @@
if (finish)
b_add(out, slz_finish(strm, b_tail(out)));
- out_len = out->i - out_len;
+ out_len = b_data(out) - out_len;
/* very important, we must wipe the data we've just flushed */
comp_ctx->direct_len = 0;
diff --git a/src/flt_http_comp.c b/src/flt_http_comp.c
index 85abb84..4972088 100644
--- a/src/flt_http_comp.c
+++ b/src/flt_http_comp.c
@@ -56,7 +56,7 @@
struct stream *s,
struct http_msg *msg);
-static int http_compression_buffer_init(struct buffer *in, struct buffer *out);
+static int http_compression_buffer_init(struct channel *inc, struct buffer *out);
static int http_compression_buffer_add_data(struct comp_state *st,
struct buffer *in,
struct buffer *out, int sz);
@@ -178,12 +178,11 @@
{
struct comp_state *st = filter->ctx;
struct channel *chn = msg->chn;
- struct buffer *buf = chn->buf;
unsigned int *nxt = &flt_rsp_nxt(filter);
unsigned int len;
int ret;
- len = MIN(msg->chunk_len + msg->next, buf->i) - *nxt;
+ len = MIN(msg->chunk_len + msg->next, ci_data(chn)) - *nxt;
if (!len)
return len;
@@ -192,7 +191,7 @@
b_reset(tmpbuf);
c_adv(chn, fwd);
- ret = http_compression_buffer_init(buf, zbuf);
+ ret = http_compression_buffer_init(chn, zbuf);
c_rew(chn, fwd);
if (ret < 0) {
msg->chn->flags |= CF_WAKE_WRITE;
@@ -209,7 +208,7 @@
block = ci_contig_data(chn);
memcpy(b_tail(tmpbuf), ci_head(chn), block);
if (len > block)
- memcpy(b_tail(tmpbuf)+block, buf->data, len-block);
+ memcpy(b_tail(tmpbuf)+block, b_orig(chn->buf), len-block);
c_rew(chn, *nxt);
b_add(tmpbuf, len);
@@ -217,7 +216,7 @@
}
else {
c_adv(chn, *nxt);
- ret = http_compression_buffer_add_data(st, buf, zbuf, len);
+ ret = http_compression_buffer_add_data(st, chn->buf, zbuf, len);
c_rew(chn, *nxt);
if (ret < 0)
return ret;
@@ -243,7 +242,7 @@
b_reset(tmpbuf);
c_adv(chn, fwd);
- http_compression_buffer_init(chn->buf, zbuf);
+ http_compression_buffer_init(chn, zbuf);
c_rew(chn, fwd);
st->initialized = 1;
}
@@ -348,7 +347,7 @@
struct http_msg *msg)
{
struct http_txn *txn = s->txn;
- struct buffer *req = msg->chn->buf;
+ struct channel *req = msg->chn;
struct hdr_ctx ctx;
struct comp_algo *comp_algo = NULL;
struct comp_algo *comp_algo_back = NULL;
@@ -358,7 +357,7 @@
* See http://zoompf.com/2012/02/lose-the-wait-http-compression for more details.
*/
ctx.idx = 0;
- if (http_find_header2("User-Agent", 10, req->p, &txn->hdr_idx, &ctx) &&
+ if (http_find_header2("User-Agent", 10, ci_head(req), &txn->hdr_idx, &ctx) &&
ctx.vlen >= 9 &&
memcmp(ctx.line + ctx.val, "Mozilla/4", 9) == 0 &&
(ctx.vlen < 31 ||
@@ -376,7 +375,7 @@
int best_q = 0;
ctx.idx = 0;
- while (http_find_header2("Accept-Encoding", 15, req->p, &txn->hdr_idx, &ctx)) {
+ while (http_find_header2("Accept-Encoding", 15, ci_head(req), &txn->hdr_idx, &ctx)) {
const char *qval;
int q;
int toklen;
@@ -434,7 +433,7 @@
(strm_fe(s)->comp && strm_fe(s)->comp->offload)) {
http_remove_header2(msg, &txn->hdr_idx, &ctx);
ctx.idx = 0;
- while (http_find_header2("Accept-Encoding", 15, req->p, &txn->hdr_idx, &ctx)) {
+ while (http_find_header2("Accept-Encoding", 15, ci_head(req), &txn->hdr_idx, &ctx)) {
http_remove_header2(msg, &txn->hdr_idx, &ctx);
}
}
@@ -464,7 +463,7 @@
select_compression_response_header(struct comp_state *st, struct stream *s, struct http_msg *msg)
{
struct http_txn *txn = s->txn;
- struct buffer *res = msg->chn->buf;
+ struct channel *c = msg->chn;
struct hdr_ctx ctx;
struct comp_type *comp_type;
@@ -493,12 +492,12 @@
/* content is already compressed */
ctx.idx = 0;
- if (http_find_header2("Content-Encoding", 16, res->p, &txn->hdr_idx, &ctx))
+ if (http_find_header2("Content-Encoding", 16, ci_head(c), &txn->hdr_idx, &ctx))
goto fail;
/* no compression when Cache-Control: no-transform is present in the message */
ctx.idx = 0;
- while (http_find_header2("Cache-Control", 13, res->p, &txn->hdr_idx, &ctx)) {
+ while (http_find_header2("Cache-Control", 13, ci_head(c), &txn->hdr_idx, &ctx)) {
if (word_match(ctx.line + ctx.val, ctx.vlen, "no-transform", 12))
goto fail;
}
@@ -511,7 +510,7 @@
* the priority.
*/
ctx.idx = 0;
- if (http_find_header2("Content-Type", 12, res->p, &txn->hdr_idx, &ctx)) {
+ if (http_find_header2("Content-Type", 12, ci_head(c), &txn->hdr_idx, &ctx)) {
if (ctx.vlen >= 9 && strncasecmp("multipart", ctx.line+ctx.val, 9) == 0)
goto fail;
@@ -549,7 +548,7 @@
/* remove Content-Length header */
ctx.idx = 0;
- if ((msg->flags & HTTP_MSGF_CNT_LEN) && http_find_header2("Content-Length", 14, res->p, &txn->hdr_idx, &ctx))
+ if ((msg->flags & HTTP_MSGF_CNT_LEN) && http_find_header2("Content-Length", 14, ci_head(c), &txn->hdr_idx, &ctx))
http_remove_header2(msg, &txn->hdr_idx, &ctx);
/* add Transfer-Encoding header */
@@ -602,13 +601,13 @@
* Init HTTP compression
*/
static int
-http_compression_buffer_init(struct buffer *in, struct buffer *out)
+http_compression_buffer_init(struct channel *inc, struct buffer *out)
{
/* output stream requires at least 10 bytes for the gzip header, plus
* at least 8 bytes for the gzip trailer (crc+len), plus a possible
* plus at most 5 bytes per 32kB block and 2 bytes to close the stream.
*/
- if (b_room(in) < 20 + 5 * ((in->i + 32767) >> 15))
+ if (c_room(inc) < 20 + 5 * ((ci_data(inc) + 32767) >> 15))
return -1;
/* prepare an empty output buffer in which we reserve enough room for
@@ -617,7 +616,7 @@
* cancel the operation later, it's cheap.
*/
b_reset(out);
- out->o = in->o;
+ out->o = co_data(inc);
out->p += out->o;
out->i = 10;
return 0;
@@ -687,7 +686,7 @@
return -1; /* flush failed */
#endif /* USE_ZLIB */
- if (ob->i == 10) {
+ if (b_data(ob) == 0) {
/* No data were appended, let's drop the output buffer and
* keep the input buffer unchanged.
*/