From 6e6bab7e5598334496bb4722d3e4c52f7695b5a9 Mon Sep 17 00:00:00 2001 From: AB Date: Fri, 5 Jun 2020 02:28:12 +0300 Subject: [PATCH] Read feature in progress. --- src/filesystem.rs | 31 ++++++++++++++++--------------- src/http.rs | 22 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/filesystem.rs b/src/filesystem.rs index 0f0d740..a8a7470 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -881,25 +881,26 @@ impl MemFS { } counter += 1; }; - drop(full_path_mutex); - let inodes = self.inodes.lock().await; - - let inode = inodes.get(op.ino()).ok_or_else(no_entry)?; - let inode = inode.lock().await; - - - let content = match inode.kind { - INodeKind::RegularFile(ref content) => content, - _ => return Err(io::Error::from_raw_os_error(libc::EINVAL)), - }; - + // let inodes = self.inodes.lock().await; + // + // let inode = inodes.get(op.ino()).ok_or_else(no_entry)?; + // let inode = inode.lock().await; + // + // + // let content = match inode.kind { + // INodeKind::RegularFile(ref content) => content, + // _ => return Err(io::Error::from_raw_os_error(libc::EINVAL)), + // }; + // let offset = op.offset() as usize; let size = op.size() as usize; + drop(full_path_mutex); + let chunk = self.http.read(full_path, size, offset).await.unwrap(); - let content = content.get(offset..).unwrap_or(&[]); - let content = &content[..std::cmp::min(content.len(), size)]; + //let content = content.get(offset..).unwrap_or(&[]); + //let content = &content[..std::cmp::min(content.len(), size)]; - Ok(content.to_vec()) + Ok(chunk.to_vec()) } async fn do_write( diff --git a/src/http.rs b/src/http.rs index 1563246..8b2a90e 100644 --- a/src/http.rs +++ b/src/http.rs @@ -55,14 +55,13 @@ impl HTTP { let client = reqwest::Client::builder() .user_agent(APP_USER_AGENT) .default_headers(headers) - // .gzip(true) .build().unwrap(); Self { client, server } } - pub async fn list(&self, path: PathBuf, ) -> Result, Error> { + pub async fn list(&self, path: PathBuf) -> Result, Error> { debug!("Fetching path '{}/{}'", self.server, path.display()); let mut client = &self.client; let resp = client @@ -74,5 +73,24 @@ impl HTTP { info!("Found {} entries into '{}'", resp.len(), path.display()); Ok(resp) } + + pub async fn read(&self, path: PathBuf, size: usize, offset: usize) -> Result, Error> { + debug!("Reading path '{}/{}'", self.server, path.display()); + let mut headers = header::HeaderMap::new(); + let range = format!("bytes={}-{}", offset, {offset+size}); + headers.insert(header::RANGE, header::HeaderValue::from_str(range.as_str()).unwrap()); + + + let mut client = &self.client; + let resp = client + .get(format!("{}/{}", self.server, path.display()).as_str()) + .headers(headers) + .send() + .await? + .bytes() + .await?; + info!("Found {} entries into '{}'", resp.len(), path.display()); + Ok(resp.to_vec()) + } }