diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index 1b4f1d35e..f1d7769e8 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -45,6 +45,7 @@ use eth2::types::{ PublishBlockRequest, ValidatorBalancesRequestBody, ValidatorId, ValidatorStatus, ValidatorsRequestBody, }; +use eth2::{CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER}; use lighthouse_network::{types::SyncState, EnrExt, NetworkGlobals, PeerId, PubsubMessage}; use lighthouse_version::version_with_platform; use logging::SSELoggingComponents; @@ -86,10 +87,12 @@ use types::{ }; use validator::pubkey_to_validator_index; use version::{ - add_consensus_version_header, execution_optimistic_finalized_fork_versioned_response, - inconsistent_fork_rejection, unsupported_version_rejection, V1, V2, V3, + add_consensus_version_header, add_ssz_content_type_header, + execution_optimistic_finalized_fork_versioned_response, inconsistent_fork_rejection, + unsupported_version_rejection, V1, V2, V3, }; use warp::http::StatusCode; +use warp::hyper::Body; use warp::sse::Event; use warp::Reply; use warp::{http::Response, Filter}; @@ -1567,8 +1570,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(block.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -1659,8 +1662,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(block.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -1710,8 +1713,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(blob_sidecar_list_filtered.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2239,8 +2242,8 @@ pub fn serve( .map(|snapshot| { Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(snapshot.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2251,8 +2254,8 @@ pub fn serve( .unwrap_or_else(|| { Response::builder() .status(503) - .header("Content-Type", "application/octet-stream") .body(Vec::new().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2323,8 +2326,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(withdrawals.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2389,8 +2392,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(bootstrap.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2437,8 +2440,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(update.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2485,8 +2488,8 @@ pub fn serve( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(update.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -2687,8 +2690,8 @@ pub fn serve( .map_err(inconsistent_fork_rejection)?; Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(state.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map(|resp: warp::reply::Response| { add_consensus_version_header(resp, fork_name) }) @@ -4273,8 +4276,8 @@ pub fn serve( let (state, _execution_optimistic, _finalized) = state_id.state(&chain)?; Response::builder() .status(200) - .header("Content-Type", "application/ssz") - .body(state.as_ssz_bytes()) + .body(state.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map_err(|e| { warp_utils::reject::custom_server_error(format!( "failed to create response: {}", @@ -4646,7 +4649,7 @@ pub fn serve( .boxed() .uor( warp::post().and( - warp::header::exact("Content-Type", "application/octet-stream") + warp::header::exact(CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER) // Routes which expect `application/octet-stream` go within this `and`. .and( post_beacon_blocks_ssz diff --git a/beacon_node/http_api/src/produce_block.rs b/beacon_node/http_api/src/produce_block.rs index 6b8a1bb1c..0da3bdc7a 100644 --- a/beacon_node/http_api/src/produce_block.rs +++ b/beacon_node/http_api/src/produce_block.rs @@ -3,13 +3,12 @@ use crate::{ version::{ add_consensus_block_value_header, add_consensus_version_header, add_execution_payload_blinded_header, add_execution_payload_value_header, - fork_versioned_response, inconsistent_fork_rejection, + add_ssz_content_type_header, fork_versioned_response, inconsistent_fork_rejection, }, }; use beacon_chain::{ BeaconBlockResponseWrapper, BeaconChain, BeaconChainTypes, ProduceBlockVerification, }; -use bytes::Bytes; use eth2::types::{ self as api_types, EndpointVersion, ProduceBlockV3Metadata, SkipRandaoVerification, }; @@ -95,8 +94,8 @@ pub fn build_response_v3( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/ssz") .body(block_contents.as_ssz_bytes().into()) + .map(|res: Response| add_ssz_content_type_header(res)) .map(|res: Response| add_consensus_version_header(res, fork_name)) .map(|res| add_execution_payload_blinded_header(res, execution_payload_blinded)) .map(|res: Response| { @@ -196,9 +195,9 @@ pub fn build_response_v2( match accept_header { Some(api_types::Accept::Ssz) => Response::builder() .status(200) - .header("Content-Type", "application/octet-stream") .body(block_contents.as_ssz_bytes().into()) - .map(|res: Response| add_consensus_version_header(res, fork_name)) + .map(|res: Response| add_ssz_content_type_header(res)) + .map(|res: Response| add_consensus_version_header(res, fork_name)) .map_err(|e| { warp_utils::reject::custom_server_error(format!("failed to create response: {}", e)) }), diff --git a/beacon_node/http_api/src/version.rs b/beacon_node/http_api/src/version.rs index 7cd5e6700..59816cb89 100644 --- a/beacon_node/http_api/src/version.rs +++ b/beacon_node/http_api/src/version.rs @@ -1,7 +1,7 @@ use crate::api_types::EndpointVersion; use eth2::{ - CONSENSUS_BLOCK_VALUE_HEADER, CONSENSUS_VERSION_HEADER, EXECUTION_PAYLOAD_BLINDED_HEADER, - EXECUTION_PAYLOAD_VALUE_HEADER, + CONSENSUS_BLOCK_VALUE_HEADER, CONSENSUS_VERSION_HEADER, CONTENT_TYPE_HEADER, + EXECUTION_PAYLOAD_BLINDED_HEADER, EXECUTION_PAYLOAD_VALUE_HEADER, SSZ_CONTENT_TYPE_HEADER, }; use serde::Serialize; use types::{ @@ -59,6 +59,11 @@ pub fn execution_optimistic_finalized_fork_versioned_response( }) } +/// Add the 'Content-Type application/octet-stream` header to a response. +pub fn add_ssz_content_type_header(reply: T) -> Response { + reply::with_header(reply, CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER).into_response() +} + /// Add the `Eth-Consensus-Version` header to a response. pub fn add_consensus_version_header(reply: T, fork_name: ForkName) -> Response { reply::with_header(reply, CONSENSUS_VERSION_HEADER, fork_name.to_string()).into_response() diff --git a/common/eth2/src/lib.rs b/common/eth2/src/lib.rs index c633a6c6c..9c8edc4bd 100644 --- a/common/eth2/src/lib.rs +++ b/common/eth2/src/lib.rs @@ -46,6 +46,9 @@ pub const EXECUTION_PAYLOAD_BLINDED_HEADER: &str = "Eth-Execution-Payload-Blinde pub const EXECUTION_PAYLOAD_VALUE_HEADER: &str = "Eth-Execution-Payload-Value"; pub const CONSENSUS_BLOCK_VALUE_HEADER: &str = "Eth-Consensus-Block-Value"; +pub const CONTENT_TYPE_HEADER: &str = "Content-Type"; +pub const SSZ_CONTENT_TYPE_HEADER: &str = "application/octet-stream"; + #[derive(Debug)] pub enum Error { /// The `reqwest` client raised an error.