aboutsummaryrefslogtreecommitdiffstats
path: root/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/driver_manager.lua
blob: 490bd94efe4c25292c52d07080cc5d07f3cbb261 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
--[[

    Copyright 2016 Huawei Technologies Co., Ltd.

    Licensed 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.
]]
local _HEADER = "X-Driver-Parameter"

--extract driver header if present in request
function get_driver_header()
  local header = ""
  local driver_header = ngx.req.get_headers()[_HEADER]  
  if (driver_header ~= nil)
  then
    header = driver_header
  end
  return header
end

-- generate query url
function get_query_url(x_driver_header)
  local drivermgr_uri = '/openoapi/drivermgr/v1/drivers'
  local url = drivermgr_uri.."?".._HEADER.."="..tostring(ngx.escape_uri(x_driver_header)).."&service_url="..ngx.var.uri
  return url
end

-- generate driver url
function get_driver_url(driver_header)
  local cjson = require "cjson"
  local query_url = get_query_url(driver_header)
  local res = ngx.location.capture(query_url, { method = ngx.HTTP_GET})
  ngx.log (ngx.ERR, "Driver manager resp url : ", tostring(res.body))
  if (res.status == 200 and res.body ~= nil and res.body ~= '')
  then
    return tostring(cjson.new().decode(res.body).url)
  else
    return ''
  end
end

-- get headers
function get_headers()
  local headers = {}
  local h = ngx.req.get_headers()
  for k, value in pairs(h)
  do
     headers[k] = value
  end
  return headers
end

function get_body_params()
  ngx.req.read_body()
  local actual_body = ""  
  local body_param = ngx.req.get_body_data()
  if(body_param ~= nil)
  then
    actual_body = tostring(body_param)
  end
  return actual_body
end



ngx.log(ngx.INFO, "DRIVER MANAGER LUA", "***********************")

-- extract X-Driver-Parameter header param
local driver_header = get_driver_header()
ngx.log(ngx.ERR, "X-Driver-Parameter: ", driver_header)


-- ignore driver redirection if not driver manager request.
if (driver_header ~= "")
then 
  
  local driver_url = get_driver_url(driver_header)
  ngx.log (ngx.ERR, "Driver manager URl:: ", driver_url)
 
  local http = require "resty.http"
  local actual_headers = get_headers()
  local actual_body = get_body_params()

  ngx.log(ngx.ERR, "HTTP request to driver... ", " Request to driver manager")
  local res, err = http.new():request_uri(driver_url, {
        method = ngx.req.get_method(),
        body = actual_body,
        headers = actual_headers
      })

      if not res then
        ngx.say("Request to driver failed : ", err)
        return
      end
 ngx.log(ngx.ERR, "Response from driver : ", tostring(res.body))
 ngx.say(res.body)

else
  ngx.log(ngx.ERR, "X-Driver-Parameter not present", " Redirect to same url")
end