@ -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( ) . as cii_seria lizati on( ) ;
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 ) ? ;