107 lines
2.6 KiB
Plaintext
107 lines
2.6 KiB
Plaintext
|
|
fun isSeparator(char: String)
|
|
return char == "(" or char == ")"
|
|
or char == "<" or char == ">"
|
|
or char == "@" or char == ","
|
|
or char == ";" or char == ":"
|
|
or char == "\\" or char == '"'
|
|
or char == "/" or char == "?"
|
|
or char == "[" or char == "]"
|
|
or char == "=" or char == " "
|
|
or char == "{" or char == "}"
|
|
or char == "\t";
|
|
|
|
fun isControl(char: String) {
|
|
n = string.ord(char);
|
|
return (n >= 0 and n <= 31) or n == 127;
|
|
}
|
|
|
|
fun isChar(char: String)
|
|
return string.ord(char) < 128;
|
|
|
|
fun isToken(char: String)
|
|
return isChar(char)
|
|
and not isControl(char)
|
|
and not isSeparator(char);
|
|
|
|
fun parseToken(src: String, i: int) {
|
|
offset = i;
|
|
while i < count(src) and isToken(src[i]):
|
|
i = i+1;
|
|
length = i - offset;
|
|
return string.slice(src, offset, length), i;
|
|
}
|
|
|
|
fun isCookieOctet(char: String) {
|
|
n = string.ord(char);
|
|
return n == 33
|
|
or (n >= 35 and n <= 43)
|
|
or (n >= 45 and n <= 58)
|
|
or (n >= 60 and n <= 91)
|
|
or (n >= 93 and n <= 126);
|
|
}
|
|
|
|
fun parseCookieValue(src: String, i: int) {
|
|
|
|
dquote = false;
|
|
if i < count(src) and src[i] == '"': {
|
|
dquote = true;
|
|
i = i+1;
|
|
}
|
|
|
|
if i == count(src) or not isCookieOctet(src[i]):
|
|
return none, none, "Missing value";
|
|
|
|
offset = i;
|
|
do
|
|
i = i+1;
|
|
while i < count(src) and isCookieOctet(src[i]);
|
|
length = i - offset;
|
|
|
|
if dquote: {
|
|
if i == count(src) or src[i] != '"':
|
|
return none, none, "Missing closing double quote";
|
|
i = i+1;
|
|
}
|
|
|
|
return string.slice(src, offset, length), i;
|
|
}
|
|
|
|
fun parseCookiePair(src: String, i: int) {
|
|
|
|
while i < count(src) and src[i] == " ":
|
|
i = i+1;
|
|
|
|
name, i = parseToken(src, i);
|
|
|
|
if i == count(src) or src[i] != "=":
|
|
return none, none, none, "Missing \"=\" after name";
|
|
i = i+1; # Skip the "="
|
|
|
|
value, i, error = parseCookieValue(src, i);
|
|
if error != none:
|
|
return none, none, none, error;
|
|
|
|
while i < count(src) and src[i] == " ":
|
|
i = i+1;
|
|
|
|
if i < count(src) and src[i] == ";":
|
|
i = i+1;
|
|
|
|
return name, value, i;
|
|
}
|
|
|
|
return {
|
|
|
|
fun parseCookieHeader(src: String) {
|
|
cookies = {};
|
|
i = 0;
|
|
while i < count(src): {
|
|
name, value, i, error = parseCookiePair(src, i);
|
|
if error != none:
|
|
return none, error;
|
|
cookies[name] = value;
|
|
}
|
|
return cookies;
|
|
}
|
|
}; |