fire_http_representation/header/
url.rs1use super::Uri;
2
3use http::uri::{Authority, PathAndQuery, Scheme};
4
5pub use form_urlencoded::Parse as QueryIter;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct Url {
13 scheme: Scheme,
14 authority: Authority,
15 path_and_query: PathAndQuery,
16}
17
18impl Url {
19 pub fn from_inner(inner: Uri) -> Option<Self> {
23 let parts = inner.into_parts();
24 Some(Self {
25 scheme: parts.scheme?,
26 authority: parts.authority?,
27 path_and_query: parts
28 .path_and_query
29 .unwrap_or_else(|| PathAndQuery::from_static("/")),
30 })
31 }
32
33 pub fn scheme(&self) -> &str {
35 self.scheme.as_str()
36 }
37
38 pub fn is_https(&self) -> bool {
40 self.scheme == Scheme::HTTPS
41 }
42
43 pub fn is_http(&self) -> bool {
45 self.scheme == Scheme::HTTP
46 }
47
48 pub fn host(&self) -> &str {
50 self.authority.host()
51 }
52
53 pub fn port(&self) -> Option<u16> {
55 self.authority.port_u16()
56 }
57
58 pub fn path(&self) -> &str {
60 self.path_and_query.path()
61 }
62
63 pub fn path_segments(&self) -> std::str::Split<'_, char> {
66 let path = self.path();
67 let path = path.strip_prefix('/').unwrap_or(path);
68 let path = path.strip_suffix('/').unwrap_or(path);
69 path.split('/')
70 }
71
72 pub fn query(&self) -> Option<&str> {
74 self.path_and_query.query()
75 }
76
77 pub fn parse_query_pairs(&self) -> QueryIter {
85 form_urlencoded::parse(self.query().unwrap_or("").as_bytes())
86 }
87}