#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

# -------------------------
# 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;

# -----------
# X-Real-IP
# -----------
set $proxy_remote_addr $http_x_real_ip;
set_if_empty $proxy_remote_addr $remote_addr;
proxy_set_header X-Real-IP $proxy_remote_addr;

# -----------------
# X-Forwarded-For
# -----------------
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# ----------------
# X-Forwarded-Host
# ----------------
set $proxy_forwarded_host $http_x_forwarded_host;
set_if_empty $proxy_forwarded_host $host;
proxy_set_header X-Forwarded-Host $proxy_forwarded_host;

# -----------------
# X-Forwarded-Port
# -----------------
set $proxy_forwarded_port $http_x_forwarded_port;
set_if_empty $proxy_forwarded_port $server_port;
proxy_set_header X-Forwarded-Port $proxy_forwarded_port;

# ------------------
# X-Forwarded-Proto
# ------------------
set $proxy_forwarded_proto $http_x_forwarded_proto;
set_if_empty $proxy_forwarded_proto $scheme;
proxy_set_header X-forwarded-Proto $proxy_forwarded_proto;

# ---------------
# X-Gateway-Host
# ---------------
set_by_lua_block $gateway_host {
  local host = os.getenv("HOST")
  local port = os.getenv("PORT")
  if host ~= nil and port ~= nil then
    return host .. ":" .. port
  end
}
add_header X-Gateway-Host $gateway_host;
