fix: block ALL LS follow-up requests across connections
Move the in-flight blocking check to the top of the LLM request flow, BEFORE request modification. This catches follow-ups on ALL connections (the LS opens multiple parallel TLS connections). Only the very first modified request reaches Google — all others get fake STOP responses. Previously, each new connection independently allowed one request through before blocking, letting 4-5 requests leak per turn.
This commit is contained in:
@@ -27,7 +27,9 @@ pub(crate) fn err_response(
|
||||
|
||||
/// Convert a MITM-captured upstream error from Google into an HTTP response.
|
||||
/// Maps Google's HTTP status codes and preserves the error message.
|
||||
pub(crate) fn upstream_err_response(err: &crate::mitm::store::UpstreamError) -> axum::response::Response {
|
||||
pub(crate) fn upstream_err_response(
|
||||
err: &crate::mitm::store::UpstreamError,
|
||||
) -> axum::response::Response {
|
||||
// Map Google's status code to HTTP status
|
||||
let status = StatusCode::from_u16(err.status).unwrap_or(StatusCode::BAD_GATEWAY);
|
||||
|
||||
@@ -41,7 +43,9 @@ pub(crate) fn upstream_err_response(err: &crate::mitm::store::UpstreamError) ->
|
||||
_ => "upstream_error",
|
||||
};
|
||||
|
||||
let message = err.message.clone()
|
||||
let message = err
|
||||
.message
|
||||
.clone()
|
||||
.unwrap_or_else(|| format!("Google API returned HTTP {}", err.status));
|
||||
|
||||
err_response(status, message, error_type)
|
||||
@@ -99,7 +103,8 @@ pub(crate) fn extract_image_from_content(item: &serde_json::Value) -> Option<Ima
|
||||
}
|
||||
// OpenAI Responses API format
|
||||
"input_image" => {
|
||||
let url = item["image_url"].as_str()
|
||||
let url = item["image_url"]
|
||||
.as_str()
|
||||
.or_else(|| item["url"].as_str())?;
|
||||
parse_data_uri(url)
|
||||
}
|
||||
@@ -109,5 +114,8 @@ pub(crate) fn extract_image_from_content(item: &serde_json::Value) -> Option<Ima
|
||||
|
||||
/// Extract the first image from a content array (Value::Array of content parts).
|
||||
pub(crate) fn extract_first_image(content: &serde_json::Value) -> Option<ImageData> {
|
||||
content.as_array()?.iter().find_map(extract_image_from_content)
|
||||
content
|
||||
.as_array()?
|
||||
.iter()
|
||||
.find_map(extract_image_from_content)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user