diff --git a/src/body.rs b/src/body.rs index 740235f..4f4ba71 100755 --- a/src/body.rs +++ b/src/body.rs @@ -136,11 +136,11 @@ impl Body { pub async fn recv(stream: &mut (impl AsyncReadExt + Unpin), headers: &Headers) -> Result { let mut reqdata: Vec = Vec::new(); - if let Some(content_size) = headers.clone().get("content-length".to_string()) { + if let Some(content_size) = headers.clone().get("content-length".to_string()).get(0) { let content_size: usize = content_size.parse().map_err(|_| HttpError::InvalidContentSize)?; reqdata.resize(content_size, 0); stream.read_exact(&mut reqdata).await.map_err(|_| HttpError::InvalidContent)?; - } else if let Some(transfer_encoding) = headers.clone().get("transfer_encoding".to_string()) { + } else if let Some(transfer_encoding) = headers.clone().get("transfer_encoding".to_string()).get(0) { if transfer_encoding.split(",").map(|o| o.trim()).find(|o| o == &"chunked").is_some() { loop { let length = usize::from_str_radix(&read_line_crlf(stream).await?, 16).map_err(|_| HttpError::InvalidContent)?; diff --git a/src/headers.rs b/src/headers.rs index 531948b..ef5d045 100755 --- a/src/headers.rs +++ b/src/headers.rs @@ -51,39 +51,32 @@ impl Headers { return false; } - pub fn get(&self, key: impl ToString) -> Option { - for (k, v) in &self.entries { - if k.to_lowercase() == key.to_string().to_lowercase() { - return Some(v.clone()); - } - } - return None; + pub fn get(&self, key: impl ToString) -> Vec { + return self.entries.clone().into_iter() + .filter(|(k, _)| k.to_lowercase() == key.to_string().to_lowercase()) + .map(|(_, v)| v) + .collect(); + } + + pub fn add(&mut self, key: impl ToString, value: String) { + self.entries.push((key.to_string(), value)); } pub fn put(&mut self, key: impl ToString, value: String) { - for t in self.entries.iter_mut() { - if t.0.to_lowercase() == key.to_string().to_lowercase() { - t.1 = value; - return; - } - } + self.remove(key.to_string()); self.entries.push((key.to_string(), value)); } pub fn put_default(&mut self, key: impl ToString, value: String) { - for t in self.entries.iter_mut() { - if t.0.to_lowercase() == key.to_string().to_lowercase() { - return; - } + if self.get(key.to_string()).is_empty() { + self.entries.push((key.to_string(), value)); } - self.entries.push((key.to_string(), value)); } pub fn remove(&mut self, key: impl ToString) { - for (i, t) in self.entries.iter_mut().enumerate() { + for (i, t) in self.entries.clone().iter().enumerate() { if t.0.to_lowercase() == key.to_string().to_lowercase() { self.entries.remove(i); - return; } } } @@ -116,7 +109,7 @@ impl Headers { if text.len() == 0 { break } let (key, value) = text.split_once(": ").ok_or(HttpError::InvalidHeaders)?; - headers.put(key.to_lowercase(), value.to_string()); + headers.add(key, value.to_string()); } Ok(headers) diff --git a/src/request.rs b/src/request.rs index f063bc5..5ef1c07 100755 --- a/src/request.rs +++ b/src/request.rs @@ -186,7 +186,7 @@ impl HttpRequest { /// Get multipart parts (requires Content-Type header) pub fn get_multipart(&self) -> Option> { - let boundary = self.headers.get("content-type")? + let boundary = self.headers.get("content-type").get(0)? .split(";") .map(|o| o.trim()) .find(|o| o.starts_with("boundary=")) diff --git a/src/response.rs b/src/response.rs index 8566a64..a14e4c2 100755 --- a/src/response.rs +++ b/src/response.rs @@ -49,7 +49,7 @@ impl HttpResponse { } pub fn get_multipart(&self) -> Option> { - let boundary = self.headers.get("content-type")? + let boundary = self.headers.get("content-type").get(0)? .split(";") .map(|o| o.trim()) .find(|o| o.starts_with("boundary="))