Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Backports:SLE-15-SP5
nginx-module-brotli
update-brotli-v1.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File update-brotli-v1.patch of Package nginx-module-brotli
From ec4bd605e9d04e7d37fa356853984e75d00d4a49 Mon Sep 17 00:00:00 2001 From: Eugene Kliuchnikov <eustas@google.com> Date: Tue, 28 Nov 2017 11:00:45 +0100 Subject: [PATCH] Update brotli to v1.0.1 --- src/ngx_http_brotli_filter_module.c | 176 ++++++++++++------------------------ 1 file changed, 57 insertions(+), 119 deletions(-) diff --git a/src/ngx_http_brotli_filter_module.c b/src/ngx_http_brotli_filter_module.c index 6144cfa..74ba173 100644 --- a/src/ngx_http_brotli_filter_module.c +++ b/src/ngx_http_brotli_filter_module.c @@ -35,11 +35,6 @@ typedef struct { typedef struct { BrotliEncoderState *encoder; - size_t brotli_ring; - size_t brotli_in; - u_char *brotli_out; - u_char *brotli_last; - off_t content_length; size_t bytes_in; @@ -64,11 +59,9 @@ typedef struct { static BrotliEncoderState *ngx_http_brotli_filter_create_encoder( ngx_http_request_t *r); -static ngx_int_t ngx_http_brotli_filter_add_data(ngx_http_request_t *r, - ngx_http_brotli_ctx_t *ctx); -static ngx_int_t ngx_http_brotli_filter_process(ngx_http_request_t *r, +static ngx_int_t ngx_http_brotli_filter_push(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx); -static ngx_int_t ngx_http_brotli_filter_output(ngx_http_request_t *r, +static ngx_int_t ngx_http_brotli_filter_pull(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx); static ngx_int_t ngx_http_brotli_filter_get_buf(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx); @@ -269,8 +262,6 @@ ngx_http_brotli_body_filter(ngx_http_request_t *r, ngx_chain_t *in) goto failed; } - ctx->brotli_ring = BrotliEncoderInputBlockSize(ctx->encoder); - cln = ngx_pool_cleanup_add(r->pool, 0); if (cln == NULL) { goto failed; @@ -313,27 +304,21 @@ ngx_http_brotli_body_filter(ngx_http_request_t *r, ngx_chain_t *in) for ( ;; ) { - rc = ngx_http_brotli_filter_add_data(r, ctx); + rc = ngx_http_brotli_filter_push(r, ctx); - if (rc == NGX_DECLINED) { - break; + if (rc == NGX_ERROR) { + goto failed; } - if (rc == NGX_AGAIN) { - continue; + if (rc == NGX_DECLINED) { + break; } - rc = ngx_http_brotli_filter_process(r, ctx); - if (rc == NGX_AGAIN) { continue; } - if (rc == NGX_ERROR) { - goto failed; - } - - rc = ngx_http_brotli_filter_output(r, ctx); + rc = ngx_http_brotli_filter_pull(r, ctx); if (rc == NGX_OK) { break; @@ -424,7 +409,7 @@ ngx_http_brotli_filter_create_encoder(ngx_http_request_t *r) if (ctx->content_length > 0) { while (ctx->content_length < (1 << (wbits - 1)) - && wbits > kBrotliMinWindowBits) + && wbits > BROTLI_MIN_WINDOW_BITS) { wbits--; } @@ -438,10 +423,9 @@ ngx_http_brotli_filter_create_encoder(ngx_http_request_t *r) goto failed; } - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "brotli encoder: lvl:%i win:%d blk:%uz", - conf->quality, (1 << wbits), - BrotliEncoderInputBlockSize(encoder)); + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "brotli encoder: lvl:%i win:%d", + conf->quality, (1 << wbits)); return encoder; @@ -454,119 +438,74 @@ ngx_http_brotli_filter_create_encoder(ngx_http_request_t *r) static ngx_int_t -ngx_http_brotli_filter_add_data(ngx_http_request_t *r, +ngx_http_brotli_filter_push(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) { - size_t size, ring; - ngx_buf_t *b; - - if (ctx->brotli_out || ctx->last || ctx->flush) { - return NGX_OK; - } + size_t available_input, input_size, consumed_input, zero; + ngx_buf_t *b; + BrotliEncoderOperation op; + const uint8_t *next_input_byte; ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "brotli in: %p", ctx->in); - if (ctx->in == NULL) { + if (BrotliEncoderIsFinished(ctx->encoder)) { return NGX_DECLINED; } - b = ctx->in->buf; - - size = ngx_buf_size(b); - ring = ctx->brotli_ring - ctx->brotli_in; - - if (size > ring) { - size = ring; - - } else { - if (b->last_buf) { - ctx->last = 1; - - } else if (b->flush) { - ctx->flush = 1; - } - } - - if (size == ring) { - ctx->flush = 1; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "brotli copy: %p, size:%uz", b, size); - - BrotliEncoderCopyInputToRingBuffer(ctx->encoder, size, b->pos); - - ctx->brotli_in += size; - ctx->bytes_in += size; - b->pos += size; - - if (ngx_buf_size(b) == 0) { - ctx->in = ctx->in->next; - size = 0; - } - - if (size == 0 && !ctx->flush && !ctx->last) { - return NGX_AGAIN; + if (ctx->in == NULL) { + return ctx->last ? NGX_OK : NGX_DECLINED; } - return NGX_OK; -} - + b = ctx->in->buf; -static ngx_int_t -ngx_http_brotli_filter_process(ngx_http_request_t *r, - ngx_http_brotli_ctx_t *ctx) -{ - size_t size; - u_char *out; + if (b->last_buf) { + ctx->last = 1; - if (ctx->brotli_out) { - return NGX_OK; + } else if (b->flush) { + ctx->flush = 1; } - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "brotli process: size:%uz l:%d f:%d", - ctx->brotli_in, ctx->last, ctx->flush); - - out = NULL; - - if (!BrotliEncoderWriteData(ctx->encoder, ctx->last, ctx->flush, &size, - &out)) - { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "brotli failed: size:%uz l:%d f:%d", - ctx->brotli_in, ctx->last, ctx->flush); - return NGX_ERROR; + input_size = ngx_buf_size(b); + if (input_size == 0) { + if (!ctx->flush && !ctx->last) { + ctx->in = ctx->in->next; + return NGX_AGAIN; + } } - ctx->brotli_in = 0; - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "brotli encoded: %p, size:%uz", out, size); - - if (size == 0 && !ctx->flush && !ctx->last) { - return NGX_AGAIN; + "brotli push: %p, size:%uz", b, input_size); + + available_input = input_size; + op = ctx->last ? BROTLI_OPERATION_FINISH : + ctx->flush ? BROTLI_OPERATION_FLUSH : BROTLI_OPERATION_PROCESS; + zero = 0; + next_input_byte = (const uint8_t *) b->pos; + if (!BrotliEncoderCompressStream(ctx->encoder, op, &available_input, + &next_input_byte, &zero, NULL, NULL)) { + return NGX_ERROR; } - ctx->brotli_out = out; - ctx->brotli_last = out + size; - ctx->bytes_out += size; + consumed_input = input_size - available_input; + b->pos += consumed_input; + ctx->bytes_in += consumed_input; - return NGX_OK; + return (consumed_input != 0) ? NGX_AGAIN : NGX_OK; } static ngx_int_t -ngx_http_brotli_filter_output(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) +ngx_http_brotli_filter_pull(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) { int rc; size_t size; + const uint8_t *out; ngx_chain_t *cl; cl = NULL; - while (ctx->brotli_out < ctx->brotli_last) { + while (BrotliEncoderHasMoreOutput(ctx->encoder)) { rc = ngx_http_brotli_filter_get_buf(r, ctx); @@ -578,13 +517,13 @@ ngx_http_brotli_filter_output(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) return NGX_ERROR; } - size = ngx_min(ctx->out_buf->end - ctx->out_buf->last, - ctx->brotli_last - ctx->brotli_out); + size = ctx->out_buf->end - ctx->out_buf->last; - ngx_memcpy(ctx->out_buf->last, ctx->brotli_out, size); + out = BrotliEncoderTakeOutput(ctx->encoder, &size); + + ngx_memcpy(ctx->out_buf->last, out, size); ctx->out_buf->last += size; - ctx->brotli_out += size; ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "brotli out: %p, size:%uz", @@ -601,9 +540,6 @@ ngx_http_brotli_filter_output(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) ctx->last_out = &cl->next; } - ctx->brotli_out = NULL; - ctx->brotli_last = NULL; - if (ctx->last || ctx->flush) { if (cl == NULL) { @@ -627,10 +563,12 @@ ngx_http_brotli_filter_output(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx) cl->buf->last_buf = 1; } else if (ctx->flush) { - ctx->flush = 0; cl->buf->flush = 1; } + ctx->last = 0; + ctx->flush = 0; + r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; return NGX_OK; @@ -900,8 +838,8 @@ ngx_http_brotli_window(ngx_conf_t *cf, void *post, void *data) size_t *np = data; size_t wbits, wsize, mbits; - wbits = kBrotliMaxWindowBits; - mbits = kBrotliMinWindowBits; + wbits = BROTLI_MAX_WINDOW_BITS; + mbits = BROTLI_MIN_WINDOW_BITS; for (wsize = (1 << wbits); wsize >= (1U << mbits); wsize >>= 1) {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor