You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1005 B
Lua
37 lines
1005 B
Lua
-- RFC 7639
|
|
|
|
local lpeg = require "lpeg"
|
|
local http_core = require "lpeg_patterns.http.core"
|
|
local util = require "lpeg_patterns.util"
|
|
|
|
local Cmt = lpeg.Cmt
|
|
local Cs = lpeg.Cs
|
|
local P = lpeg.P
|
|
local R = lpeg.R
|
|
|
|
--[[ protocol-id is a percent-encoded ALPN protocol name
|
|
- Octets in the ALPN protocol MUST NOT be percent-encoded if they
|
|
are valid token characters except "%".
|
|
- When using percent-encoding, uppercase hex digits MUST be used.
|
|
]]
|
|
|
|
local valid_chars = http_core.tchar - P"%"
|
|
local upper_hex = R("09", "AF")
|
|
local percent_char = P"%" * (upper_hex * upper_hex / util.read_hex) / string.char
|
|
local percent_encoded = Cmt(percent_char, function(_, _, c)
|
|
-- check that decoded character would not have been allowed unescaped
|
|
if not valid_chars:match(c) then
|
|
return true, c
|
|
end
|
|
end)
|
|
local percent_replace = Cs((valid_chars + percent_encoded)^0)
|
|
|
|
local protocol_id = percent_replace
|
|
|
|
local ALPN = http_core.comma_sep_trim(protocol_id, 1)
|
|
|
|
return {
|
|
protocol_id = protocol_id;
|
|
ALPN = ALPN;
|
|
}
|