1- use super :: puller:: ReqwestPuller ;
1+ use std:: future:: Future ;
2+
3+ use crate :: UrlInfo ;
24use content_disposition;
3- use fast_pull:: UrlInfo ;
45use reqwest:: {
56 Client , IntoUrl , StatusCode , Url ,
67 header:: { self , HeaderMap } ,
78} ;
89use sanitize_filename;
910
11+ pub trait Prefetch {
12+ fn prefetch (
13+ & self ,
14+ url : impl IntoUrl + Send ,
15+ ) -> impl Future < Output = Result < UrlInfo , reqwest:: Error > > + Send ;
16+ }
17+
18+ impl Prefetch for Client {
19+ async fn prefetch ( & self , url : impl IntoUrl + Send ) -> Result < UrlInfo , reqwest:: Error > {
20+ prefetch ( self , url) . await
21+ }
22+ }
23+
1024fn get_file_size ( headers : & HeaderMap , status : & StatusCode ) -> u64 {
1125 if * status == StatusCode :: PARTIAL_CONTENT {
1226 headers
@@ -36,12 +50,13 @@ fn get_filename(headers: &HeaderMap, final_url: &Url) -> String {
3650 . get ( header:: CONTENT_DISPOSITION )
3751 . and_then ( |hv| hv. to_str ( ) . ok ( ) )
3852 . and_then ( |s| content_disposition:: parse_content_disposition ( s) . filename_full ( ) )
53+ . map ( |s| urlencoding:: decode ( & s) . map ( String :: from) . unwrap_or ( s) )
3954 . filter ( |s| !s. trim ( ) . is_empty ( ) ) ;
4055
4156 let from_url = final_url
4257 . path_segments ( )
4358 . and_then ( |mut segments| segments. next_back ( ) )
44- . and_then ( |s| urlencoding:: decode ( s) . ok ( ) )
59+ . map ( |s| urlencoding:: decode ( s) . unwrap_or ( s . into ( ) ) )
4560 . filter ( |s| !s. trim ( ) . is_empty ( ) )
4661 . map ( |s| s. to_string ( ) ) ;
4762
@@ -52,14 +67,14 @@ fn get_filename(headers: &HeaderMap, final_url: &Url) -> String {
5267 sanitize_filename:: sanitize_with_options (
5368 & raw_name,
5469 sanitize_filename:: Options {
55- windows : true ,
56- truncate : true ,
70+ windows : false ,
71+ truncate : false ,
5772 replacement : "_" ,
5873 } ,
5974 )
6075}
6176
62- async fn prefetch ( client : & Client , url : impl IntoUrl + Send ) -> Result < UrlInfo , reqwest:: Error > {
77+ async fn prefetch ( client : & Client , url : impl IntoUrl ) -> Result < UrlInfo , reqwest:: Error > {
6378 let url = url. into_url ( ) ?;
6479 let resp = match client. head ( url. clone ( ) ) . send ( ) . await {
6580 Ok ( resp) => resp,
@@ -69,23 +84,19 @@ async fn prefetch(client: &Client, url: impl IntoUrl + Send) -> Result<UrlInfo,
6984 Ok ( resp) => resp,
7085 Err ( _) => return prefetch_fallback ( url, client) . await ,
7186 } ;
72-
73- let status = resp. status ( ) ;
74- let final_url = resp. url ( ) ;
75-
76- let resp_headers = resp. headers ( ) ;
77- let size = get_file_size ( resp_headers, & status) ;
78-
7987 let supports_range = match resp. headers ( ) . get ( header:: ACCEPT_RANGES ) {
8088 Some ( accept_ranges) => accept_ranges
8189 . to_str ( )
8290 . ok ( )
8391 . map ( |v| v. split ( ' ' ) )
8492 . and_then ( |supports| supports. into_iter ( ) . find ( |& ty| ty == "bytes" ) )
8593 . is_some ( ) ,
86- None => return prefetch_fallback ( url, self ) . await ,
94+ None => return prefetch_fallback ( url, client ) . await ,
8795 } ;
88-
96+ let status = resp. status ( ) ;
97+ let resp_headers = resp. headers ( ) ;
98+ let size = get_file_size ( resp_headers, & status) ;
99+ let final_url = resp. url ( ) ;
89100 Ok ( UrlInfo {
90101 final_url : final_url. clone ( ) ,
91102 name : get_filename ( resp_headers, final_url) ,
@@ -105,11 +116,10 @@ async fn prefetch_fallback(url: Url, client: &Client) -> Result<UrlInfo, reqwest
105116 . await ?
106117 . error_for_status ( ) ?;
107118 let status = resp. status ( ) ;
108- let final_url = resp. url ( ) ;
109-
110119 let resp_headers = resp. headers ( ) ;
111120 let size = get_file_size ( resp_headers, & status) ;
112121 let supports_range = status == StatusCode :: PARTIAL_CONTENT ;
122+ let final_url = resp. url ( ) ;
113123 Ok ( UrlInfo {
114124 final_url : final_url. clone ( ) ,
115125 name : get_filename ( resp_headers, final_url) ,
@@ -123,8 +133,6 @@ async fn prefetch_fallback(url: Url, client: &Client) -> Result<UrlInfo, reqwest
123133
124134#[ cfg( test) ]
125135mod tests {
126- use alloc:: { format, vec} ;
127-
128136 use super :: * ;
129137
130138 #[ tokio:: test]
0 commit comments