From b677eb7ccc410558a127976f571eb1fedf50c8f3 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 26 Dec 2019 12:56:00 +0100 Subject: WIP --- headers/src/header_components/disposition.rs | 6 ++++++ parser/src/parser.rs | 30 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/headers/src/header_components/disposition.rs b/headers/src/header_components/disposition.rs index 17882bd..c655cd2 100644 --- a/headers/src/header_components/disposition.rs +++ b/headers/src/header_components/disposition.rs @@ -28,6 +28,12 @@ pub struct Disposition { file_meta: DispositionParameters } +impl Disposition { + pub fn new(kind: DispositionKind, file_meta: DispositionParameters) -> Self { + Disposition { kind, file_meta } + } +} + #[derive(Debug, Clone, Eq, PartialEq, Hash, Default)] #[cfg_attr(feature="serde", derive(Serialize, Deserialize))] struct DispositionParameters(FileMeta); diff --git a/parser/src/parser.rs b/parser/src/parser.rs index f7ceefa..5354a92 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -131,14 +131,11 @@ pub struct ParsedContentDisposition { /// assert_eq!(dis.params.get("name"), None); /// assert_eq!(dis.params.get("filename"), Some(&"yummy dummy".to_string())); /// ``` -pub fn parse_content_disposition(header: &str) -> Result { - let params = parse_param_content(header)?; - let disposition = parse_disposition_type(¶ms.value); +pub fn parse_content_disposition(header: &str) -> Result { + let file_params = parse_param_content(header)?; + let kind = parse_disposition_type(&file_params.value); - Ok(ParsedContentDisposition { - disposition, - params: params.params, - }) + Ok(Disposition::new(kind, params)) } /// Struct that holds the structured representation of the message. Note that @@ -362,8 +359,9 @@ struct ParamContent { /// which implicitly does not support multiple parameters with /// the same key. The format for parameterized header values /// doesn't appear to be strongly specified anywhere. -fn parse_param_content(content: &str) -> Result { - let mut tokens = content.split(';'); +fn parse_param_content(content: &str) -> Result { + let mut file_meta = FileMeta::default(); + let mut tokens = content.split(';'); // There must be at least one token produced by split, even if it's empty. let value = tokens @@ -373,14 +371,24 @@ fn parse_param_content(content: &str) -> Result { let map = tokens .filter_map(|kv| { - kv.find('=').map(|idx| { + let mapping = kv.find('=').map(|idx| { let key = kv[0..idx].trim().to_lowercase(); let mut value = kv[idx + 1..].trim(); if value.starts_with('"') && value.ends_with('"') && value.len() > 1 { value = &value[1..value.len() - 1]; } (key, value.to_string()) - }) + }); + + if let Some((key, value)) = mapping { + match key { + "creation_date" => file_meta.creation_date = Some({ + value + }), + } + } else { + None + } }) .collect(); -- cgit v1.2.3