Skip to content

Commit

Permalink
Impl BufRead for SyncBufferedHttpRangeClient
Browse files Browse the repository at this point in the history
  • Loading branch information
pka committed Sep 3, 2023
1 parent 933d9da commit 5f04ce8
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions src/buffered_range_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ pub(crate) mod sync {
use crate::range_client::SyncHttpRangeClient;
use crate::HttpError;
use bytes::Buf;
use std::io::{Read, Seek, SeekFrom};
use std::io::{BufRead, Read, Seek, SeekFrom};

/// HTTP client adapter for HTTP Range requests with a buffer optimized for sequential reading
pub struct SyncBufferedHttpRangeClient<T: SyncHttpRangeClient> {
Expand Down Expand Up @@ -244,6 +244,25 @@ pub(crate) mod sync {
}
}

impl<T: SyncHttpRangeClient> BufRead for SyncBufferedHttpRangeClient<T> {
fn fill_buf(&mut self) -> std::io::Result<&[u8]> {
if self.buffer.offset >= self.buffer.tail() || self.buffer.offset < self.buffer.head {
let res = self.get_range(self.buffer.offset, self.buffer.min_req_size);
if let Some(HttpError::HttpStatus(416)) = res.as_ref().err() {
// An empty buffer indicates that the stream has reached EOF
return Ok(&[]);
}
res.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
self.buffer.offset = self.buffer.head;
}
Ok(&self.buffer.buf[..])
}

fn consume(&mut self, amt: usize) {
self.buffer.offset += amt;
}
}

impl<T: SyncHttpRangeClient> Seek for SyncBufferedHttpRangeClient<T> {
fn seek(&mut self, pos: SeekFrom) -> std::result::Result<u64, std::io::Error> {
match pos {
Expand Down Expand Up @@ -372,7 +391,7 @@ mod test_sync {
use crate::Result;
#[cfg(all(feature = "ureq-sync", not(feature = "reqwest-sync")))]
use crate::UreqHttpReader as HttpReader;
use std::io::{Read, Seek, SeekFrom};
use std::io::{BufRead, Read, Seek, SeekFrom};

fn init_logger() {
let _ = env_logger::builder().is_test(true).try_init();
Expand Down Expand Up @@ -495,6 +514,19 @@ mod test_sync {
Ok(())
}

#[test]
fn bufread() -> std::io::Result<()> {
init_logger();
let mut reader = HttpReader::new("https://flatgeobuf.org/test/data/countries.fgb");
reader.set_min_req_size(5);
let mut bytes = vec![];
let num_bytes = reader.read_until(0, &mut bytes).unwrap();
assert_eq!(num_bytes, 8);
assert_eq!(bytes, [b'f', b'g', b'b', 3, b'f', b'g', b'b', 0]);

Ok(())
}

#[test]
fn remote_png() -> std::io::Result<()> {
init_logger();
Expand Down

0 comments on commit 5f04ce8

Please sign in to comment.