summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-12-26 12:56:00 +0100
committerMatthias Beyer <mail@beyermatthias.de>2019-12-26 12:56:00 +0100
commitb677eb7ccc410558a127976f571eb1fedf50c8f3 (patch)
treea0de19cf62fa5a14e2192afa5aebdd2d8ea61d8c
parent5f592f5a55232e3f5667fa6cdd62d9ec8e91a1ca (diff)
-rw-r--r--headers/src/header_components/disposition.rs6
-rw-r--r--parser/src/parser.rs30
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<ParsedContentDisposition> {
- let params = parse_param_content(header)?;
- let disposition = parse_disposition_type(&params.value);
+pub fn parse_content_disposition(header: &str) -> Result<Disposition> {
+ 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<ParamContent> {
- let mut tokens = content.split(';');
+fn parse_param_content(content: &str) -> Result<DispositionParameters> {
+ 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<ParamContent> {
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();