You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by mh...@apache.org on 2019/09/04 02:08:15 UTC

[openwhisk-apigateway] branch master updated: Add support for preserving XF headers from upstream (#356)

This is an automated email from the ASF dual-hosted git repository.

mhamann pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwhisk-apigateway.git


The following commit(s) were added to refs/heads/master by this push:
     new 24d9865  Add support for preserving XF headers from upstream (#356)
24d9865 is described below

commit 24d986537132c36794b583fe70f0af9eadf8cb31
Author: Hidematsu Sueki <hs...@gmail.com>
AuthorDate: Tue Sep 3 22:08:10 2019 -0400

    Add support for preserving XF headers from upstream (#356)
    
    * Preserve X-Forwarded-Host from upstream
    
    * Use X-Forwarded-Uri if present
    
    * Index headers from local variable
---
 conf.d/commons/common-headers.conf | 13 +++++++++----
 scripts/lua/routing.lua            | 20 +++++++++++++++-----
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/conf.d/commons/common-headers.conf b/conf.d/commons/common-headers.conf
index b67b6ef..efb3106 100644
--- a/conf.d/commons/common-headers.conf
+++ b/conf.d/commons/common-headers.conf
@@ -25,18 +25,23 @@ add_header X-Request-Id $requestId;
 proxy_set_header X-Request-Id  $requestId;
 
 # -----------
-#  X-Real-IP
+# 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
-#  X-Forwarded-Host
+# X-Forwarded-For
 # -----------------
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-proxy_set_header X-Forwarded-Host $host;
+
+# ----------------
+# 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
diff --git a/scripts/lua/routing.lua b/scripts/lua/routing.lua
index fd10026..f4d1845 100644
--- a/scripts/lua/routing.lua
+++ b/scripts/lua/routing.lua
@@ -46,6 +46,8 @@ local _M = {}
 
 --- Main function that handles parsing of invocation details and carries out implementation
 function _M.processCall(dataStore)
+  -- Get request headers
+  local requestHeaders = ngx.req.get_headers()
   -- Get resource object from redis
   local tenantId = ngx.var.tenant
 
@@ -91,22 +93,30 @@ function _M.processCall(dataStore)
       -- Set backend upstream and uri
       backendRouting.setRoute(opFields.backendUrl, gatewayPath)
       -- Set gateway url as request header
-      local requestScheme = ngx.req.get_headers()["X-Forwarded-Proto"]
+      local requestScheme = requestHeaders["X-Forwarded-Proto"]
       if requestScheme == nil or requestScheme == "" then
         requestScheme = ngx.var.scheme
       end
-      local requestUrl = utils.concatStrings({requestScheme, "://", ngx.var.host})
-      local prefix = ngx.req.get_headers()["X-Forwarded-Prefix"]
+      local requestHost = requestHeaders["X-Forwarded-Host"]
+      if requestHost == nil or requestHost == "" then
+        requestHost = ngx.var.host
+      end
+      local requestUrl = utils.concatStrings({requestScheme, "://", requestHost})
+      local prefix = requestHeaders["X-Forwarded-Prefix"]
       if prefix ~= nil and prefix ~= "" then
         requestUrl = utils.concatStrings({requestUrl, prefix})
       end
-      ngx.req.set_header("X-Forwarded-Url", utils.concatStrings({requestUrl, ngx.var.request_uri}))
+      local requestUri = requestHeaders["X-Forwarded-Uri"]
+      if requestUri == nil or requestUri == "" then
+        requestUri = ngx.var.request_uri
+      end
+      ngx.req.set_header("X-Forwarded-Url", utils.concatStrings({requestUrl, requestUri}))
       -- Parse policies
       if opFields.policies ~= nil then
         parsePolicies(dataStore, opFields.policies, key)
       end
       -- Log updated request headers/body info to access logs
-      if ngx.req.get_headers()["x-debug-mode"] == "true" then
+      if requestHeaders["x-debug-mode"] == "true" then
         setRequestLogs()
       end
       dataStore:close()