drogue_http_client/
handler.rs

1use crate::Response;
2
3use heapless::consts;
4use heapless::String;
5use heapless::{ArrayLength, Vec};
6
7/// A no-op response handler.
8pub struct NoOpResponseHandler;
9
10impl ResponseHandler for NoOpResponseHandler {
11    fn response(&mut self, _: Response) {}
12    fn more_payload(&mut self, _: Result<Option<&[u8]>, ()>) {}
13}
14
15/// A trait handling responses to an HTTP request.
16pub trait ResponseHandler {
17    fn response(&mut self, response: Response);
18    fn more_payload(&mut self, payload: Result<Option<&[u8]>, ()>);
19}
20
21/// A response handler, that will buffer all data.
22pub struct BufferResponseHandler<N, NR = consts::U128>
23where
24    N: ArrayLength<u8>,
25    NR: ArrayLength<u8>,
26{
27    version: u8,
28    code: u16,
29    reason: Option<String<NR>>,
30    payload: Vec<u8, N>,
31    complete: bool,
32}
33
34impl<N> BufferResponseHandler<N>
35where
36    N: ArrayLength<u8>,
37{
38    pub fn new() -> Self {
39        BufferResponseHandler {
40            version: 0u8,
41            code: 0u16,
42            reason: None,
43            payload: Vec::new(),
44            complete: false,
45        }
46    }
47
48    pub fn is_complete(&self) -> bool {
49        self.complete
50    }
51
52    pub fn code(&self) -> u16 {
53        self.code
54    }
55
56    pub fn version(&self) -> u8 {
57        self.version
58    }
59
60    pub fn reason(&self) -> &str {
61        self.reason.as_ref().map_or("", |s| s.as_str())
62    }
63
64    pub fn payload(&self) -> &[u8] {
65        &self.payload
66    }
67}
68
69impl<N> ResponseHandler for BufferResponseHandler<N>
70where
71    N: ArrayLength<u8>,
72{
73    fn response(&mut self, response: Response<'_>) {
74        self.version = response.version;
75        self.code = response.code;
76        self.reason = Some(String::from(response.reason));
77    }
78
79    fn more_payload(&mut self, payload: Result<Option<&[u8]>, ()>) {
80        match payload {
81            Ok(Some(data)) => {
82                log::debug!("Append payload data: {:?}", data);
83                self.payload.extend_from_slice(data).ok();
84            }
85            Ok(None) => {
86                log::debug!("Complete response");
87                self.complete = true;
88            }
89            Err(_) => {}
90        }
91    }
92}