///|
extenum TypedBox += {
Cookies(Map[String, String])
QueryParams(QueryParams)
}
///|
fn join_host_port(host : String, port : UInt16) -> String {
if host.contains_char(':') {
"[\{host}]:\{port}"
} else {
"\{host}:\{port}"
}
}
///|
fn extract_host(host_port : String) -> StringView {
match host_port.rev_split_once(":") {
Some((host, _)) => host
None => host_port
}
}
///|
fn status_to_reason_phrase(code : Int) -> String {
match code {
100 => "Continue"
101 => "Switching Protocols"
102 => "Processing"
103 => "Early Hints"
200 => "OK"
201 => "Created"
202 => "Accepted"
203 => "Non-Authoritative Information"
204 => "No Content"
205 => "Reset Content"
206 => "Partial Content"
207 => "Multi-Status"
208 => "Already Reported"
226 => "IM Used"
300 => "Multiple Choices"
301 => "Moved Permanently"
302 => "Found"
303 => "See Other"
304 => "Not Modified"
305 => "Use Proxy"
306 => "Unused"
307 => "Temporary Redirect"
308 => "Permanent Redirect"
400 => "Bad Request"
401 => "Unauthorized"
402 => "Payment Required"
403 => "Forbidden"
404 => "Not Found"
405 => "Method Not Allowed"
406 => "Not Acceptable"
407 => "Proxy Authentication Required"
408 => "Request Timeout"
409 => "Conflict"
410 => "Gone"
411 => "Length Required"
412 => "Precondition Failed"
413 => "Content Too Large"
414 => "URI Too Long"
415 => "Unsupported Media Type"
416 => "Range Not Satisfiable"
417 => "Expectation Failed"
418 => "I'm a teapot"
421 => "Misdirected Request"
422 => "Unprocessable Content"
423 => "Locked"
424 => "Failed Dependency"
425 => "Too Early"
426 => "Upgrade Required"
428 => "Precondition Required"
429 => "Too Many Requests"
431 => "Request Header Fields Too Large"
451 => "Unavailable For Legal Reasons"
500 => "Internal Server Error"
501 => "Not Implemented"
502 => "Bad Gateway"
503 => "Service Unavailable"
504 => "Gateway Timeout"
505 => "HTTP Version Not Supported"
506 => "Variant Also Negotiates"
507 => "Insufficient Storage"
508 => "Loop Detected"
510 => "Not Extended"
511 => "Network Authentication Required"
_ => "Unknown"
}
}
///|
fn iter_optional_to_headers(headers : &ToHeaders?) -> Iter[(String, String)] {
match headers {
None => Iter::empty()
Some(h) => h.to_headers().iter()
}
}
///|
fn split_path_search(path_search : String) -> (StringView, StringView?) {
match path_search.split_once("?") {
Some((path, search)) => (path, Some(search))
None => (path_search, None)
}
}