diff options
| author | omagdy7 <omar.professional8777@gmail.com> | 2024-06-05 18:13:08 +0300 |
|---|---|---|
| committer | omagdy7 <omar.professional8777@gmail.com> | 2024-06-05 18:13:08 +0300 |
| commit | ff75fa542a98cf9a79133a81b7716401e717bfd6 (patch) | |
| tree | c9433151c9dc21a16a822d4a8f1f6f7c526b1701 /src/response.rs | |
| parent | 4f9d09b58ae81e4e6144b85ce36ba424e319b779 (diff) | |
| download | tiny-server-ff75fa542a98cf9a79133a81b7716401e717bfd6.tar.xz tiny-server-ff75fa542a98cf9a79133a81b7716401e717bfd6.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'src/response.rs')
| -rw-r--r-- | src/response.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/response.rs b/src/response.rs index 4219afd..c3540d2 100644 --- a/src/response.rs +++ b/src/response.rs @@ -38,3 +38,56 @@ impl Into<String> for Response { format!("{status_line}\r\n{headers}\r\n{body}") } } + +impl Into<Response> for &str { + fn into(self) -> Response { + let mut lines = self.lines(); + + // Parse the status line + let status_line = lines.next().unwrap_or_default(); + let mut status_line_parts = status_line.split_whitespace(); + + let version = status_line_parts.next().unwrap_or_default().to_string(); + let status_code = status_line_parts.next().unwrap_or_default(); + + let status = match status_code { + "200" => StatusCode::Ok, + "404" => StatusCode::NotFound, + _ => StatusCode::Ok, + }; + + // Parse headers + let mut headers_map = HashMap::new(); + while let Some(line) = lines.next() { + if line.is_empty() { + break; + } + let mut parts = line.splitn(2, ':'); + let key = parts.next().unwrap_or_default().trim(); + let value = parts.next().unwrap_or_default().trim(); + headers_map.insert(key.to_string(), value.to_string()); + } + let headers = if headers_map.is_empty() { + None + } else { + Some(Headers(headers_map)) + }; + + // Parse body + let body: Option<String> = { + let remaining_lines: Vec<&str> = lines.collect(); + if remaining_lines.is_empty() { + None + } else { + Some(remaining_lines.join("\n")) + } + }; + + Response { + version, + status, + headers, + body, + } + } +} |
