Skip to content

Commit 34b3c04

Browse files
committed
feat: added From<BytesMut> for Header struct
1 parent dea7bf0 commit 34b3c04

File tree

3 files changed

+67
-56
lines changed

3 files changed

+67
-56
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use bytes::BytesMut;
2+
3+
use crate::abnf::HEADER_FS;
4+
5+
use super::Header;
6+
7+
/* Description:
8+
* Associated method to build Header.
9+
* Contains atleast CRLF.
10+
*
11+
* Steps:
12+
* 1. Find ": " index.
13+
* 2. If no ": " found, split at index 1 as atleast CRLF if
14+
* present.
15+
* 2. Split to key and value.
16+
*
17+
*/
18+
impl From<BytesMut> for Header {
19+
fn from(mut input: BytesMut) -> Self {
20+
// utf8 already checked in HeaderMap::new()
21+
// safe to unwrap
22+
let data = str::from_utf8(&input).unwrap();
23+
let fs_index = data.find(HEADER_FS).unwrap_or(0);
24+
25+
// 2. If no ": " found, split at index 1 as atleast CRLF if present.
26+
let key = if fs_index == 0 {
27+
input.split_to(1)
28+
} else {
29+
input.split_to(fs_index + 2)
30+
};
31+
Header::new(key, input)
32+
}
33+
}
34+
35+
#[cfg(test)]
36+
mod test {
37+
use super::*;
38+
39+
#[test]
40+
fn test_header_from_basic() {
41+
let buf = BytesMut::from("content-type: application/json\r\n");
42+
let verify_ptr = buf.as_ptr_range();
43+
let header = Header::from(buf);
44+
assert_eq!(header.key_as_str(), "content-type");
45+
assert_eq!(header.value_as_str(), "application/json");
46+
assert_eq!(verify_ptr, header.into_data().as_ptr_range());
47+
}
48+
49+
#[test]
50+
fn test_header_from_fail_no_fs() {
51+
let buf = BytesMut::from("\r\n");
52+
let header = Header::from(buf);
53+
assert_eq!(header.key_as_str(), "\r");
54+
assert_eq!(header.value_as_str(), "\n");
55+
}
56+
57+
#[test]
58+
fn test_header_from_len() {
59+
let buf: BytesMut = "content-type: application/json\r\n".into();
60+
let header = Header::from(buf);
61+
assert_eq!(header.len(), 32);
62+
}
63+
}

header-plz/src/header_map/header/mod.rs

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::str::{self};
33
use bytes::BytesMut;
44

55
use crate::abnf::{CRLF, HEADER_FS};
6+
mod from_bytes;
67
mod from_str;
78

89
// Struct for single Header
@@ -13,31 +14,8 @@ pub struct Header {
1314
}
1415

1516
impl Header {
16-
/* Description:
17-
* Associated method to build Header.
18-
* Contains atleast CRLF.
19-
*
20-
* Steps:
21-
* 1. Find ": " index.
22-
* 2. If no ": " found, split at index 1 as atleast CRLF if
23-
* present.
24-
* 2. Split to key and value.
25-
*
26-
*/
27-
28-
pub fn new(mut input: BytesMut) -> Self {
29-
// utf8 already checked in HeaderMap::new()
30-
// safe to unwrap
31-
let data = str::from_utf8(&input).unwrap();
32-
let fs_index = data.find(HEADER_FS).unwrap_or(0);
33-
34-
// 2. If no ": " found, split at index 1 as atleast CRLF if present.
35-
let key = if fs_index == 0 {
36-
input.split_to(1)
37-
} else {
38-
input.split_to(fs_index + 2)
39-
};
40-
Header { key, value: input }
17+
pub fn new(key: BytesMut, value: BytesMut) -> Self {
18+
Header { key, value }
4119
}
4220

4321
pub fn into_data(mut self) -> BytesMut {
@@ -75,33 +53,3 @@ impl Header {
7553
self.key.len() + self.value.len()
7654
}
7755
}
78-
79-
#[cfg(test)]
80-
mod test {
81-
use super::*;
82-
83-
#[test]
84-
fn test_header_basic() {
85-
let buf = BytesMut::from("content-type: application/json\r\n");
86-
let verify_ptr = buf.as_ptr_range();
87-
let header = Header::new(buf);
88-
assert_eq!(header.key_as_str(), "content-type");
89-
assert_eq!(header.value_as_str(), "application/json");
90-
assert_eq!(verify_ptr, header.into_data().as_ptr_range());
91-
}
92-
93-
#[test]
94-
fn test_header_fail_no_fs() {
95-
let buf = BytesMut::from("\r\n");
96-
let header = Header::new(buf);
97-
assert_eq!(header.key_as_str(), "\r");
98-
assert_eq!(header.value_as_str(), "\n");
99-
}
100-
101-
#[test]
102-
fn test_header_len() {
103-
let buf: BytesMut = "content-type: application/json\r\n".into();
104-
let header = Header::new(buf);
105-
assert_eq!(header.len(), 32);
106-
}
107-
}

header-plz/src/header_map/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl HeaderMap {
4444
let header_str = str::from_utf8(&input).unwrap();
4545
let crlf_index = header_str.find(CRLF).unwrap_or(0);
4646
let header_bytes = input.split_to(crlf_index + 2);
47-
let h = Header::new(header_bytes);
47+
let h = Header::from(header_bytes);
4848
header_vec.push(h);
4949
}
5050
HeaderMap {

0 commit comments

Comments
 (0)