lighthouse/common/eth2/src/mixin.rs
Michael Sproul 4e05f19fb5 Serve Bellatrix preset in BN API (#3425)
## Issue Addressed

Resolves #3388
Resolves #2638

## Proposed Changes

- Return the `BellatrixPreset` on `/eth/v1/config/spec` by default.
- Allow users to opt out of this by providing `--http-spec-fork=altair` (unless there's a Bellatrix fork epoch set).
- Add the Altair constants from #2638 and make serving the constants non-optional (the `http-disable-legacy-spec` flag is deprecated).
- Modify the VC to only read the `Config` and not to log extra fields. This prevents it from having to muck around parsing the `ConfigAndPreset` fields it doesn't need.

## Additional Info

This change is backwards-compatible for the VC and the BN, but is marked as a breaking change for the removal of `--http-disable-legacy-spec`.

I tried making `Config` a `superstruct` too, but getting the automatic decoding to work was a huge pain and was going to require a lot of hacks, so I gave up in favour of keeping the default-based approach we have now.
2022-08-10 07:52:59 +00:00

51 lines
1.5 KiB
Rust

use crate::{types::Accept, Error, CONSENSUS_VERSION_HEADER};
use reqwest::{header::ACCEPT, RequestBuilder, Response, StatusCode};
use std::str::FromStr;
use types::ForkName;
/// Trait for converting a 404 error into an `Option<Response>`.
pub trait ResponseOptional {
fn optional(self) -> Result<Option<Response>, Error>;
}
impl ResponseOptional for Result<Response, Error> {
fn optional(self) -> Result<Option<Response>, Error> {
match self {
Ok(x) => Ok(Some(x)),
Err(e) if e.status() == Some(StatusCode::NOT_FOUND) => Ok(None),
Err(e) => Err(e),
}
}
}
/// Trait for extracting the fork name from the headers of a response.
pub trait ResponseForkName {
#[allow(clippy::result_unit_err)]
fn fork_name_from_header(&self) -> Result<Option<ForkName>, String>;
}
impl ResponseForkName for Response {
fn fork_name_from_header(&self) -> Result<Option<ForkName>, String> {
self.headers()
.get(CONSENSUS_VERSION_HEADER)
.map(|fork_name| {
fork_name
.to_str()
.map_err(|e| e.to_string())
.and_then(ForkName::from_str)
})
.transpose()
}
}
/// Trait for adding an "accept" header to a request builder.
pub trait RequestAccept {
fn accept(self, accept: Accept) -> RequestBuilder;
}
impl RequestAccept for RequestBuilder {
fn accept(self, accept: Accept) -> RequestBuilder {
self.header(ACCEPT, accept.to_string())
}
}