Reputation: 626
I have lua code to call microservices. Now I use
local requestId = ngx.req.get_headers()['X-Request-Id']
local host = ngx.req.get_headers()['Host']
local xForwardedProto = ngx.req.get_headers()['X-Forwarded-Proto']
local xForwardedPort = ngx.req.get_headers()['X-Forwarded-Port']
local xForwardedFor = ngx.req.get_headers()['X-Forwarded-For']
local xRealIP = ngx.req.get_headers()['X-Real-IP']
#####and some logic after that call####
local res = httpc:request_uri(targetURL, {
method = "GET",
ssl_verify = false,
headers = {
["Authorization"] = "Bearer " .. ngx.var.unique_token,
["X-Request-Id"] = requestId,
["Cache-Control"] = ngx.req.get_headers()['Cache-Control']
}
})
How can I programmatically pass all headers without knowing the header name?
Upvotes: 2
Views: 1093
Reputation: 425
If someone wants to e.g. select a sub set of the headers:
local out = {}
local headers = ngx.req.get_headers()
for name, value in pairs(headers) do
if some_condition(name) then
out[name] = value
end
end
Upvotes: 1
Reputation: 28940
ngx.req.get_headers()
returns a table of headers.
If you pass that table you don't have to know the header names.
It is not necessary to call that function every time you want to reference a specific header btw.
Instead of
local requestId = ngx.req.get_headers()['X-Request-Id']
local host = ngx.req.get_headers()['Host']
local xForwardedProto = ngx.req.get_headers()['X-Forwarded-Proto']
local xForwardedPort = ngx.req.get_headers()['X-Forwarded-Port']
local xForwardedFor = ngx.req.get_headers()['X-Forwarded-For']
local xRealIP = ngx.req.get_headers()['X-Real-IP']
You can do something like
local headers = ngx.req.get_headers()
local requestId = headers['X-Request-Id']
local host = headers['Host']
local xForwardedProto = headers['X-Forwarded-Proto']
local xForwardedPort = headers['X-Forwarded-Port']
local xForwardedFor = headers['X-Forwarded-For']
local xRealIP = headers['X-Real-IP']
reducing the number of possibly time consuming function calls from 6 to 1.
Upvotes: 0