Skip to content

Commit e2d8fe1

Browse files
authored
Fix too-big-request error (#677)
* Fix BackgroundDevnet::send_custom_rpc; fix too big rpc req test
1 parent 5b6c1c5 commit e2d8fe1

File tree

3 files changed

+54
-14
lines changed

3 files changed

+54
-14
lines changed

crates/starknet-devnet-server/src/server.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ use tower_http::trace::TraceLayer;
1818
use crate::api::http::{endpoints as http, HttpApiHandler};
1919
use crate::api::json_rpc::JsonRpcHandler;
2020
use crate::restrictive_mode::is_uri_path_restricted;
21+
use crate::rpc_core::error::RpcError;
22+
use crate::rpc_core::response::ResponseResult;
2123
use crate::rpc_handler::RpcHandler;
2224
use crate::{http_rpc_router, rpc_handler, ServerConfig};
2325
pub type StarknetDevnetServer = axum::serve::Serve<IntoMakeService<Router>, Router>;
@@ -174,20 +176,27 @@ async fn reject_too_big(
174176
request: Request,
175177
next: Next,
176178
) -> Result<impl IntoResponse, (StatusCode, String)> {
179+
fn bad_request(e: impl std::fmt::Display) -> (StatusCode, String) {
180+
(StatusCode::BAD_REQUEST, format!("Invalid Content-Length: {e}"))
181+
}
182+
177183
if let Some(content_length) = request.headers().get(header::CONTENT_LENGTH) {
178-
let content_length: usize = content_length
179-
.to_str()
180-
.map_err(|e| (StatusCode::BAD_REQUEST, format!("Invalid Content-Length: {e}")))?
181-
.parse()
182-
.map_err(|e| (StatusCode::BAD_REQUEST, format!("Invalid Content-Length: {e}")))?;
184+
let content_length: usize =
185+
content_length.to_str().map_err(bad_request)?.parse().map_err(bad_request)?;
183186

184187
if content_length > payload_limit {
185188
return Err((
186189
StatusCode::PAYLOAD_TOO_LARGE,
187-
format!(
188-
"Received: {content_length} bytes, maximum (specifiable via \
189-
--request-body-size-limit): {payload_limit} bytes"
190-
),
190+
serde_json::to_string(&ResponseResult::Error(RpcError {
191+
code: crate::rpc_core::error::ErrorCode::InvalidRequest,
192+
message: format!(
193+
"Request too big! Server received: {content_length} bytes; maximum \
194+
(specifiable via --request-body-size-limit): {payload_limit} bytes"
195+
)
196+
.into(),
197+
data: None,
198+
}))
199+
.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?,
191200
));
192201
}
193202
}

tests/integration/common/background_devnet.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,24 @@ impl BackgroundDevnet {
205205
body_json["params"] = params;
206206
}
207207

208+
// Convert HTTP error to RPC error; panic if not possible.
208209
let json_rpc_result: serde_json::Value =
209210
self.reqwest_client().post_json_async(RPC_PATH, body_json).await.map_err(|err| {
210-
RpcError {
211-
code: err.status().as_u16().into(),
212-
message: err.error_message().into(),
213-
data: None,
211+
let err_msg = err.error_message();
212+
213+
if let Ok(rpc_error) = serde_json::from_str::<RpcError>(&err_msg) {
214+
return rpc_error;
215+
};
216+
217+
if let Ok(err_val) = serde_json::from_str::<serde_json::Value>(&err_msg) {
218+
if let Some(err_prop) = err_val.get("error").cloned() {
219+
if let Ok(rpc_error) = serde_json::from_value::<RpcError>(err_prop) {
220+
return rpc_error;
221+
}
222+
}
214223
}
224+
225+
panic!("Cannot extract RPC error from: {err_msg}")
215226
})?;
216227

217228
if let Some(result) = json_rpc_result.get("result") {

tests/integration/general_integration_tests.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ async fn too_big_request_rejected_via_non_rpc() {
4444
.expect_err("Request should have been rejected");
4545

4646
assert_eq!(err.status(), StatusCode::PAYLOAD_TOO_LARGE);
47+
assert_eq!(
48+
serde_json::from_str::<serde_json::Value>(&err.error_message()).unwrap(),
49+
json!({
50+
"error": {
51+
"code": -32600,
52+
"message": format!("Request too big! Server received: 1111 bytes; maximum (specifiable via --request-body-size-limit): {limit} bytes"),
53+
}
54+
})
55+
);
4756

4857
// subtract enough so that the rest of the json body doesn't overflow the limit
4958
let nonexistent_path = "a".repeat(limit - 100);
@@ -71,7 +80,18 @@ async fn too_big_request_rejected_via_rpc() {
7180
.await
7281
.expect_err("Request should have been rejected");
7382

74-
assert_eq!(error.code, StatusCode::PAYLOAD_TOO_LARGE.as_u16() as i64);
83+
assert_eq!(
84+
error,
85+
RpcError {
86+
code: -32600,
87+
message: format!(
88+
"Request too big! Server received: 1168 bytes; maximum (specifiable via \
89+
--request-body-size-limit): {limit} bytes"
90+
)
91+
.into(),
92+
data: None
93+
}
94+
);
7595

7696
// subtract enough so that the rest of the json body doesn't overflow the limit
7797
let nonexistent_path = "a".repeat(limit - 100);

0 commit comments

Comments
 (0)