google_cloud_storage/http/objects/
download.rs1use 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 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}