Skip to main content

io_http/rfc1945/
request.rs

1//! HTTP/1.0 request serialisation onto the wire ([RFC 1945 §4]).
2//!
3//! [RFC 1945 §4]: https://www.rfc-editor.org/rfc/rfc1945#section-4
4
5use alloc::{format, vec::Vec};
6
7use crate::{
8    rfc1945::version::HTTP_10,
9    rfc9110::{
10        chars::{CRLF, CRLF_CRLF, SP},
11        headers::CONTENT_LENGTH,
12        request::HttpRequest,
13    },
14};
15
16impl HttpRequest {
17    /// Serialises this request as an HTTP/1.0 message; `Content-Length` is
18    /// regenerated from the body and any existing copy is dropped.
19    pub fn to_http_10_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_10.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}