diff --git a/dev-tools/omdb/src/bin/omdb/nexus.rs b/dev-tools/omdb/src/bin/omdb/nexus.rs index 3415227632e..209d68632f9 100644 --- a/dev-tools/omdb/src/bin/omdb/nexus.rs +++ b/dev-tools/omdb/src/bin/omdb/nexus.rs @@ -3934,7 +3934,7 @@ async fn cmd_nexus_support_bundles_download( args: &SupportBundleDownloadArgs, ) -> Result<(), anyhow::Error> { let total_length = client - .support_bundle_head(args.id.as_untyped_uuid()) + .support_bundle_head(args.id.as_untyped_uuid(), None) .await? .content_length() .ok_or_else(|| anyhow::anyhow!("No content length"))?; @@ -3972,7 +3972,7 @@ async fn cmd_nexus_support_bundles_get_index( args: &SupportBundleIndexArgs, ) -> Result<(), anyhow::Error> { let stream = client - .support_bundle_index(args.id.as_untyped_uuid()) + .support_bundle_index(args.id.as_untyped_uuid(), None) .await .with_context(|| { format!("downloading support bundle index {}", args.id) @@ -3995,6 +3995,7 @@ async fn cmd_nexus_support_bundles_get_file( .support_bundle_download_file( args.id.as_untyped_uuid(), args.path.as_str(), + None, ) .await .with_context(|| { diff --git a/dev-tools/omdb/src/bin/omdb/support_bundle.rs b/dev-tools/omdb/src/bin/omdb/support_bundle.rs index 70d0725f7b1..05c0e467d62 100644 --- a/dev-tools/omdb/src/bin/omdb/support_bundle.rs +++ b/dev-tools/omdb/src/bin/omdb/support_bundle.rs @@ -52,13 +52,13 @@ impl<'a> StreamedFile<'a> { // // This means that we would potentially want to restart the stream with a different position. async fn start_stream(&mut self) -> anyhow::Result<()> { - // TODO: Add range headers, for range requests? Though this - // will require adding support to Progenitor + Nexus too. + // TODO: Add range headers, for range requests? let stream = self .client .support_bundle_download_file( self.id.as_untyped_uuid(), self.path.as_str(), + None, ) .await .with_context(|| { @@ -142,7 +142,7 @@ impl<'c> SupportBundleAccessor for InternalApiAccess<'c> { async fn get_index(&self) -> anyhow::Result { let stream = self .client - .support_bundle_index(self.id.as_untyped_uuid()) + .support_bundle_index(self.id.as_untyped_uuid(), None) .await .with_context(|| { format!("downloading support bundle index {}", self.id) diff --git a/nexus/external-api/src/lib.rs b/nexus/external-api/src/lib.rs index 03967ac13b7..7f2691e3e41 100644 --- a/nexus/external-api/src/lib.rs +++ b/nexus/external-api/src/lib.rs @@ -3157,6 +3157,7 @@ pub trait NexusExternalApi { }] async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -3180,6 +3181,7 @@ pub trait NexusExternalApi { }] async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -3191,6 +3193,7 @@ pub trait NexusExternalApi { }] async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -3202,6 +3205,7 @@ pub trait NexusExternalApi { }] async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; diff --git a/nexus/internal-api/src/lib.rs b/nexus/internal-api/src/lib.rs index 1c247a70cd4..a6e3fe49fd6 100644 --- a/nexus/internal-api/src/lib.rs +++ b/nexus/internal-api/src/lib.rs @@ -570,6 +570,7 @@ pub trait NexusInternalApi { }] async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -591,6 +592,7 @@ pub trait NexusInternalApi { }] async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -601,6 +603,7 @@ pub trait NexusInternalApi { }] async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -611,6 +614,7 @@ pub trait NexusInternalApi { }] async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; diff --git a/nexus/src/app/support_bundles.rs b/nexus/src/app/support_bundles.rs index 4673f6a55ac..1451fd9cb25 100644 --- a/nexus/src/app/support_bundles.rs +++ b/nexus/src/app/support_bundles.rs @@ -123,6 +123,7 @@ impl super::Nexus { &ZpoolUuid::from(bundle.zpool_id), &DatasetUuid::from(bundle.dataset_id), &SupportBundleUuid::from(bundle.id), + range, ) .await } @@ -142,6 +143,7 @@ impl super::Nexus { &ZpoolUuid::from(bundle.zpool_id), &DatasetUuid::from(bundle.dataset_id), &SupportBundleUuid::from(bundle.id), + range, ) .await } @@ -151,6 +153,7 @@ impl super::Nexus { &ZpoolUuid::from(bundle.zpool_id), &DatasetUuid::from(bundle.dataset_id), &SupportBundleUuid::from(bundle.id), + range, ) .await } @@ -161,6 +164,7 @@ impl super::Nexus { &DatasetUuid::from(bundle.dataset_id), &SupportBundleUuid::from(bundle.id), &file_path, + range, ) .await } @@ -171,6 +175,7 @@ impl super::Nexus { &DatasetUuid::from(bundle.dataset_id), &SupportBundleUuid::from(bundle.id), &file_path, + range, ) .await } diff --git a/nexus/src/external_api/http_entrypoints.rs b/nexus/src/external_api/http_entrypoints.rs index 777b00f78c2..bf1b7996f5c 100644 --- a/nexus/src/external_api/http_entrypoints.rs +++ b/nexus/src/external_api/http_entrypoints.rs @@ -111,7 +111,6 @@ use propolis_client::support::tungstenite::protocol::{ CloseFrame, Role as WebSocketRole, }; use range_requests::PotentialRange; -use range_requests::RequestContextEx; use ref_cast::RefCast; type NexusApiDescription = ApiDescription; @@ -7078,6 +7077,7 @@ impl NexusExternalApi for NexusExternalApiImpl { async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -7088,7 +7088,10 @@ impl NexusExternalApi for NexusExternalApiImpl { crate::context::op_context_for_external_api(&rqctx).await?; let head = false; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -7146,6 +7149,7 @@ impl NexusExternalApi for NexusExternalApiImpl { async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -7155,7 +7159,10 @@ impl NexusExternalApi for NexusExternalApiImpl { let opctx = crate::context::op_context_for_external_api(&rqctx).await?; let head = false; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -7177,6 +7184,7 @@ impl NexusExternalApi for NexusExternalApiImpl { async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -7186,7 +7194,10 @@ impl NexusExternalApi for NexusExternalApiImpl { let opctx = crate::context::op_context_for_external_api(&rqctx).await?; let head = true; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -7208,6 +7219,7 @@ impl NexusExternalApi for NexusExternalApiImpl { async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -7217,7 +7229,10 @@ impl NexusExternalApi for NexusExternalApiImpl { let opctx = crate::context::op_context_for_external_api(&rqctx).await?; let head = true; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( diff --git a/nexus/src/internal_api/http_entrypoints.rs b/nexus/src/internal_api/http_entrypoints.rs index 100d6c6e145..7a6dd79673c 100644 --- a/nexus/src/internal_api/http_entrypoints.rs +++ b/nexus/src/internal_api/http_entrypoints.rs @@ -66,7 +66,6 @@ use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::InstanceUuid; use omicron_uuid_kinds::SupportBundleUuid; use range_requests::PotentialRange; -use range_requests::RequestContextEx; use std::collections::BTreeMap; type NexusApiDescription = ApiDescription; @@ -997,6 +996,7 @@ impl NexusInternalApi for NexusInternalApiImpl { async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -1007,7 +1007,10 @@ impl NexusInternalApi for NexusInternalApiImpl { crate::context::op_context_for_internal_api(&rqctx).await; let head = false; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -1065,6 +1068,7 @@ impl NexusInternalApi for NexusInternalApiImpl { async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -1074,7 +1078,10 @@ impl NexusInternalApi for NexusInternalApiImpl { let opctx = crate::context::op_context_for_internal_api(&rqctx).await; let head = false; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -1096,6 +1103,7 @@ impl NexusInternalApi for NexusInternalApiImpl { async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -1105,7 +1113,10 @@ impl NexusInternalApi for NexusInternalApiImpl { let opctx = crate::context::op_context_for_internal_api(&rqctx).await; let head = true; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( @@ -1127,6 +1138,7 @@ impl NexusInternalApi for NexusInternalApiImpl { async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let apictx = rqctx.context(); @@ -1136,7 +1148,10 @@ impl NexusInternalApi for NexusInternalApiImpl { let opctx = crate::context::op_context_for_internal_api(&rqctx).await; let head = true; - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); let body = nexus .support_bundle_download( diff --git a/openapi/nexus-internal.json b/openapi/nexus-internal.json index ef774e61e70..1be773dbb98 100644 --- a/openapi/nexus-internal.json +++ b/openapi/nexus-internal.json @@ -925,6 +925,14 @@ "summary": "Download the metadata of a support bundle", "operationId": "support_bundle_head", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -953,6 +961,14 @@ "summary": "Download a file within a support bundle", "operationId": "support_bundle_download_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -988,6 +1004,14 @@ "summary": "Download the metadata of a file within the support bundle", "operationId": "support_bundle_head_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -1025,6 +1049,14 @@ "summary": "Download the index of a support bundle", "operationId": "support_bundle_index", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", diff --git a/openapi/nexus.json b/openapi/nexus.json index e30f4404488..8ad0182967a 100644 --- a/openapi/nexus.json +++ b/openapi/nexus.json @@ -500,6 +500,14 @@ "summary": "Download the metadata of a support bundle", "operationId": "support_bundle_head", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -531,6 +539,14 @@ "summary": "Download a file within a support bundle", "operationId": "support_bundle_download_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -569,6 +585,14 @@ "summary": "Download the metadata of a file within the support bundle", "operationId": "support_bundle_head_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", @@ -609,6 +633,14 @@ "summary": "Download the index of a support bundle", "operationId": "support_bundle_index", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "bundle_id", diff --git a/openapi/sled-agent.json b/openapi/sled-agent.json index 639356e192f..3f28d8b7baf 100644 --- a/openapi/sled-agent.json +++ b/openapi/sled-agent.json @@ -1174,6 +1174,14 @@ "summary": "Fetch metadata about a support bundle from a particular dataset", "operationId": "support_bundle_head", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "dataset_id", @@ -1219,6 +1227,14 @@ "summary": "Fetch a file within a support bundle from a particular dataset", "operationId": "support_bundle_download_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "dataset_id", @@ -1271,6 +1287,14 @@ "summary": "Fetch metadata about a file within a support bundle from a particular dataset", "operationId": "support_bundle_head_file", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "dataset_id", @@ -1325,6 +1349,14 @@ "summary": "Fetch the index (list of files within a support bundle)", "operationId": "support_bundle_index", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "dataset_id", @@ -1368,6 +1400,14 @@ "summary": "Fetch metadata about the list of files within a support bundle", "operationId": "support_bundle_head_index", "parameters": [ + { + "in": "header", + "name": "range", + "description": "A request to access a portion of the resource, such as:\n\n```text bytes=0-499 ```\n\n", + "schema": { + "type": "string" + } + }, { "in": "path", "name": "dataset_id", diff --git a/sled-agent/api/src/lib.rs b/sled-agent/api/src/lib.rs index a3510309a30..6c6cca6cf37 100644 --- a/sled-agent/api/src/lib.rs +++ b/sled-agent/api/src/lib.rs @@ -201,6 +201,7 @@ pub trait SledAgentApi { }] async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -211,6 +212,7 @@ pub trait SledAgentApi { }] async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -221,6 +223,7 @@ pub trait SledAgentApi { }] async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -231,6 +234,7 @@ pub trait SledAgentApi { }] async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; @@ -241,6 +245,7 @@ pub trait SledAgentApi { }] async fn support_bundle_head_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError>; diff --git a/sled-agent/src/http_entrypoints.rs b/sled-agent/src/http_entrypoints.rs index b2f66177e5c..bdb64ac2376 100644 --- a/sled-agent/src/http_entrypoints.rs +++ b/sled-agent/src/http_entrypoints.rs @@ -30,7 +30,6 @@ use omicron_common::disk::{ DatasetsConfig, DiskVariant, M2Slot, OmicronPhysicalDisksConfig, }; use range_requests::PotentialRange; -use range_requests::RequestContextEx; use sled_agent_api::*; use sled_agent_types::boot_disk::{ BootDiskOsWriteStatus, BootDiskPathParams, BootDiskUpdatePathParams, @@ -281,6 +280,7 @@ impl SledAgentApi for SledAgentImpl { async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); @@ -290,7 +290,10 @@ impl SledAgentApi for SledAgentImpl { file, } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); Ok(sa .as_support_bundle_storage() .get( @@ -305,13 +308,17 @@ impl SledAgentApi for SledAgentImpl { async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); Ok(sa .as_support_bundle_storage() .get( @@ -326,13 +333,17 @@ impl SledAgentApi for SledAgentImpl { async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); Ok(sa .as_support_bundle_storage() .head( @@ -347,6 +358,7 @@ impl SledAgentApi for SledAgentImpl { async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); @@ -356,7 +368,10 @@ impl SledAgentApi for SledAgentImpl { file, } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); Ok(sa .as_support_bundle_storage() .head( @@ -371,13 +386,17 @@ impl SledAgentApi for SledAgentImpl { async fn support_bundle_head_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); Ok(sa .as_support_bundle_storage() .head( diff --git a/sled-agent/src/sim/http_entrypoints.rs b/sled-agent/src/sim/http_entrypoints.rs index 0ba716df0d4..7b90e089345 100644 --- a/sled-agent/src/sim/http_entrypoints.rs +++ b/sled-agent/src/sim/http_entrypoints.rs @@ -39,7 +39,6 @@ use omicron_common::api::internal::shared::{ use omicron_common::disk::DatasetsConfig; use omicron_common::disk::OmicronPhysicalDisksConfig; use range_requests::PotentialRange; -use range_requests::RequestContextEx; use sled_agent_api::*; use sled_agent_types::boot_disk::BootDiskOsWriteStatus; use sled_agent_types::boot_disk::BootDiskPathParams; @@ -450,6 +449,7 @@ impl SledAgentApi for SledAgentSimImpl { async fn support_bundle_download_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); @@ -459,7 +459,10 @@ impl SledAgentApi for SledAgentSimImpl { file, } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); sa.support_bundle_get( zpool_id, dataset_id, @@ -472,13 +475,17 @@ impl SledAgentApi for SledAgentSimImpl { async fn support_bundle_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); sa.support_bundle_get( zpool_id, dataset_id, @@ -491,13 +498,17 @@ impl SledAgentApi for SledAgentSimImpl { async fn support_bundle_head( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); sa.support_bundle_head( zpool_id, dataset_id, @@ -510,6 +521,7 @@ impl SledAgentApi for SledAgentSimImpl { async fn support_bundle_head_file( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); @@ -519,7 +531,10 @@ impl SledAgentApi for SledAgentSimImpl { file, } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); sa.support_bundle_get( zpool_id, dataset_id, @@ -532,13 +547,17 @@ impl SledAgentApi for SledAgentSimImpl { async fn support_bundle_head_index( rqctx: RequestContext, + headers: Header, path_params: Path, ) -> Result, HttpError> { let sa = rqctx.context(); let SupportBundlePathParam { zpool_id, dataset_id, support_bundle_id } = path_params.into_inner(); - let range = rqctx.range(); + let range = headers + .into_inner() + .range + .map(|r| PotentialRange::new(r.as_bytes())); sa.support_bundle_head( zpool_id, dataset_id,