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.

56 lines
2.2 KiB
Lua

local lpeg = require "lpeg"
local core = require "lpeg_patterns.core"
local http_core = require "lpeg_patterns.http.core"
local Cc = lpeg.Cc
local Cf = lpeg.Cf
local Cg = lpeg.Cg
local Ct = lpeg.Ct
local Cmt = lpeg.Cmt
local P = lpeg.P
local S = lpeg.S
-- RFC 6455
local base64_character = core.ALPHA + core.DIGIT + S"+/"
local base64_data = base64_character * base64_character * base64_character * base64_character
local base64_padding = base64_character * base64_character * P"=="
+ base64_character * base64_character * base64_character * P"="
local base64_value_non_empty = (base64_data^1 * base64_padding^-1) + base64_padding
local Sec_WebSocket_Accept = base64_value_non_empty
local Sec_WebSocket_Key = base64_value_non_empty
local registered_token = http_core.token
local extension_token = registered_token
local extension_param do
local EOF = P(-1)
local token_then_EOF = Cc(true) * http_core.token * EOF
-- the quoted-string must be a valid token
local quoted_token = Cmt(http_core.quoted_string, function(_, _, q)
return token_then_EOF:match(q)
end)
extension_param = http_core.token * ((P"=" * (http_core.token + quoted_token)) + Cc(true))
end
local extension = extension_token * Cg(Cf(Ct(true) * (P";" * Cg(extension_param))^0, rawset), "parameters")
local extension_list = http_core.comma_sep_trim(Ct(extension))
local Sec_WebSocket_Extensions = extension_list
local Sec_WebSocket_Protocol_Client = http_core.comma_sep_trim(http_core.token)
local Sec_WebSocket_Protocol_Server = http_core.token
local NZDIGIT = S"123456789"
-- Limited to 0-255 range, with no leading zeros
local version = (
P"2" * (S"01234" * core.DIGIT + P"5" * S"012345")
+ (P"1") * core.DIGIT * core.DIGIT
+ NZDIGIT * core.DIGIT^-1
) / tonumber
local Sec_WebSocket_Version_Client = version
local Sec_WebSocket_Version_Server = http_core.comma_sep_trim(version)
return {
Sec_WebSocket_Accept = Sec_WebSocket_Accept;
Sec_WebSocket_Key = Sec_WebSocket_Key;
Sec_WebSocket_Extensions = Sec_WebSocket_Extensions;
Sec_WebSocket_Protocol_Client = Sec_WebSocket_Protocol_Client;
Sec_WebSocket_Protocol_Server = Sec_WebSocket_Protocol_Server;
Sec_WebSocket_Version_Client = Sec_WebSocket_Version_Client;
Sec_WebSocket_Version_Server = Sec_WebSocket_Version_Server;
}