Skip to content

Commit

Permalink
Allow doing start-end RANGE requests against blobs
Browse files Browse the repository at this point in the history
Signed-off-by: Jonathon Belotti <jonathon@modal.com>
  • Loading branch information
thundergolfer committed Sep 10, 2024
1 parent 8be4688 commit 0fc29b2
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1051,7 +1051,7 @@ impl Client {
layer: impl AsLayerDescriptor,
mut out: T,
) -> Result<()> {
let response = self.pull_blob_response(image, &layer, None).await?;
let response = self.pull_blob_response(image, &layer, None, None).await?;

let mut maybe_header_digester = digest_header_value(response.headers().clone())?
.map(|digest| Digester::new(&digest).map(|d| (d, digest)))
Expand Down Expand Up @@ -1130,7 +1130,10 @@ impl Client {
image: &Reference,
layer: impl AsLayerDescriptor,
) -> Result<SizedStream> {
stream_from_response(self.pull_blob_response(image, &layer, None).await?, layer)
stream_from_response(
self.pull_blob_response(image, &layer, None, None).await?,
layer,
)
}

/// Stream a single layer from an OCI registry starting with a byte offset.
Expand All @@ -1143,7 +1146,7 @@ impl Client {
layer: impl AsLayerDescriptor,
offset: u64,
) -> Result<BlobResponse> {
let response = self.pull_blob_response(image, &layer, Some(offset)).await?;
let response = self.pull_blob_response(image, &layer, Some(offset), None).await?;

let status = response.status();
match status {
Expand All @@ -1165,6 +1168,7 @@ impl Client {
image: &Reference,
layer: impl AsLayerDescriptor,
offset: Option<u64>,
length: Option<u64>,
) -> Result<Response> {
let layer = layer.as_layer_descriptor();
let url = self.to_v2_blob_url(image, layer.digest);
Expand All @@ -1174,7 +1178,13 @@ impl Client {
.apply_auth(image, RegistryOperation::Pull)
.await?
.into_request_builder();
if let Some(offset) = offset {
if let (Some(off), Some(len)) = (offset, length) {
let end = off + len;
request = request.header(
RANGE,
HeaderValue::from_str(&format!("bytes={off}-{end}")).unwrap(),
);
} else if let Some(offset) = offset {
request = request.header(
RANGE,
HeaderValue::from_str(&format!("bytes={offset}-")).unwrap(),
Expand Down

0 comments on commit 0fc29b2

Please sign in to comment.