Message

pub struct Message {
    pub body: BodyContentType,
    pub headers: HashMap<String, HeaderValueParts>,
    pub request_line: Line,
}

Fields§

§body: BodyContentType§headers: HashMap<String, HeaderValueParts>§request_line: Line

Implementations§

Source§

impl Message

Source

pub fn get_protocol_text(protocol: &Protocol) -> String

Examples found in repository?
examples/dynamic.rs (line 53)
44    fn respond(
45        &self,
46        request_message: &request::Message,
47        _application: &Application,
48        _socket: &SocketAddr,
49        overflow_bytes: &u64,
50    ) -> Result<response::Message, String> {
51        if let Some(route) = &self.route {
52            let protocol =
53                request::Message::get_protocol_text(&request_message.request_line.protocol);
54            let mut headers: HashMap<String, String> = HashMap::new();
55            headers.insert("Content-Type".to_string(), "text/html".to_string());
56
57            let upload = match request_message.body {
58                BodyContentType::MultiPart(ref body) => match body.get(&"file".to_string()) {
59                    Some(value) => match String::from_utf8(value.body.clone()) {
60                        Ok(utf8_value) => utf8_value,
61                        _ => format!("no UTF-8 file data in: {:?}", &value.body),
62                    },
63                    _ => format!("no file data in {:?}", request_message),
64                },
65                _ => "no data".to_string(),
66            };
67
68            let upload2 = match request_message.body {
69                BodyContentType::MultiPart(ref body) => match body.get(&"file2".to_string()) {
70                    Some(value) => match String::from_utf8(value.body.clone()) {
71                        Ok(utf8_value) => utf8_value,
72                        _ => format!("no UTF-8 file data in: {:?}", &value.body),
73                    },
74                    _ => format!("no file data in {:?}", request_message),
75                },
76                _ => "no data".to_string(),
77            };
78
79            // NOTE uncomment to test concurrency
80            // thread::sleep(Duration::from_secs(2));
81
82            let mut overflow_upload = "Upload did not overflow server byte limit!";
83            if overflow_bytes > &0 {
84                overflow_upload = "Your upload exceeded server byte limit!";
85            }
86
87            let output = format!("<html><head><title>Milstian Internet Framework - Dynamic Example</title><link rel='stylesheet' href='/css/style.css' /></head><body><div class='wrapper'><h1>Milstian Web Framework</h1><img alt='' src='/img/logo1-modified.jpg' /><p><strong>Query argument:</strong> {}</p><div><strong>File upload 1:</strong><br /><pre>{}</pre></div><div><strong>File upload 2:</strong><br /><pre>{}</pre></div><h2>Dynamic Test</h2><form action='' method='post' enctype='multipart/form-data'><fieldset><legend>File upload</legend><div><label>Select file 1<br /><input type='file' name='file' /></label></div><div><label>Select file 2<br /><input type='file' name='file2' /></label></div><p>{}</p><div><input type='submit' value='Upload' /></div></fieldset></form></div></body></html>", route, &upload, &upload2, &overflow_upload);
88
89            return Ok(response::Message::new(
90                protocol.to_string(),
91                "200 OK".to_string(),
92                headers,
93                output.as_bytes().to_vec(),
94            ));
95        } else {
96            Err("No result".to_string())
97        }
98    }
Source

pub fn get_message_body(body: &str) -> Option<BodyContentType>

Source

pub fn get_header_field(line: &str) -> Option<(String, HeaderValueParts)>

Source

pub fn get_request_line(line: &str) -> Option<Line>

Source

pub fn from_tcp_stream(request: &[u8]) -> Option<Message>

Try to decode a byte stream into a HTTP Message

§Usage
use milstian_http::request::{Message, Method, Protocol};
let response = Message::from_tcp_stream(b"GET / HTTP/2.0\r\n");
let response_unwrapped = response.expect("A decoded HTTP Message");
assert_eq!(response_unwrapped.request_line.method, Method::Get);
assert_eq!(response_unwrapped.request_line.request_uri, "/".to_string());
assert_eq!(response_unwrapped.request_line.protocol, Protocol::V2_0);

Trait Implementations§

Source§

impl Debug for Message

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.