From eaffe12b5ba4273fc069167e80e413dbc0e0c696 Mon Sep 17 00:00:00 2001 From: Ilya Gurevich Date: Wed, 8 Apr 2020 14:10:58 -0400 Subject: [PATCH] Add Brotli Support for NGINX in ESP (#784) * added workspace * rearrange * order matters * remove an extra brotli * rearrange text * fix a duplicate function name * some extra changes * clear out work * add brotli flag * added nginx build * added brotli content-encoding test --- WORKSPACE | 1 + src/nginx/BUILD | 2 + src/nginx/t/BUILD | 1 + src/nginx/t/brotli.t | 114 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 src/nginx/t/brotli.t diff --git a/WORKSPACE b/WORKSPACE index d3c87269d..17b4349d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -52,6 +52,7 @@ load("@nginx//:build.bzl", "nginx_repositories") nginx_repositories( bind = True, nginx = "@nginx//", + ngx_brotli = True, ) # Needs to come after nginx diff --git a/src/nginx/BUILD b/src/nginx/BUILD index 00106d95a..4dc2f443b 100644 --- a/src/nginx/BUILD +++ b/src/nginx/BUILD @@ -121,5 +121,7 @@ cc_library( "//src/grpc:zero_copy_stream", "@nginx//:core", "@nginx//:http", + "@ngx_brotli//:http_brotli_filter", + "@ngx_brotli//:http_brotli_static", ], ) diff --git a/src/nginx/t/BUILD b/src/nginx/t/BUILD index 8d325876b..4e51b46ca 100644 --- a/src/nginx/t/BUILD +++ b/src/nginx/t/BUILD @@ -196,6 +196,7 @@ nginx_suite( "backend_routing_append_path.t", "backend_routing_constant_address.t", "by_consumer_metrics.t", + "brotli.t", "check.t", "check_api_key.t", "check_api_target_blocked.t", diff --git a/src/nginx/t/brotli.t b/src/nginx/t/brotli.t new file mode 100644 index 000000000..5423ebef2 --- /dev/null +++ b/src/nginx/t/brotli.t @@ -0,0 +1,114 @@ +# Copyright (C) Extensible Service Proxy Authors +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +################################################################################ +# +use strict; +use warnings; + +################################################################################ + +use src::nginx::t::ApiManager; # Must be first (sets up import path to the Nginx test module) +use src::nginx::t::HttpServer; +use Test::Nginx; # Imports Nginx's test module +use Test::More; # And the test framework + +################################################################################ + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +my $t = Test::Nginx->new()->has(qw/http proxy brotli/)->plan(6); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + server { + listen 127.0.0.1:8080; + server_name localhost; + location / { + brotli on; + } + location /proxy/ { + brotli on; + proxy_pass http://127.0.0.1:8080/local/; + } + location /local/ { + brotli off; + alias %%TESTDIR%%/; + } + } +} + +EOF + +$t->write_file('index.html', 'X' x 64); + +$t->run(); + +############################################################################### + +my $r; + +$r = http_brotli_request('/'); +like($r, qr/^Content-Encoding: br/m, 'br'); + +$r = http_brotli_request('/proxy/'); +like($r, qr/^Content-Encoding: br/m, 'br proxied'); + +# Accept-Ranges headers should be cleared + +unlike(http_brotli_request('/'), qr/Accept-Ranges/im, 'cleared accept-ranges'); +unlike(http_brotli_request('/proxy/'), qr/Accept-Ranges/im, + 'cleared headers from proxy'); + +# HEAD requests should return correct headers + +like(http_brotli_request('/'), qr/Content-Encoding: br/, 'br head'); +unlike(http_head('/'), qr/Content-Encoding: br/, 'no br head'); + +############################################################################### + +sub http_brotli_request { + my ($url) = @_; + my $r = http(<