# Copyright (C) 2015-2016 Google Inc.
# 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.

ngx_addon_name=ngx_brotli

#
# static module (no dependencies)
#

if [ -n "$ngx_module_link" ]; then
    # nginx-1.9.11+
    ngx_module_type=HTTP
    ngx_module_name=ngx_http_brotli_static_module
    ngx_module_incs=
    ngx_module_deps=
    ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_static_module.c"
    ngx_module_libs=

    . auto/module
else
    HTTP_MODULES="$HTTP_MODULES \
                  ngx_http_brotli_static_module"

    NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
                    $ngx_addon_dir/src/ngx_http_brotli_static_module.c"
fi

have=NGX_HTTP_GZIP . auto/have
have=NGX_HTTP_BROTLI_STATIC . auto/have

if [ -n "$NGX_BROTLI_STATIC_MODULE_ONLY" ]; then
    return
fi

#
# filter module (depends on Brotli library)
#

ngx_feature_name=
ngx_feature_run=no
ngx_feature_incs="#include <brotli/enc/encode.h>"
ngx_feature_test="BrotliEncoderCreateInstance(NULL, NULL, NULL)"

# auto-discovery
ngx_feature="Brotli library"
ngx_feature_path=
ngx_feature_libs="-lbrotlienc"
. auto/feature

if [ $ngx_found = no ]; then
    # FreeBSD, OpenBSD
    ngx_feature="Brotli library in /usr/local/"
    ngx_feature_path="/usr/local/include"
    if [ $NGX_RPATH = YES ]; then
        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc"
    else
        ngx_feature_libs="-L/usr/local/lib -lbrotlienc"
    fi
    . auto/feature
fi

if [ $ngx_found = no ]; then
    # NetBSD
    ngx_feature="Brotli library in /usr/pkg/"
    ngx_feature_path="/usr/pkg/include"
    if [ $NGX_RPATH = YES ]; then
        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc"
    else
        ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc"
    fi
    . auto/feature
fi

if [ $ngx_found = no ]; then
    # MacPorts
    ngx_feature="Brotli library in /opt/local/"
    ngx_feature_path="/opt/local/include"
    if [ $NGX_RPATH = YES ]; then
        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc"
    else
        ngx_feature_libs="-L/opt/local/lib -lbrotlienc"
    fi
    . auto/feature
fi

if [ $ngx_found = no ]; then
    echo "$0: error: ngx_brotli filter module requires Brotli library."
    exit 1
fi

if [ $HTTP_GZIP = YES ]; then
    next=ngx_http_gzip_filter_module
elif echo $HTTP_FILTER_MODULES | grep ngx_pagespeed_etag_filter >/dev/null; then
    next=ngx_pagespeed_etag_filter
else
    next=ngx_http_range_header_filter_module
fi

if [ -n "$ngx_module_link" ]; then
    # nginx-1.9.11+
    ngx_module_type=HTTP_FILTER
    ngx_module_name=ngx_http_brotli_filter_module
    ngx_module_incs="$ngx_feature_path"
    ngx_module_deps=
    ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
    ngx_module_libs="$ngx_feature_libs"
    ngx_module_order="$ngx_module_name \
                      ngx_pagespeed \
                      ngx_http_postpone_filter_module \
                      ngx_http_ssi_filter_module \
                      ngx_http_charset_filter_module \
                      ngx_http_xslt_filter_module \
                      ngx_http_image_filter_module \
                      ngx_http_sub_filter_module \
                      ngx_http_addition_filter_module \
                      ngx_http_gunzip_filter_module \
                      ngx_http_userid_filter_module \
                      ngx_http_headers_filter_module"

    . auto/module

    if [ $ngx_module_link != DYNAMIC ]; then
        # ngx_module_order doesn't work with static modules,
        # so we must re-order filters here.
        HTTP_FILTER_MODULES=`echo $HTTP_FILTER_MODULES \
                             | sed "s/$ngx_module_name//" \
                             | sed "s/$next/$next $ngx_module_name/"`
    fi
else
    CORE_INCS="$CORE_INCS $ngx_feature_path"
    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"

    HTTP_FILTER_MODULES=`echo $HTTP_FILTER_MODULES \
                         | sed "s/$next/$next ngx_http_brotli_filter_module/"`

    NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
                    $ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
fi

have=NGX_HTTP_BROTLI_FILTER . auto/have
