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.

30 lines
986 B
Lua

-- RFC 5987
-- Character Set and Language Encoding for
-- Hypertext Transfer Protocol (HTTP) Header Field Parameters
local lpeg = require "lpeg"
local core = require "lpeg_patterns.core"
local language = require "lpeg_patterns.language"
local util = require "lpeg_patterns.util"
local C = lpeg.C
local Cg = lpeg.Cg
local Cs = lpeg.Cs
local P = lpeg.P
local S = lpeg.S
local attr_char = core.ALPHA + core.DIGIT + S"!#$&+-.^_`|~"
-- can't use uri.pct_encoded, as it doesn't decode all characters
local pct_encoded = P"%" * (core.HEXDIG * core.HEXDIG / util.read_hex) / string.char
local value_chars = Cs((pct_encoded + attr_char)^0)
local parmname = C(attr_char^1)
-- ext-value uses charset from RFC 5987
local mime_charsetc = core.ALPHA + core.DIGIT + S"!#$%&+-^_`{}~"
local mime_charset = C(mime_charsetc^1)
local ext_value = Cg(mime_charset, "charset") * P"'" * Cg(language.Language_Tag, "language")^-1 * P"'" * value_chars
return {
ext_value = ext_value;
parmname = parmname;
}