#/*
# * Copyright (c) 2016 IBM. All rights reserved.
# *
# * Permission is hereby granted, free of charge, to any person obtaining a
# * copy of this software and associated documentation files (the "Software"),
# * to deal in the Software without restriction, including without limitation
# * the rights to use, copy, modify, merge, publish, distribute, sublicense,
# * and/or sell copies of the Software, and to permit persons to whom the
# * Software is furnished to do so, subject to the following conditions:
# *
# * The above copyright notice and this permission notice shall be included in
# * all copies or substantial portions of the Software.
# *
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# * DEALINGS IN THE SOFTWARE.
# *
# */

server {
    listen 8080 default_server;

    server_tokens off;

    #turn off the uninitialized_variable_warn ,as it writes to error_log , hence io
    uninitialized_variable_warn off;

    # block ips of embargoed countries
    if ( $blacklist ) {
        return 403;
    }

    include /etc/api-gateway/conf.d/commons/common-headers.conf;
    include /etc/api-gateway/conf.d/includes/resolvers.conf;

    # Log locations with service name
    access_log /var/log/api-gateway/access.log platform;
    error_log /var/log/api-gateway/gateway_error.log debug;

    # include environment variable

    error_page 500 501 502 503 504 /50x.html;

    location /50x.html {
        more_set_headers 'Content-Type: application/json';
        more_set_headers 'X-Request-Id: $requestId';
        return 500 '{"code":$status, "message":"Oops. Something went wrong. Check your URI and try again."}\n';
    }

    location /api {
        content_by_lua '
            ngx.say("You have hit the api gateway managed endpoints.")
        ';
    }

    location = /health {
        proxy_pass http://0.0.0.0:9000/v1/health-check;
    }

    include /etc/api-gateway/managed_confs/*/*.conf;
}


# example of hello-world service protected with API KEY
#server {
#    listen 80;
#
#    server_name ~hello-world.api.(?<domain>.+);
#
#    server_tokens off;
#
#    #turn off the uninitialized_variable_warn ,as it writes to error_log , hence io
#    uninitialized_variable_warn off;
#
#    # block ips of embargoed countries
#    if ( $blacklist ) {
#        return 403;
#    }
#
#    include /etc/api-gateway/conf.d/commons/common-headers.conf;
#    include /etc/api-gateway/conf.d/includes/resolvers.conf;
#    include /etc/api-gateway/conf.d/includes/default_validators.conf;
#
#    # Log locations with service name
#    access_log /var/log/api-gateway/access.log platform;
#    error_log /var/log/api-gateway/marathon_error.log debug;
#
#    # include environment variables
#    include /etc/api-gateway/environment.conf.d/api-gateway-env-vars.server.conf;
#
#    error_page 500 501 502 503 504 /50x.html;
#
#    location /50x.html {
#        more_set_headers 'Content-Type: application/json';
#        more_set_headers 'X-Request-Id: $requestId';
#        return 500 '{"code":$status, "message":"Oops. Something went wrong. Check your URI and try again."}\n';
#    }
#
#    set $marathon_app_name hello-world;
#
#    location ~.*\.(png|jpg|jpeg|js)$ {
#        proxy_pass http://$marathon_app_name$request_uri;
#    }
#
#    location / {
#        # ----------------------------------
#        # add X-Request-Id header
#        # ----------------------------------
#        set $requestId $http_x_request_id;
#        set_secure_random_alphanum $requestId_random 32;
#        set_if_empty $requestId $requestId_random;
#        # add_header X-Request-Id $requestId;
#        proxy_set_header X-Request-Id  $requestId;
#
#        proxy_connect_timeout 10s;  # timeout for establishing a connection with a proxied server
#
#        proxy_read_timeout 10s;     # Defines a timeout for reading a response from the proxied server.
#                                    # The timeout is set only between two successive read operations,
#                                    # not for the transmission of the whole response.
#
#        proxy_send_timeout 10s;     # Sets a timeout for transmitting a request to the proxied server.
#                                    # The timeout is set only between two successive write operations,
#                                    # not for the transmission of the whole request.
#        keepalive_timeout 10s;      # timeout during which a keep-alive client connection will stay open on the server side
#        proxy_buffering off;        # enables or disables buffering of responses from the proxied server.
#        proxy_http_version 1.1;     # Version 1.1 is recommended for use with keepalive connections.
#        proxy_set_header Connection "";
#
#        # identify the service
#        set $service_id $marathon_app_name;
#
#        # identify the api key
#        #     either from the query params or from the "X-Api-Key" header
#        set $api_key $arg_api_key;
#        set_if_empty $api_key $http_x_api_key;
#
#        # add the api-key validator
#        set $validate_api_key on;
#
#        #validate request
#        access_by_lua "ngx.apiGateway.validation.validateRequest()";
#
#        proxy_pass http://$marathon_app_name$request_uri;
#
#        # capture usage data
#        log_by_lua '
#            if ( ngx.apiGateway.metrics ~= nil ) then
#                ngx.apiGateway.metrics.captureUsageData()
#            end
#        ';
#    }
#}