summaryrefslogtreecommitdiffstats
path: root/server/resty/http_headers.lua
diff options
context:
space:
mode:
Diffstat (limited to 'server/resty/http_headers.lua')
-rw-r--r--server/resty/http_headers.lua44
1 files changed, 44 insertions, 0 deletions
diff --git a/server/resty/http_headers.lua b/server/resty/http_headers.lua
new file mode 100644
index 0000000..97e8157
--- /dev/null
+++ b/server/resty/http_headers.lua
@@ -0,0 +1,44 @@
+local rawget, rawset, setmetatable =
+ rawget, rawset, setmetatable
+
+local str_lower = string.lower
+
+local _M = {
+ _VERSION = '0.17.0-beta.1',
+}
+
+
+-- Returns an empty headers table with internalised case normalisation.
+function _M.new()
+ local mt = {
+ normalised = {},
+ }
+
+ mt.__index = function(t, k)
+ return rawget(t, mt.normalised[str_lower(k)])
+ end
+
+ mt.__newindex = function(t, k, v)
+ local k_normalised = str_lower(k)
+
+ -- First time seeing this header field?
+ if not mt.normalised[k_normalised] then
+ -- Create a lowercased entry in the metatable proxy, with the value
+ -- of the given field case
+ mt.normalised[k_normalised] = k
+
+ -- Set the header using the given field case
+ rawset(t, k, v)
+ else
+ -- We're being updated just with a different field case. Use the
+ -- normalised metatable proxy to give us the original key case, and
+ -- perorm a rawset() to update the value.
+ rawset(t, mt.normalised[k_normalised], v)
+ end
+ end
+
+ return setmetatable({}, mt)
+end
+
+
+return _M