drogue_http_client/
handler.rs1use crate::Response;
2
3use heapless::consts;
4use heapless::String;
5use heapless::{ArrayLength, Vec};
6
7pub struct NoOpResponseHandler;
9
10impl ResponseHandler for NoOpResponseHandler {
11 fn response(&mut self, _: Response) {}
12 fn more_payload(&mut self, _: Result<Option<&[u8]>, ()>) {}
13}
14
15pub trait ResponseHandler {
17 fn response(&mut self, response: Response);
18 fn more_payload(&mut self, payload: Result<Option<&[u8]>, ()>);
19}
20
21pub 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}