http_types_2/other/
expect.rs1use crate::headers::{HeaderName, HeaderValue, Headers, EXPECT};
2use crate::{ensure_eq_status, headers::Header};
3
4use std::fmt::Debug;
5
6#[derive(Debug, Ord, PartialOrd, Eq, PartialEq)]
33pub struct Expect {
34 _priv: (),
35}
36
37impl Expect {
38 pub fn new() -> Self {
40 Self { _priv: () }
41 }
42
43 pub fn from_headers(headers: impl AsRef<Headers>) -> crate::Result<Option<Self>> {
45 let headers = match headers.as_ref().get(EXPECT) {
46 Some(headers) => headers,
47 None => return Ok(None),
48 };
49
50 let header = headers.iter().last().unwrap();
53 ensure_eq_status!(header, "100-continue", 400, "malformed `Expect` header");
54
55 Ok(Some(Self { _priv: () }))
56 }
57}
58
59impl Header for Expect {
60 fn header_name(&self) -> HeaderName {
61 EXPECT
62 }
63 fn header_value(&self) -> HeaderValue {
64 let value = "100-continue";
65 unsafe { HeaderValue::from_bytes_unchecked(value.into()) }
67 }
68}
69
70#[cfg(test)]
71mod test {
72 use super::*;
73 use crate::headers::Headers;
74
75 #[test]
76 fn smoke() -> crate::Result<()> {
77 let expect = Expect::new();
78
79 let mut headers = Headers::new();
80 expect.apply_header(&mut headers);
81
82 let expect = Expect::from_headers(headers)?.unwrap();
83 assert_eq!(expect, Expect::new());
84 Ok(())
85 }
86
87 #[test]
88 fn bad_request_on_parse_error() {
89 let mut headers = Headers::new();
90 headers.insert(EXPECT, "<nori ate the tag. yum.>").unwrap();
91 let err = Expect::from_headers(headers).unwrap_err();
92 assert_eq!(err.status(), 400);
93 }
94}