You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Evgeny Kotkov <ev...@visualsvn.com> on 2016/09/16 12:32:43 UTC

[PATCH] Introducing mod_brotli

Hi all,

This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.

The new compression format is supported by Mozilla Firefox since 44.0 and
by Google Chrome since 50.0 [1, 2], and both nginx and IIS have modules that
offer Brotli compression.

With the new module, existing mod_deflate installations can benefit from
better compression ratio by sending Brotli-compressed data to the clients
that support it:

    LoadModule brotli_module modules/mod_brotli.so
    LoadModule deflate_module modules/mod_deflate.so
    SetOutputFilter BROTLI_COMPRESS;DEFLATE

This module features zero-copy processing, which is only possible with the
new API from the upcoming 1.0.x series of brotli [3].

The Linux makefile works against libbrotli [4], as currently the core brotli
repository doesn't offer a way to build a library [5].  Enabling mod_brotli
can be done with:

    configure --enable-brotli=shared [--with-brotli=]

CMake build is supported as well.  Please note that the patch doesn't include
the documentation updates and other types of makefiles, but I will do it
separately.

The second patch adds a couple of tests to the test framework.

[1] https://www.mozilla.org/en-US/firefox/44.0/releasenotes/
[2] https://www.chromestatus.com/feature/5420797577396224
[3] https://github.com/google/brotli
[4] https://github.com/bagder/libbrotli
[5] https://github.com/google/brotli/pull/332


Regards,
Evgeny Kotkov

Re: [PATCH] Introducing mod_brotli

Posted by Evgeny Kotkov <ev...@visualsvn.com>.
Evgeny Kotkov <ev...@visualsvn.com> writes:

>>> Wow! This is great stuff. Brotli support has been in my TODO
>>> queue for awhile.
>>>
>>> Thanks!
>>
>> +1, cool stuff and thanks!
>
> Glad to hear that, thanks everyone.
>
> I would be happy to continue the work on this module, for instance, by
> adding the necessary documentation and the ability to log compression ratio.

So, my current plan is to commit the V1 patch, prepare the necessary bits
of documentation (marking the module as experimental), and then continue
shaping it up by adding the optional, but important things, such as the
compression ratio logging.

I'll start doing this tomorrow.


Regards,
Evgeny Kotkov

Re: [PATCH] Introducing mod_brotli

Posted by Evgeny Kotkov <ev...@visualsvn.com>.
Reindl Harald <h....@thelounge.net> writes:

> agreed - however, below some configs where my brain rumours how have that
> identically behavior by just use "brotli" compression in case the cient
> supports it - maybe someone with deeper insights as my pure adiminstrator
> view has a idea by looking at it
>
> the "no-gzip dont-vary" stuff is for long running scripts with
> output-flushing to give "realtime" feedback instead have it all buffered
>
> one brainstorming: "AddOutputCompressionByType" provided by whatever module,
> proceed the Accept-Encoding of the client and deciding the compression algo

Adding the new output filter to the AddOutputFilterByType directive will
result in what you're looking for.  For instance, changing

  AddOutputFilterByType DEFLATE text/html

to

  AddOutputFilterByType BROTLI_COMPRESS;DEFLATE text/html

means that the server will send Brotli-compressed data to clients that have
"br" in their Accept-Encoding request header, and Deflate data to other
clients that indicate gzip/deflate support.

> SetEnvIfNoCase Request_URI (download.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (download_imgzip.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (presse_download_zip.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (content_sub_move.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (synch.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (import.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (admin_imagecopyrights.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (newsletter.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (importer.php)$ no-gzip dont-vary
> SetEnvIfNoCase Request_URI (create.php)$ no-gzip dont-vary

The V1 patch doesn't add the equivalent of "no-gzip" (like, "no-brotli") env
variable.  This is left out for future work, and until then these statements
cannot be migrated seamlessly.  However, I think that the wanted behavior
here could be achieved with mod_filter's FilterProvider directive using
an expression that doesn't install any compression filters for the scripts.


Regards,
Evgeny Kotkov

Re: [PATCH] Introducing mod_brotli

Posted by Reindl Harald <h....@thelounge.net>.
Am 19.09.2016 um 19:56 schrieb Jacob Champion:
> On 09/19/2016 10:12 AM, Eric Covener wrote:
>>
>> I would prefer to keep them separate even if we have to teach something
>> to coordinate them (a module, some new support in mod_filter, some
>> kind of hook?)
>>
>
> +1. (If it proves difficult to make separate compression modules play
> well together, that's a problem we should fix.)

agreed - however, below some configs where my brain rumours how have 
that identically behavior by just use "brotli" compression in case the 
cient supports it - maybe someone with deeper insights as my pure 
adiminstrator view has a idea by looking at it

the "no-gzip dont-vary" stuff is for long running scripts with 
output-flushing to give "realtime" feedback instead have it all buffered

one brainstorming: "AddOutputCompressionByType" provided by whatever 
module, proceed the Accept-Encoding of the client and deciding the 
compression algo

______________________________________

Logging to have the compression ratio in the access-logs

DeflateFilterNote       Ratio ratio_info
LogFormat               "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" 
\"%{User-Agent}i\" (%{ratio_info}n%%)" combined
ErrorLog                "/Volumes/dune/www-servers/_logs/apache_error.log"
CustomLog 
"/Volumes/dune/www-servers/_logs/apache_access.log" combined
LogLevel                notice core:info
______________________________________

[root@testserver:~]$ cat /etc/httpd/conf/httpd-deflate.conf
DeflateCompressionLevel 2
DeflateBufferSize 32768

<Directory "/">
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE text/x-component
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml+rss
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/msword
  AddOutputFilterByType DEFLATE application/msexcel
  AddOutputFilterByType DEFLATE application/mspowerpoint
  AddOutputFilterByType DEFLATE application/msaccess
  AddOutputFilterByType DEFLATE application/mshelp
  AddOutputFilterByType DEFLATE application/pdf
  AddOutputFilterByType DEFLATE application/postscript
  AddOutputFilterByType DEFLATE audio/x-wav
  AddOutputFilterByType DEFLATE text/rtf
  AddOutputFilterByType DEFLATE text/comma-separated-values
  AddOutputFilterByType DEFLATE text/tab-separated-values
  AddOutputFilterByType DEFLATE text/vnd.wap.wml
  AddOutputFilterByType DEFLATE text/vnd.wap.wmlscript
  AddOutputFilterByType DEFLATE text/vnd.wap.wmlscript
  AddOutputFilterByType DEFLATE application/vnd.wap.wmlc
  AddOutputFilterByType DEFLATE text/x-setext
  AddOutputFilterByType DEFLATE text/x-sgml
  AddOutputFilterByType DEFLATE text/x-speech
  AddOutputFilterByType DEFLATE application/x-sh
  AddOutputFilterByType DEFLATE application/x-latex
  AddOutputFilterByType DEFLATE application/x-httpd-php-source
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/x-woff
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE 
application/vnd.ms-word.document.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.wordprocessingml.document
  AddOutputFilterByType DEFLATE 
application/vnd.ms-word.template.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.wordprocessingml.template
  AddOutputFilterByType DEFLATE 
application/vnd.ms-powerpoint.template.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.presentationml.template
  AddOutputFilterByType DEFLATE 
application/vnd.ms-powerpoint.addin.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.ms-powerpoint.slideshow.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.presentationml.slideshow
  AddOutputFilterByType DEFLATE 
application/vnd.ms-powerpoint.presentation.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.presentationml.presentation
  AddOutputFilterByType DEFLATE 
application/vnd.ms-excel.addin.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.ms-excel.sheet.binary.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.ms-excel.sheet.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  AddOutputFilterByType DEFLATE 
application/vnd.ms-excel.template.macroEnabled.12
  AddOutputFilterByType DEFLATE 
application/vnd.openxmlformats-officedocument.spreadsheetml.template
</Directory>

SetEnvIfNoCase Request_URI (download.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (download_imgzip.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (presse_download_zip.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (content_sub_move.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (synch.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (import.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (admin_imagecopyrights.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (newsletter.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (importer.php)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI (create.php)$ no-gzip dont-vary

# Properly handle requests behind proxies
<IfModule mod_headers.c>
  <FilesMatch "\.(php)$">
   Header append "Vary" "User-Agent"
  </FilesMatch>
  <FilesMatch 
"\.(gif|jpe?g|png|htm|html|xml|sgm|sgml|css|js|txt|htc|ico|flv|mp4|m4v|wmv|mov|mpg|ogv|webm|mp3|wav|ogg|oga|swf|doc|docx|xls|xlsx|ppt|pptx|pdf|eot|ttf|otf|woff)$">
   Header unset "Vary"
  </FilesMatch>
  <FilesMatch 
"\.(htm|html|xml|sgm|sgml|css|js|txt|htc|wav|doc|docx|xls|xlsx|ppt|pptx|pdf|eot|ttf|otf|woff)$">
   Header set "Vary" "Accept-Encoding"
  </FilesMatch>
</IfModule>

Re: [PATCH] Introducing mod_brotli

Posted by Jacob Champion <ch...@gmail.com>.
On 09/19/2016 10:12 AM, Eric Covener wrote:
>
> I would prefer to keep them separate even if we have to teach something
> to coordinate them (a module, some new support in mod_filter, some
> kind of hook?)
>

+1. (If it proves difficult to make separate compression modules play 
well together, that's a problem we should fix.)

--Jacob

Re: [PATCH] Introducing mod_brotli

Posted by Eric Covener <co...@gmail.com>.
On Mon, Sep 19, 2016 at 11:35 AM, Reindl Harald <h....@thelounge.net> wrote:
> just an idea - wouldn't it make sense to add 'br' support for mod_deflate
> and have it preferred when the client says in it's request headers that it
> supports the encoding instead having two modules for the same thing just
> using different comrepssion algos?

> if not i am fine and grateful too - though about that again after
> considering how to include it and prefer mod_brotli over mod_defalte for
> clients whcih support it while mod_deflate is still needed for old clients
> only knowing about gzip/deflate

I would prefer to keep them separate even if we have to teach something
to coordinate them (a module, some new support in mod_filter, some
kind of hook?)

-- 
Eric Covener
covener@gmail.com

Re: [PATCH] Introducing mod_brotli

Posted by Reindl Harald <h....@thelounge.net>.

Am 19.09.2016 um 16:14 schrieb Evgeny Kotkov:
> Eric Covener <co...@gmail.com> writes:
>
>>> Wow! This is great stuff. Brotli support has been in my TODO
>>> queue for awhile.
>>>
>>> Thanks!
>>
>> +1, cool stuff and thanks!
>
> Glad to hear that, thanks everyone.
>
> I would be happy to continue the work on this module, for instance, by
> adding the necessary documentation and the ability to log compression ratio

just an idea - wouldn't it make sense to add 'br' support for 
mod_deflate and have it preferred when the client says in it's request 
headers that it supports the encoding instead having two modules for the 
same thing just using different comrepssion algos?

if not i am fine and grateful too - though about that again after 
considering how to include it and prefer mod_brotli over mod_defalte for 
clients whcih support it while mod_deflate is still needed for old 
clients only knowing about gzip/deflate

Re: [PATCH] Introducing mod_brotli

Posted by Evgeny Kotkov <ev...@visualsvn.com>.
Eric Covener <co...@gmail.com> writes:

>> Wow! This is great stuff. Brotli support has been in my TODO
>> queue for awhile.
>>
>> Thanks!
>
> +1, cool stuff and thanks!

Glad to hear that, thanks everyone.

I would be happy to continue the work on this module, for instance, by
adding the necessary documentation and the ability to log compression ratio.


Regards,
Evgeny Kotkov

Re: [PATCH] Introducing mod_brotli

Posted by Eric Covener <co...@gmail.com>.
On Mon, Sep 19, 2016 at 9:55 AM, Jim Jagielski <ji...@jagunet.com> wrote:
> Wow! This is great stuff. Brotli support has been in my TODO
> queue for awhile.
>
> Thanks!

+1, cool stuff and thanks!

-- 
Eric Covener
covener@gmail.com

Re: [PATCH] Introducing mod_brotli

Posted by Jim Jagielski <ji...@jaguNET.com>.
Wow! This is great stuff. Brotli support has been in my TODO
queue for awhile.

Thanks!

> On Sep 16, 2016, at 8:32 AM, Evgeny Kotkov <ev...@visualsvn.com> wrote:
> 
> Hi all,
> 
> This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.
> 
> The new compression format is supported by Mozilla Firefox since 44.0 and
> by Google Chrome since 50.0 [1, 2], and both nginx and IIS have modules that
> offer Brotli compression.
> 
> With the new module, existing mod_deflate installations can benefit from
> better compression ratio by sending Brotli-compressed data to the clients
> that support it:
> 
>    LoadModule brotli_module modules/mod_brotli.so
>    LoadModule deflate_module modules/mod_deflate.so
>    SetOutputFilter BROTLI_COMPRESS;DEFLATE
> 
> This module features zero-copy processing, which is only possible with the
> new API from the upcoming 1.0.x series of brotli [3].
> 
> The Linux makefile works against libbrotli [4], as currently the core brotli
> repository doesn't offer a way to build a library [5].  Enabling mod_brotli
> can be done with:
> 
>    configure --enable-brotli=shared [--with-brotli=]
> 
> CMake build is supported as well.  Please note that the patch doesn't include
> the documentation updates and other types of makefiles, but I will do it
> separately.
> 
> The second patch adds a couple of tests to the test framework.
> 
> [1] https://www.mozilla.org/en-US/firefox/44.0/releasenotes/
> [2] https://www.chromestatus.com/feature/5420797577396224
> [3] https://github.com/google/brotli
> [4] https://github.com/bagder/libbrotli
> [5] https://github.com/google/brotli/pull/332
> 
> 
> Regards,
> Evgeny Kotkov
> <mod_brotli-v1.patch.txt><mod_brotli-tests-v1.patch.txt>


Re: [PATCH] Introducing mod_brotli

Posted by Jacob Champion <ch...@gmail.com>.
On 10/19/2016 06:13 PM, William A Rowe Jr wrote:
> enum boolval {
>    false = 0;
>
> is not that challenging.

Yeah, but I tend to turn up my nose at enums in ABIs too, because the 
question "how big is an enum?" has a more complicated answer than the 
question "how big is an int?".

Ah well, it's not our project. I'll be interested to see how they respond.

--Jacob


Re: [PATCH] Introducing mod_brotli

Posted by William A Rowe Jr <wr...@rowe-clan.net>.
enum boolval {
   false = 0;

is not that challenging.

On Oct 19, 2016 7:38 PM, "Jacob Champion" <ch...@gmail.com> wrote:

> On 09/16/2016 05:32 AM, Evgeny Kotkov wrote:
>
>> This patch adds a module for dynamic Brotli (RFC 7932) compression in
>> httpd.
>>
>
> Just in case someone else runs into this: I gave mod_brotli a shot after a
> user on #httpd-dev asked about Brotli compression, and it immediately ran
> my test server out of memory. :(
>
> The issue appears to be that the libbrotli ABI changes depending on the C
> standard in use. (Specifically, the BROTLI_BOOL type is either C99's _Bool
> or an enum.) So mod_brotli, compiled in maintainer-mode (C89), thinks that
> "false" boolean values coming back from the library are "true". This leads
> to some fun infinite loops.
>
> I've commented upstream, since it looks like the switch from 'int' to
> 'BROTLI_BOOL' was explicitly requested by another user:
>
>     https://github.com/google/brotli/issues/384
>
> --Jacob
>

Re: [PATCH] Introducing mod_brotli

Posted by Jim Jagielski <ji...@jaguNET.com>.
Ahh... that's... interesting.

> On Oct 19, 2016, at 8:37 PM, Jacob Champion <ch...@gmail.com> wrote:
> 
> On 09/16/2016 05:32 AM, Evgeny Kotkov wrote:
>> This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.
> 
> Just in case someone else runs into this: I gave mod_brotli a shot after a user on #httpd-dev asked about Brotli compression, and it immediately ran my test server out of memory. :(
> 
> The issue appears to be that the libbrotli ABI changes depending on the C standard in use. (Specifically, the BROTLI_BOOL type is either C99's _Bool or an enum.) So mod_brotli, compiled in maintainer-mode (C89), thinks that "false" boolean values coming back from the library are "true". This leads to some fun infinite loops.
> 
> I've commented upstream, since it looks like the switch from 'int' to 'BROTLI_BOOL' was explicitly requested by another user:
> 
>    https://github.com/google/brotli/issues/384
> 
> --Jacob


Re: [PATCH] Introducing mod_brotli

Posted by Jacob Champion <ch...@gmail.com>.
On 09/16/2016 05:32 AM, Evgeny Kotkov wrote:
> This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.

Just in case someone else runs into this: I gave mod_brotli a shot after 
a user on #httpd-dev asked about Brotli compression, and it immediately 
ran my test server out of memory. :(

The issue appears to be that the libbrotli ABI changes depending on the 
C standard in use. (Specifically, the BROTLI_BOOL type is either C99's 
_Bool or an enum.) So mod_brotli, compiled in maintainer-mode (C89), 
thinks that "false" boolean values coming back from the library are 
"true". This leads to some fun infinite loops.

I've commented upstream, since it looks like the switch from 'int' to 
'BROTLI_BOOL' was explicitly requested by another user:

     https://github.com/google/brotli/issues/384

--Jacob

Re: [PATCH] Introducing mod_brotli

Posted by Evgeny Kotkov <ev...@visualsvn.com>.
Reindl Harald <h....@thelounge.net> writes:

> how is the ordering?
> defined by SetOutputFilter or client?

Currently, the order is defined by SetOutputFilter, because AFAIK there
is no centralized way to handle Accept-Encoding priorities (like ;q=0.7).

> does it also support (%{ratio_info}n%%) in the log configuration?
>
> LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
> (%{ratio_info}n%%)" combined
>
> leads to:
>
> 213.47.77.186 - - [16/Sep/2016:15:13:28 +0200] "GET / HTTP/1.1" 200 4133 ""
> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML,
> like Gecko) Chrome/49.0.2623.112 Safari/537.36" (38%)
>
> would especially when you compare clients with and without support nice to
> see the difference here

It would certainly be nice, but this version of the patch doesn't have it
yet.  I could do this separately or provide the V2 patch that supports
ratio_info.


Regards,
Evgeny Kotkov

Re: [PATCH] Introducing mod_brotli

Posted by Reindl Harald <h....@thelounge.net>.

Am 16.09.2016 um 14:59 schrieb Stefan Eissing:
> Sweet!
>
>> Am 16.09.2016 um 14:32 schrieb Evgeny Kotkov <ev...@visualsvn.com>:
>>
>> Hi all,
>>
>> This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.
>>
>> The new compression format is supported by Mozilla Firefox since 44.0 and
>> by Google Chrome since 50.0 [1, 2], and both nginx and IIS have modules that
>> offer Brotli compression.
>>
>> With the new module, existing mod_deflate installations can benefit from
>> better compression ratio by sending Brotli-compressed data to the clients
>> that support it:
>>
>>    LoadModule brotli_module modules/mod_brotli.so
>>    LoadModule deflate_module modules/mod_deflate.so
>>    SetOutputFilter BROTLI_COMPRESS;DEFLATE

sounds good - 20% better compression AFAIK

how is the ordering?
defined by SetOutputFilter or client?

looked at my firefox request headers and "br" is at the last position
Accept-Encoding: gzip, deflate, br
__________________________

does it also support (%{ratio_info}n%%) in the log configuration?

LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" 
(%{ratio_info}n%%)" combined

leads to:

213.47.77.186 - - [16/Sep/2016:15:13:28 +0200] "GET / HTTP/1.1" 200 4133 
"" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" (38%)

would especially when you compare clients with and without support nice 
to see the difference here




Re: [PATCH] Introducing mod_brotli

Posted by Stefan Eissing <st...@greenbytes.de>.
Sweet!

> Am 16.09.2016 um 14:32 schrieb Evgeny Kotkov <ev...@visualsvn.com>:
> 
> Hi all,
> 
> This patch adds a module for dynamic Brotli (RFC 7932) compression in httpd.
> 
> The new compression format is supported by Mozilla Firefox since 44.0 and
> by Google Chrome since 50.0 [1, 2], and both nginx and IIS have modules that
> offer Brotli compression.
> 
> With the new module, existing mod_deflate installations can benefit from
> better compression ratio by sending Brotli-compressed data to the clients
> that support it:
> 
>    LoadModule brotli_module modules/mod_brotli.so
>    LoadModule deflate_module modules/mod_deflate.so
>    SetOutputFilter BROTLI_COMPRESS;DEFLATE
> 
> This module features zero-copy processing, which is only possible with the
> new API from the upcoming 1.0.x series of brotli [3].
> 
> The Linux makefile works against libbrotli [4], as currently the core brotli
> repository doesn't offer a way to build a library [5].  Enabling mod_brotli
> can be done with:
> 
>    configure --enable-brotli=shared [--with-brotli=]
> 
> CMake build is supported as well.  Please note that the patch doesn't include
> the documentation updates and other types of makefiles, but I will do it
> separately.
> 
> The second patch adds a couple of tests to the test framework.
> 
> [1] https://www.mozilla.org/en-US/firefox/44.0/releasenotes/
> [2] https://www.chromestatus.com/feature/5420797577396224
> [3] https://github.com/google/brotli
> [4] https://github.com/bagder/libbrotli
> [5] https://github.com/google/brotli/pull/332
> 
> 
> Regards,
> Evgeny Kotkov
> <mod_brotli-v1.patch.txt><mod_brotli-tests-v1.patch.txt>