// RFC3986 Appendix A and RFC6265 section 4.1.1 / 4.2.1, with token from RFC9110.
// Attribution, adaptations and licenses: fixtures/protocols/SOURCES.md.

///|
pub fn uri_grammar() -> Bytes {
  let lines = [
    "URI           = scheme \":\" hier-part [ \"?\" query ] [ \"#\" fragment ]",
    "hier-part     = \"//\" authority path-abempty", "              / path-absolute",
    "              / path-rootless", "              / path-empty", "URI-reference = URI / relative-ref",
    "absolute-URI  = scheme \":\" hier-part [ \"?\" query ]", "relative-ref  = relative-part [ \"?\" query ] [ \"#\" fragment ]",
    "relative-part = \"//\" authority path-abempty", "              / path-absolute",
    "              / path-noscheme", "              / path-empty", "scheme        = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )",
    "authority     = [ userinfo \"@\" ] host [ \":\" port ]", "userinfo      = *( unreserved / pct-encoded / sub-delims / \":\" )",
    "host          = IP-literal / IPv4address / reg-name", "port          = *DIGIT",
    "IP-literal    = \"[\" ( IPv6address / IPvFuture  ) \"]\"", "IPvFuture     = \"v\" 1*HEXDIG \".\" 1*( unreserved / sub-delims / \":\" )",
    "IPv6address   =                            6( h16 \":\" ) ls32", "              /                       \"::\" 5( h16 \":\" ) ls32",
    "              / [               h16 ] \"::\" 4( h16 \":\" ) ls32", "              / [ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32",
    "              / [ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32", "              / [ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32",
    "              / [ *4( h16 \":\" ) h16 ] \"::\"              ls32", "              / [ *5( h16 \":\" ) h16 ] \"::\"              h16",
    "              / [ *6( h16 \":\" ) h16 ] \"::\"", "h16           = 1*4HEXDIG",
    "ls32          = ( h16 \":\" h16 ) / IPv4address", "IPv4address   = dec-octet \".\" dec-octet \".\" dec-octet \".\" dec-octet",
    "dec-octet     = DIGIT                 ; 0-9", "              / %x31-39 DIGIT         ; 10-99",
    "              / \"1\" 2DIGIT            ; 100-199", "              / \"2\" %x30-34 DIGIT     ; 200-249",
    "              / \"25\" %x30-35          ; 250-255", "reg-name      = *( unreserved / pct-encoded / sub-delims )",
    "path          = path-abempty    ; begins with \"/\" or is empty", "              / path-absolute   ; begins with \"/\" but not \"//\"",
    "              / path-noscheme   ; begins with a non-colon segment", "              / path-rootless   ; begins with a segment",
    "              / path-empty      ; zero characters", "path-abempty  = *( \"/\" segment )",
    "path-absolute = \"/\" [ segment-nz *( \"/\" segment ) ]", "path-noscheme = segment-nz-nc *( \"/\" segment )",
    "path-rootless = segment-nz *( \"/\" segment )", "path-empty    = \"\"", "segment       = *pchar",
    "segment-nz    = 1*pchar", "segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / \"@\" )",
    "              ; non-zero-length segment without any colon \":\"", "pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"",
    "query         = *( pchar / \"/\" / \"?\" )", "fragment      = *( pchar / \"/\" / \"?\" )",
    "pct-encoded   = \"%\" HEXDIG HEXDIG", "unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"",
    "reserved      = gen-delims / sub-delims", "gen-delims    = \":\" / \"/\" / \"?\" / \"#\" / \"[\" / \"]\" / \"@\"",
    "sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"", "              / \"*\" / \"+\" / \",\" / \";\" / \"=\"",
  ]
  @utf8.encode((lines.join("\r\n") + "\r\n")[:])
}

///|
pub fn cookie_grammar() -> Bytes {
  let lines = [
    "cookie-string = cookie-pair *( \";\" SP cookie-pair )", "cookie-pair = cookie-name \"=\" cookie-value",
    "cookie-name = token", "cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )",
    "cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E", "token = 1*tchar",
    "tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\" / DIGIT / ALPHA",
  ]
  @utf8.encode((lines.join("\r\n") + "\r\n")[:])
}