Skip to content

Commit

Permalink
Merge pull request #107 from uklotzde/parse_lazy_url
Browse files Browse the repository at this point in the history
Parse homepage URLs of entries lazily
  • Loading branch information
flosse committed Oct 23, 2018
2 parents 6065e34 + d9446fa commit a70b12f
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 11 deletions.
7 changes: 4 additions & 3 deletions src/core/usecases/create_new_entry.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use chrono::*;
use core::prelude::*;
use core::util::parse::parse_url_param;
use core::util::validate::Validate;
use uuid::Uuid;

Expand Down Expand Up @@ -44,12 +45,12 @@ pub fn create_new_entry<D: Db>(db: &mut D, e: NewEntry) -> Result<String> {
country : e.country,
email : e.email,
telephone : e.telephone,
homepage : e.homepage,
homepage : e.homepage.map(|ref url| parse_url_param(url)).transpose()?,
categories : e.categories,
tags,
license : Some(e.license),
image_url : e.image_url,
image_link_url: e.image_link_url,
image_url : e.image_url.map(|ref url| parse_url_param(url)).transpose()?,
image_link_url: e.image_link_url.map(|ref url| parse_url_param(url)).transpose()?,
};
debug!("Creating new entry: {:?}", new_entry);
new_entry.validate()?;
Expand Down
15 changes: 8 additions & 7 deletions src/core/usecases/update_entry.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use chrono::*;
use core::prelude::*;
use core::util::parse::parse_url_param;

#[cfg_attr(rustfmt, rustfmt_skip)]
#[derive(Serialize, Deserialize, Debug, Clone)]
Expand Down Expand Up @@ -47,12 +48,12 @@ pub fn update_entry<D: Db>(db: &mut D, e: UpdateEntry) -> Result<()> {
country : e.country,
email : e.email,
telephone : e.telephone,
homepage : e.homepage,
homepage : e.homepage.map(|ref url| parse_url_param(url)).transpose()?,
categories : e.categories,
tags,
license : old.license, // license is immutable
image_url : e.image_url,
image_link_url: e.image_link_url,
image_url : e.image_url.map(|ref url| parse_url_param(url)).transpose()?,
image_link_url: e.image_link_url.map(|ref url| parse_url_param(url)).transpose()?,
};
debug!("Updating existing entry: {:?}", updated_entry);
for t in &updated_entry.tags {
Expand All @@ -77,8 +78,8 @@ mod tests {
.version(1)
.title("foo")
.description("bar")
.image_url(Some("img"))
.image_link_url(Some("img link"))
.image_url(Some("http://img"))
.image_link_url(Some("http://imglink"))
.finish();

#[cfg_attr(rustfmt, rustfmt_skip)]
Expand Down Expand Up @@ -113,8 +114,8 @@ mod tests {
assert_eq!(2, x.version);
assert!(x.created as i64 >= now.timestamp());
assert!(Uuid::parse_str(&x.id).is_ok());
assert_eq!("img2", x.image_url.as_ref().unwrap());
assert_eq!("img link", x.image_link_url.as_ref().unwrap());
assert_eq!("https://www.img2/", x.image_url.as_ref().unwrap());
assert_eq!("http://imglink/", x.image_link_url.as_ref().unwrap());
}

#[test]
Expand Down
1 change: 1 addition & 0 deletions src/core/util/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
pub mod filter;
pub mod geo;
pub mod parse;
pub mod sort;
pub mod validate;
50 changes: 50 additions & 0 deletions src/core/util/parse.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
use core::error::ParameterError;
use url::{ParseError, Url};

/// Completes incomplete URLs before parsing
pub fn parse_lazy_url(url: &str) -> Result<Url, ParseError> {
let url = url.trim();
if url.is_empty() || url.contains("://") {
Url::parse(url)
} else {
// Add the missing protocol by assuming https
if url.starts_with("www.") {
Url::parse(&format!("https://{}", url))
} else {
Url::parse(&format!("https://www.{}", url))
}
}
}

pub fn parse_url_param(url: &str) -> Result<String, ParameterError> {
parse_lazy_url(url)
.map(|url| url.into_string())
.map_err(|_| ParameterError::Url)
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn parse_url_param() {
assert!(super::parse_url_param("").is_err());
assert!(super::parse_url_param("\t \n").is_err());
assert_eq!(
super::parse_url_param("example.com/index.html").unwrap(),
"https://www.example.com/index.html"
);
assert_eq!(
super::parse_url_param("www.example.com").unwrap(),
"https://www.example.com/"
);
assert_eq!(
super::parse_url_param("http://www.example.com/index.html").unwrap(),
"http://www.example.com/index.html"
);
assert_eq!(
super::parse_url_param("https://example.com").unwrap(),
"https://example.com/"
);
}
}
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) 2015 - 2018 Markus Kohlhase <mail@markus-kohlhase.de>

#![feature(plugin, custom_derive, test)]
#![feature(plugin, custom_derive, test, transpose_result)]
#![plugin(rocket_codegen)]
#![recursion_limit = "256"]

Expand Down

0 comments on commit a70b12f

Please sign in to comment.