Skip to main content

io_http/rfc9112/
request.rs

1//! HTTP/1.1 request serialisation onto the wire ([RFC 9112 §3]).
2//!
3//! [RFC 9112 §3]: https://www.rfc-editor.org/rfc/rfc9112#section-3
4
5use alloc::{format, vec::Vec};
6
7use crate::{
8    rfc9110::{
9        chars::{CRLF, CRLF_CRLF, SP},
10        headers::CONTENT_LENGTH,
11        request::HttpRequest,
12    },
13    rfc9112::version::HTTP_11,
14};
15
16impl HttpRequest {
17    /// Serialises this request as an HTTP/1.1 message; `Content-Length`
18    /// is regenerated from the body and any existing copy is dropped.
19    pub fn to_http_11_vec(&self) -> Vec<u8> {
20        let mut bytes = Vec::new();
21
22        bytes.extend(self.method.as_bytes());
23        bytes.push(SP);
24        bytes.extend(self.url.path().as_bytes());
25
26        if let Some(q) = self.url.query() {
27            bytes.extend(b"?");
28            bytes.extend(q.as_bytes());
29        }
30
31        bytes.push(SP);
32        bytes.extend(HTTP_11.as_bytes());
33        bytes.extend(CRLF);
34
35        for (key, val) in &self.headers {
36            if key.eq_ignore_ascii_case(CONTENT_LENGTH) {
37                continue;
38            }
39
40            bytes.extend(key.as_bytes());
41            bytes.extend(b": ");
42            bytes.extend(val.as_bytes());
43            bytes.extend(CRLF);
44        }
45
46        let body_len = format!("{}", self.body.len());
47        bytes.extend(CONTENT_LENGTH.as_bytes());
48        bytes.extend(b": ");
49        bytes.extend(body_len.as_bytes());
50        bytes.extend(CRLF_CRLF);
51        bytes.extend(&self.body);
52
53        bytes
54    }
55}