diff --git a/bin/oay/src/services/webdav/webdav_file.rs b/bin/oay/src/services/webdav/webdav_file.rs index 80be6f5a4386..5a10813ea0ce 100644 --- a/bin/oay/src/services/webdav/webdav_file.rs +++ b/bin/oay/src/services/webdav/webdav_file.rs @@ -17,6 +17,7 @@ use std::io::SeekFrom; +use bytes::Bytes; use dav_server::davpath::DavPath; use dav_server::fs::DavFile; use dav_server::fs::DavMetaData; @@ -35,7 +36,7 @@ pub struct WebdavFile { } impl DavFile for WebdavFile { - fn read_bytes(&mut self, count: usize) -> FsFuture { + fn read_bytes(&mut self, count: usize) -> FsFuture { async move { let file_path = self.path.as_url_string(); let content = self @@ -44,7 +45,7 @@ impl DavFile for WebdavFile { .await .unwrap(); //error handle ? - Ok(bytes::Bytes::from(content)) + Ok(Bytes::from(content)) } .boxed() } @@ -61,19 +62,33 @@ impl DavFile for WebdavFile { .boxed() } - fn write_buf(&mut self, _buf: Box) -> FsFuture<()> { - todo!() + fn write_buf(&mut self, buf: Box) -> FsFuture<()> { + self.write_bytes(Bytes::copy_from_slice(buf.chunk())) } - fn write_bytes(&mut self, _buf: bytes::Bytes) -> FsFuture<()> { - todo!() + fn write_bytes(&mut self, buf: Bytes) -> FsFuture<()> { + async move { + let file_path = self.path.as_url_string(); + self.op.write(&file_path, buf).await.map_err(convert_error) + } + .boxed() } fn seek(&mut self, _pos: SeekFrom) -> FsFuture { - todo!() + futures_util::future::err(dav_server::fs::FsError::NotImplemented).boxed() } fn flush(&mut self) -> FsFuture<()> { - todo!() + futures_util::future::ok(()).boxed() + } +} + +fn convert_error(opendal_error: opendal::Error) -> dav_server::fs::FsError { + match opendal_error.kind() { + opendal::ErrorKind::AlreadyExists | opendal::ErrorKind::IsSameFile => { + dav_server::fs::FsError::Exists + } + opendal::ErrorKind::NotFound => dav_server::fs::FsError::NotFound, + _ => dav_server::fs::FsError::GeneralFailure, } }