diff --git a/src/servers/src/http/hints.rs b/src/servers/src/http/hints.rs index 9d5ca035d0c..722ac66534c 100644 --- a/src/servers/src/http/hints.rs +++ b/src/servers/src/http/hints.rs @@ -20,6 +20,7 @@ use common_telemetry::debug; use session::context::QueryContext; use session::hints::is_reserved_extension_key; +use crate::error::{InvalidParameterSnafu, Result}; use crate::hint_headers; pub async fn extract_hints(mut request: Request, next: Next) -> Response { @@ -31,8 +32,10 @@ pub async fn extract_hints(mut request: Request, next: Next) -> Response { Ok(hints) => hints, Err(error) => return error.into_response(), }; - if let Some(query_ctx) = request.extensions_mut().get_mut::() { - apply_hints(query_ctx, hints, dedicated_read_preference); + if let Some(query_ctx) = request.extensions_mut().get_mut::() + && let Err(error) = apply_hints(query_ctx, hints, dedicated_read_preference) + { + return error.into_response(); } next.run(request).await } @@ -41,7 +44,7 @@ fn apply_hints( query_ctx: &mut QueryContext, hints: Vec<(String, String)>, dedicated_read_preference: bool, -) { +) -> Result<()> { for (key, value) in hints { if is_reserved_extension_key(&key) { debug!( @@ -51,15 +54,20 @@ fn apply_hints( continue; } if key.eq_ignore_ascii_case(session::hints::READ_PREFERENCE_HINT) { - if !dedicated_read_preference - && let Ok(preference) = value.parse::() - { + if !dedicated_read_preference { + let preference = value.parse::().map_err(|_| { + InvalidParameterSnafu { + reason: format!("Invalid read_preference hint: {value}"), + } + .build() + })?; query_ctx.set_read_preference(preference); } } else { query_ctx.set_extension(key, value); } } + Ok(()) } #[cfg(test)] @@ -106,7 +114,8 @@ mod tests { ("ttl".to_string(), "7d".to_string()), ], false, - ); + ) + .unwrap(); assert_eq!( query_ctx.remote_query_id(), diff --git a/src/session/src/query_options.rs b/src/session/src/query_options.rs index 521123718c2..dca6456b0be 100644 --- a/src/session/src/query_options.rs +++ b/src/session/src/query_options.rs @@ -60,7 +60,7 @@ pub fn parse_query_option( return InvalidConfigValueSnafu { name: key, value, - hint: "query.parallelism must be between 1 and 1024", + hint: format!("query.parallelism must be between 1 and {max_parallelism}"), } .fail(); }