From feb74a5e8635c1fc1b85c5581ae848745789349b Mon Sep 17 00:00:00 2001
From: BlackDex <black.dex@gmail.com>
Date: Tue, 29 Jan 2019 18:08:23 +0100
Subject: [PATCH] Changed the way to fix the href

 - Using url from reqwest to fix href, this fixes:
   + "//domain.com/icon.png"
   + "relative/path/to/icon.png"
   + "/absolute/path/to/icon.png"
 - Removed fix_href function
 - Some variable changes
---
 src/api/icons.rs | 43 +++++--------------------------------------
 1 file changed, 5 insertions(+), 38 deletions(-)

diff --git a/src/api/icons.rs b/src/api/icons.rs
index 61767bc3..23a30750 100644
--- a/src/api/icons.rs
+++ b/src/api/icons.rs
@@ -164,10 +164,10 @@ fn get_icon_url(domain: &str) -> Result<String, Error> {
     let resp = client.get(&ssldomain).send().or_else(|_| client.get(&httpdomain).send());
     if let Ok(content) = resp {
         // Extract the URL from the respose in case redirects occured (like @ gitlab.com)
-        let url = content.url().origin().ascii_serialization();
+        let url = content.url().clone();
 
         // Add the default favicon.ico to the list with the domain the content responded from.
-        iconlist.push(IconList { priority: 35, href: format!("{}/favicon.ico", url) });
+        iconlist.push(IconList { priority: 35, href: url.join("/favicon.ico").unwrap().into_string() });
 
         let soup = Soup::from_reader(content)?;
         // Search for and filter
@@ -179,9 +179,9 @@ fn get_icon_url(domain: &str) -> Result<String, Error> {
 
         // Loop through all the found icons and determine it's priority
         for favicon in favicons {
-            let favicon_sizes = favicon.get("sizes").unwrap_or_default();
-            let href = fix_href(&favicon.get("href").unwrap_or_default(), &url);
-            let priority = get_icon_priority(&href, &favicon_sizes);
+            let sizes = favicon.get("sizes").unwrap_or_default();
+            let href = url.join(&favicon.get("href").unwrap_or_default()).unwrap().into_string();
+            let priority = get_icon_priority(&href, &sizes);
 
             iconlist.push(IconList { priority, href })
         }
@@ -245,39 +245,6 @@ fn get_icon_priority(href: &str, sizes: &str) -> u8 {
     }
 }
 
-/// Returns a String which will have the given href fixed by adding the correct URL if it does not have this already.
-///
-/// # Arguments
-/// * `href` - A string which holds the href value or relative path.
-/// * `url`  - A string which holds the URL including http(s) which will preseed the href when needed.
-///
-/// # Example
-/// ```
-/// fixed_href1 = fix_href("/path/to/a/favicon.png", "https://eample.com");
-/// fixed_href2 = fix_href("//example.com/path/to/a/second/favicon.jpg", "https://eample.com");
-/// ```
-fn fix_href(href: &str, url: &str) -> String {
-    // When the href is starting with //, so without a scheme is valid and would use the browsers scheme.
-    // We need to detect this and add the scheme here.
-    if href.starts_with("//") {
-        if url.starts_with("https") {
-            format!("https:{}", href)
-        } else {
-            format!("http:{}", href)
-        }
-    // If the href_output just starts with a single / it does not have the host here at all.
-    } else if !href.starts_with("http") {
-        if href.starts_with('/') {
-            format!("{}{}", url, href)
-        } else {
-            format!("{}/{}", url, href)
-        }
-    // All seems oke, just return the given href
-    } else {
-        href.to_string()
-    }
-}
-
 fn download_icon(domain: &str) -> Result<Vec<u8>, Error> {
     let url = get_icon_url(&domain)?;