Parse, serialize, and check Content-Security-Policy headers in MoonBit
moon check --target wasm-gc --deny-warn
moon test --target wasm-gclet policy = @mooncsp.parse(
"default-src 'self'; img-src https: cdn.example.com",
).unwrap()
let req = @mooncsp.request(
"img",
"https://cdn.example.com/a.png",
"https://app.test",
None,
None,
)
// decide = "allow"
let decision = @mooncsp.decide(policy, req)let policy = @mooncsp.parse(
"script-src 'self' 'strict-dynamic' 'nonce-n1'",
).unwrap()
let ok = @mooncsp.request(
"script",
"https://evil.test/x.js",
"https://app.test",
Some("n1"),
None,
)
// decide = "allow"
let allowed = @mooncsp.decide(policy, ok)
let missing = @mooncsp.request(
"script",
"https://app.test/app.js",
"https://app.test",
None,
None,
)
// decide = "csp.strict-dynamic"
let blocked = @mooncsp.decide(policy, missing)let policy = @mooncsp.parse("style-src 'none'").unwrap()
let req = @mooncsp.request(
"style",
"https://app.test/a.css",
"https://app.test",
None,
None,
)
// allows = false,decide = "csp.none"
let allowed = policy.allows(req)
let code = @mooncsp.decide(policy, req)pub struct Request {
kind : String
url : String
origin : String
nonce : String?
hash_sha256 : String?
}fn parse_or_error(input : String) -> StringInstall
Download zipParse, serialize, and check Content-Security-Policy headers in MoonBit