@@ -8,7 +8,7 @@ use std::time::SystemTime;
88
99use futures_util:: StreamExt ;
1010use objectstore_types:: metadata:: Metadata ;
11- use objectstore_types:: range:: { ByteRange , ContentRange } ;
11+ use objectstore_types:: range:: ByteRange ;
1212use tokio:: fs:: OpenOptions ;
1313use tokio:: io:: { AsyncBufReadExt , AsyncReadExt , AsyncSeekExt , AsyncWriteExt , BufReader , BufWriter } ;
1414use tokio_util:: io:: { ReaderStream , StreamReader } ;
@@ -147,28 +147,20 @@ impl Backend for LocalFsBackend {
147147 . ok_or_else ( || Error :: generic ( "local-fs file corrupted: shorter than header" ) ) ?;
148148 metadata. size = Some ( payload_size as usize ) ;
149149
150- let content_range = match range {
151- Some ( byte_range) => match byte_range . resolve ( payload_size ) {
152- Some ( content_range) => content_range ,
153- None => {
154- return Err ( Error :: RangeNotSatisfiable {
150+ let ( content_range, stream ) = match range {
151+ Some ( byte_range) => {
152+ let content_range = byte_range
153+ . resolve ( payload_size )
154+ . ok_or ( Error :: RangeNotSatisfiable {
155155 total : payload_size,
156- } ) ;
157- }
158- } ,
159- None => ContentRange :: full ( payload_size) ,
160- } ;
161-
162- let stream = if content_range. is_full ( ) {
163- let stream = ReaderStream :: new ( reader) ;
164- stream. boxed ( )
165- } else {
166- reader
167- . seek ( std:: io:: SeekFrom :: Current ( content_range. start as i64 ) )
168- . await ?;
169- let limited = reader. take ( content_range. len ( ) ) ;
170- let stream = ReaderStream :: new ( limited) ;
171- stream. boxed ( )
156+ } ) ?;
157+ reader
158+ . seek ( std:: io:: SeekFrom :: Current ( content_range. start as i64 ) )
159+ . await ?;
160+ let limited = reader. take ( content_range. len ( ) ) ;
161+ ( Some ( content_range) , ReaderStream :: new ( limited) . boxed ( ) )
162+ }
163+ None => ( None , ReaderStream :: new ( reader) . boxed ( ) ) ,
172164 } ;
173165 Ok ( Some ( ( metadata, content_range, stream) ) )
174166 }
@@ -777,6 +769,7 @@ mod tests {
777769 let data: BytesMut = body. try_collect ( ) . await . unwrap ( ) ;
778770
779771 assert_eq ! ( data. as_ref( ) , b"range" ) ;
772+ let content_range = content_range. unwrap ( ) ;
780773 assert_eq ! ( content_range. start, 7 ) ;
781774 assert_eq ! ( content_range. end, 11 ) ;
782775 assert_eq ! ( content_range. total, payload. len( ) as u64 ) ;
@@ -803,6 +796,7 @@ mod tests {
803796 let data: BytesMut = body. try_collect ( ) . await . unwrap ( ) ;
804797
805798 assert_eq ! ( data. as_ref( ) , b"range requests!" ) ;
799+ let content_range = content_range. unwrap ( ) ;
806800 assert_eq ! ( content_range. start, 7 ) ;
807801 assert_eq ! ( content_range. end, 21 ) ;
808802 assert_eq ! ( content_range. total, payload. len( ) as u64 ) ;
@@ -829,6 +823,7 @@ mod tests {
829823 let data: BytesMut = body. try_collect ( ) . await . unwrap ( ) ;
830824
831825 assert_eq ! ( data. as_ref( ) , b"requests!" ) ;
826+ let content_range = content_range. unwrap ( ) ;
832827 assert_eq ! ( content_range. start, 13 ) ;
833828 assert_eq ! ( content_range. end, 21 ) ;
834829 assert_eq ! ( content_range. total, payload. len( ) as u64 ) ;
0 commit comments