google_cloud_storage/http/objects/
download.rs

1use reqwest_middleware::{ClientWithMiddleware as Client, RequestBuilder};
2
3use crate::http::objects::get::GetObjectRequest;
4use crate::http::Escape;
5
6#[derive(Default)]
7pub struct Range(pub Option<u64>, pub Option<u64>);
8
9impl Range {
10    /// Range: bytes=0-1999 (first 2000 bytes)
11    /// Range: bytes=-2000 (last 2000 bytes)
12    /// Range: bytes=2000- (from byte 2000 to end of file)
13    fn with_header(&self, builder: RequestBuilder) -> RequestBuilder {
14        if let Some(from) = self.0 {
15            if let Some(to) = self.1 {
16                builder.header("Range", format!("bytes={from}-{to}"))
17            } else {
18                builder.header("Range", format!("bytes={from}-"))
19            }
20        } else if let Some(reverse_from) = self.1 {
21            builder.header("Range", format!("bytes=-{reverse_from}"))
22        } else {
23            builder
24        }
25    }
26}
27
28pub(crate) fn build(base_url: &str, client: &Client, req: &GetObjectRequest, range: &Range) -> RequestBuilder {
29    let url = format!("{}/b/{}/o/{}?alt=media", base_url, req.bucket.escape(), req.object.escape());
30    let builder = range.with_header(client.get(url).query(&req));
31    if let Some(e) = &req.encryption {
32        e.with_headers(builder)
33    } else {
34        builder
35    }
36}