@@ -7,7 +7,8 @@ use eth2::types::{
7
7
use eth2:: types:: { FullPayloadContents , SignedBlindedBeaconBlock } ;
8
8
pub use eth2:: Error ;
9
9
use eth2:: {
10
- ok_or_error, StatusCode , CONSENSUS_VERSION_HEADER , CONTENT_TYPE_HEADER , SSZ_CONTENT_TYPE_HEADER ,
10
+ ok_or_error, StatusCode , CONSENSUS_VERSION_HEADER , CONTENT_TYPE_HEADER ,
11
+ JSON_CONTENT_TYPE_HEADER , SSZ_CONTENT_TYPE_HEADER ,
11
12
} ;
12
13
use reqwest:: header:: { HeaderMap , HeaderValue , ACCEPT } ;
13
14
use reqwest:: { IntoUrl , Response } ;
@@ -59,14 +60,20 @@ pub struct BuilderHttpClient {
59
60
server : SensitiveUrl ,
60
61
timeouts : Timeouts ,
61
62
user_agent : String ,
62
- ssz_enabled : Arc < AtomicBool > ,
63
+ /// Only use json for all requests/responses types.
64
+ disable_ssz : bool ,
65
+ /// Indicates that the `get_header`` response had content-type ssz
66
+ /// so we can set content-type header to ssz to make the `submit_blinded_blocks`
67
+ /// request.
68
+ ssz_used : Arc < AtomicBool > ,
63
69
}
64
70
65
71
impl BuilderHttpClient {
66
72
pub fn new (
67
73
server : SensitiveUrl ,
68
74
user_agent : Option < String > ,
69
75
builder_header_timeout : Option < Duration > ,
76
+ disable_ssz : bool ,
70
77
) -> Result < Self , Error > {
71
78
let user_agent = user_agent. unwrap_or ( DEFAULT_USER_AGENT . to_string ( ) ) ;
72
79
let client = reqwest:: Client :: builder ( ) . user_agent ( & user_agent) . build ( ) ?;
@@ -75,7 +82,8 @@ impl BuilderHttpClient {
75
82
server,
76
83
timeouts : Timeouts :: new ( builder_header_timeout) ,
77
84
user_agent,
78
- ssz_enabled : Arc :: new ( false . into ( ) ) ,
85
+ disable_ssz,
86
+ ssz_used : Arc :: new ( false . into ( ) ) ,
79
87
} )
80
88
}
81
89
@@ -126,15 +134,15 @@ impl BuilderHttpClient {
126
134
127
135
let Ok ( Some ( fork_name) ) = self . fork_name_from_header ( & headers) else {
128
136
// if no fork version specified, attempt to fallback to JSON
129
- self . ssz_enabled . store ( false , Ordering :: SeqCst ) ;
137
+ self . ssz_used . store ( false , Ordering :: SeqCst ) ;
130
138
return serde_json:: from_slice ( & response_bytes) . map_err ( Error :: InvalidJson ) ;
131
139
} ;
132
140
133
141
let content_type = self . content_type_from_header ( & headers) ;
134
142
135
143
match content_type {
136
144
ContentType :: Ssz => {
137
- self . ssz_enabled . store ( true , Ordering :: SeqCst ) ;
145
+ self . ssz_used . store ( true , Ordering :: SeqCst ) ;
138
146
T :: from_ssz_bytes_by_fork ( & response_bytes, fork_name)
139
147
. map ( |data| ForkVersionedResponse {
140
148
version : Some ( fork_name) ,
@@ -144,15 +152,17 @@ impl BuilderHttpClient {
144
152
. map_err ( Error :: InvalidSsz )
145
153
}
146
154
ContentType :: Json => {
147
- self . ssz_enabled . store ( false , Ordering :: SeqCst ) ;
155
+ self . ssz_used . store ( false , Ordering :: SeqCst ) ;
148
156
serde_json:: from_slice ( & response_bytes) . map_err ( Error :: InvalidJson )
149
157
}
150
158
}
151
159
}
152
160
153
161
/// Return `true` if the most recently received response from the builder had SSZ Content-Type.
162
+ ///
163
+ /// Also returns `false` if we have explicitly disabled ssz.
154
164
pub fn is_ssz_enabled ( & self ) -> bool {
155
- self . ssz_enabled . load ( Ordering :: SeqCst )
165
+ self . disable_ssz && self . ssz_used . load ( Ordering :: SeqCst )
156
166
}
157
167
158
168
async fn get_with_timeout < T : DeserializeOwned , U : IntoUrl > (
@@ -366,8 +376,12 @@ impl BuilderHttpClient {
366
376
. push ( pubkey. as_hex_string ( ) . as_str ( ) ) ;
367
377
368
378
let mut headers = HeaderMap :: new ( ) ;
369
- // We accept ssz responses by default so indicate that in the accept header
370
- headers. insert ( ACCEPT , HeaderValue :: from_static ( PREFERENCE_ACCEPT_VALUE ) ) ;
379
+ if self . disable_ssz {
380
+ headers. insert ( ACCEPT , HeaderValue :: from_static ( JSON_CONTENT_TYPE_HEADER ) ) ;
381
+ } else {
382
+ // We accept ssz responses by default so indicate that in the accept header
383
+ headers. insert ( ACCEPT , HeaderValue :: from_static ( PREFERENCE_ACCEPT_VALUE ) ) ;
384
+ }
371
385
372
386
let resp = self
373
387
. get_with_header ( path, self . timeouts . get_header , headers)
0 commit comments