+
+val redirect_code = fn (EVar "temp", _) => SOME "temp"
+ | (EVar "permanent", _) => SOME "permanent"
+ | (EVar "seeother", _) => SOME "seeother"
+ | (EVar "redir300", _) => SOME "300"
+ | (EVar "redir301", _) => SOME "301"
+ | (EVar "redir302", _) => SOME "302"
+ | (EVar "redir303", _) => SOME "303"
+ | (EVar "redir304", _) => SOME "304"
+ | (EVar "redir305", _) => SOME "305"
+ | (EVar "redir307", _) => SOME "307"
+ | _ => NONE
+
+val flag = fn (EVar "redirect", _) => SOME "R"
+ | (EVar "forbidden", _) => SOME "F"
+ | (EVar "gone", _) => SOME "G"
+ | (EVar "last", _) => SOME "L"
+ | (EVar "chain", _) => SOME "C"
+ | (EVar "nosubreq", _) => SOME "NS"
+ | (EVar "nocase", _) => SOME "NC"
+ | (EVar "qsappend", _) => SOME "QSA"
+ | (EVar "noescape", _) => SOME "NE"
+ | (EVar "passthrough", _) => SOME "PT"
+ | (EApp ((EVar "mimeType", _), e), _) =>
+ Option.map (fn s => "T=" ^ s) (Env.string e)
+ | (EApp ((EVar "redirectWith", _), e), _) =>
+ Option.map (fn s => "R=" ^ s) (redirect_code e)
+ | (EApp ((EVar "skip", _), e), _) =>
+ Option.map (fn n => "S=" ^ Int.toString n) (Env.int e)
+ | (EApp ((EApp ((EVar "env", _), e1), _), e2), _) =>
+ (case Env.string e1 of
+ NONE => NONE
+ | SOME s1 => Option.map (fn s2 => "E=" ^ s1 ^ ":" ^ s2)
+ (Env.string e2))
+
+ | _ => NONE
+
+