Skip to content

Commit

Permalink
azure function access phase
Browse files Browse the repository at this point in the history
  • Loading branch information
bisakhmondal committed Nov 10, 2021
1 parent d16aa8e commit 96f2fa0
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
105 changes: 105 additions & 0 deletions apisix/plugins/azure-functions.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
--
-- 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.

local core = require("apisix.core")
local http = require("resty.http")
local ngx = ngx
local getenv = os.getenv
local plugin_name = "azure-functions"

local env_key = {
API = "AZURE_FUNCTIONS_APIKEY",
CLIENT_ID = "AZURE_FUNCTIONS_CLIENTID"
}

local schema = {
type = "object",
properties = {
function_uri = {type = "string"},
authorization = {
type = "object",
properties = {
apikey = {type = "string"},
clientid = {type = "string"}
}
},
timeout = {type = "integer", minimum = 1000, default = 3000},
ssl_verify = {type = "boolean", default = false},
keepalive = {type = "boolean", default = true},
keepalive_timeout = {type = "integer", minimum = 1000, default = 60000},
keepalive_pool = {type = "integer", minimum = 1, default = 5}
},
required = {"function_uri"}
}

local _M = {
version = 0.1,
priority = 505,
name = plugin_name,
schema = schema,
}

function _M.check_schema(conf)
return core.schema.check(schema, conf)
end

function _M.access(conf, ctx)
local uri_args = core.request.get_uri_args(ctx)
local headers = core.request.headers(ctx) or {}
local req_body, _ = core.request.get_body()

-- set authorization headers
if conf.authorization then
headers["x-functions-key"] = conf.authorization.apikey or ""
headers["x-functions-clientid"] = conf.authorization.clientid or ""
else
headers["x-functions-key"] = getenv(env_key.API)
headers["x-functions-clientid"] = getenv(env_key.CLIENT_ID)
end

local params = {
method = ngx.req.get_method(),
body = req_body,
query = uri_args,
headers = headers,
keepalive = conf.keepalive,
ssl_verify = conf.ssl_verify
}

-- Keepalive options
if conf.keepalive then
params.keepalive_timeout = conf.keepalive_timeout
params.keepalive_pool = conf.keepalive_pool
end

-- TODO: path processing

local httpc = http.new()
httpc:set_timeout(conf.timeout)

local res, err = httpc:request_uri(conf.function_uri, params)

if not res or err then
return core.response.exit(500, "failed to process azure function, err: " .. err)
end

-- setting response headers
core.response.set_header(res.headers)

return res.status, res.body
end

return _M
1 change: 1 addition & 0 deletions conf/config-default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ plugins: # plugin list (sorted by priority)
- response-rewrite # priority: 899
#- dubbo-proxy # priority: 507
- grpc-transcode # priority: 506
- azure-functions # priority: 505
- prometheus # priority: 500
- datadog # priority: 495
- echo # priority: 412
Expand Down

0 comments on commit 96f2fa0

Please sign in to comment.