Skip to content

Commit

Permalink
add brotli-min-length configuration option (kubernetes#7854)
Browse files Browse the repository at this point in the history
* add `brotli-min-length` configuration option

* add e2e tests for brotli

* include check for expected content type

* fix header and format
  • Loading branch information
rahil-p authored and rchshld committed May 17, 2023
1 parent 6d9387c commit 3d64017
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 0 deletions.
5 changes: 5 additions & 0 deletions docs/user-guide/nginx-configuration/configmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ The following table shows a configuration option's name, type, and the default v
|[use-geoip2](#use-geoip2)|bool|"false"|
|[enable-brotli](#enable-brotli)|bool|"false"|
|[brotli-level](#brotli-level)|int|4|
|[brotli-min-length](#brotli-min-length)|int|20|
|[brotli-types](#brotli-types)|string|"application/xml+rss application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component"|
|[use-http2](#use-http2)|bool|"true"|
|[gzip-level](#gzip-level)|int|1|
Expand Down Expand Up @@ -665,6 +666,10 @@ The default mime type list to compress is: `application/xml+rss application/atom

Sets the Brotli Compression Level that will be used. _**default:**_ 4

## brotli-min-length

Minimum length of responses, in bytes, that will be eligible for brotli compression. _**default:**_ 20

## brotli-types

Sets the MIME Types that will be compressed on-the-fly by brotli.
Expand Down
4 changes: 4 additions & 0 deletions internal/ingress/controller/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,9 @@ type Configuration struct {
// Brotli Compression Level that will be used
BrotliLevel int `json:"brotli-level,omitempty"`

// Minimum length of responses, in bytes, that will be eligible for brotli compression
BrotliMinLength int `json:"brotli-min-length,omitempty"`

// MIME Types that will be compressed on-the-fly using Brotli module
BrotliTypes string `json:"brotli-types,omitempty"`

Expand Down Expand Up @@ -778,6 +781,7 @@ func NewDefault() Configuration {
BlockUserAgents: defBlockEntity,
BlockReferers: defBlockEntity,
BrotliLevel: 4,
BrotliMinLength: 20,
BrotliTypes: brotliTypes,
ClientHeaderBufferSize: "1k",
ClientHeaderTimeout: 60,
Expand Down
1 change: 1 addition & 0 deletions rootfs/etc/nginx/template/nginx.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ http {
{{ if $cfg.EnableBrotli }}
brotli on;
brotli_comp_level {{ $cfg.BrotliLevel }};
brotli_min_length {{ $cfg.BrotliMinLength }};
brotli_types {{ $cfg.BrotliTypes }};
{{ end }}

Expand Down
74 changes: 74 additions & 0 deletions test/e2e/settings/brotli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
Copyright 2021 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package settings

import (
"fmt"
"net/http"
"strconv"
"strings"

"github.com/onsi/ginkgo"

"k8s.io/ingress-nginx/test/e2e/framework"
)

var _ = framework.IngressNginxDescribe("brotli", func() {
f := framework.NewDefaultFramework("brotli")

host := "brotli"

ginkgo.BeforeEach(func() {
f.NewHttpbinDeployment()
})

ginkgo.It("should only compress responses that meet the `brotli-min-length` condition", func() {
brotliMinLength := 24
contentEncoding := "application/octet-stream"
f.UpdateNginxConfigMapData("enable-brotli", "true")
f.UpdateNginxConfigMapData("brotli-types", contentEncoding)
f.UpdateNginxConfigMapData("brotli-min-length", strconv.Itoa(brotliMinLength))

f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.Namespace, framework.HTTPBinService, 80, nil))

f.WaitForNginxConfiguration(
func(server string) bool {
return strings.Contains(server, fmt.Sprintf("server_name %v", host)) &&
strings.Contains(server, "brotli on") &&
strings.Contains(server, fmt.Sprintf("brotli_types %v", contentEncoding)) &&
strings.Contains(server, fmt.Sprintf("brotli_min_length %d", brotliMinLength))
})

f.HTTPTestClient().
GET(fmt.Sprintf("/bytes/%d", brotliMinLength)).
WithHeader("Host", host).
WithHeader("Accept-Encoding", "br").
Expect().
Status(http.StatusOK).
ContentType(contentEncoding).
ContentEncoding("br")

f.HTTPTestClient().
GET(fmt.Sprintf("/bytes/%d", brotliMinLength-1)).
WithHeader("Host", host).
WithHeader("Accept-Encoding", "br").
Expect().
Status(http.StatusOK).
ContentType(contentEncoding).
ContentEncoding()
})
})

0 comments on commit 3d64017

Please sign in to comment.