From 0faa0c696dfbb4c2f93d8dd7aab3bf3d46b2fe69 Mon Sep 17 00:00:00 2001 From: yetone Date: Fri, 2 Oct 2026 00:58:21 +0800 Subject: [PATCH] =?UTF-8?q?gateway:=20a=20refusal=20behind=20a=20prefix=20?= =?UTF-8?q?that=20isn't=20JSON,=20like=20[HTTP=20400],=20is=20still=20read?= =?UTF-8?q?=20by=20its=20structure=20(#451=20follow-up)=20=E2=80=94=20the?= =?UTF-8?q?=20scan=20for=20a=20vendor's=20JSON=20error=20stopped=20at=20th?= =?UTF-8?q?e=20first=20bracket=20it=20couldn't=20decode,=20so=20[HTTP=2040?= =?UTF-8?q?0]=20{"detail":[=E2=80=A6]}=20fell=20back=20to=20text=20matchin?= =?UTF-8?q?g:=20an=20echoed=20metadata=20in=20the=20input=20was=20taken=20?= =?UTF-8?q?for=20a=20refusal=20and=20a=20real=20extra=5Fforbidden=20was=20?= =?UTF-8?q?missed.=20The=20scan=20now=20looks=20on=20past=20such=20a=20bra?= =?UTF-8?q?cket.=20text-prefixed-extra=20and=20text-prefixed-input-echo=20?= =?UTF-8?q?in=20TestRefusedOptionalNamesOnlyUnsupportedFields=20fail=20wit?= =?UTF-8?q?hout=20the=20change.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/gateway/gateway.go | 4 +++- internal/gateway/optional_fields_test.go | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/gateway/gateway.go b/internal/gateway/gateway.go index df5bffca..39c50605 100644 --- a/internal/gateway/gateway.go +++ b/internal/gateway/gateway.go @@ -2197,7 +2197,9 @@ func unsupportedOptionalField(fault any, field string) bool { var inner any dec := json.NewDecoder(strings.NewReader(rest[i:])) if dec.Decode(&inner) != nil { - break + // not JSON there ([HTTP 400]): look on past the bracket + rest = rest[i+1:] + continue } if hasOptionalErrorObject(inner) { return unsupportedOptionalField(inner, field) diff --git a/internal/gateway/optional_fields_test.go b/internal/gateway/optional_fields_test.go index 347f2fe3..64ff3c84 100644 --- a/internal/gateway/optional_fields_test.go +++ b/internal/gateway/optional_fields_test.go @@ -162,6 +162,8 @@ func TestRefusedOptionalNamesOnlyUnsupportedFields(t *testing.T) { {"mixed-array-input-echo", `[400,{"type":"dict_type","loc":["body","metadata"],"msg":"Input should be a valid dictionary","input":"Unknown name 'metadata': Cannot find field."}]`, 422, nil}, {"status-prefixed-extra", `[400] {"detail":[{"type":"extra_forbidden","loc":["body","store"],"msg":"Extra inputs are not permitted"}]}`, 400, []string{"store"}}, {"status-prefixed-input-echo", `[400] {"detail":[{"type":"dict_type","loc":["body","metadata"],"msg":"Input should be a valid dictionary","input":"Unknown name 'metadata': Cannot find field."}]}`, 400, nil}, + {"text-prefixed-extra", `[HTTP 400] {"detail":[{"type":"extra_forbidden","loc":["body","store"],"msg":"Extra inputs are not permitted"}]}`, 400, []string{"store"}}, + {"text-prefixed-input-echo", `[HTTP 400] {"detail":[{"type":"dict_type","loc":["body","metadata"],"msg":"Input should be a valid dictionary","input":"Unknown name 'metadata': Cannot find field."}]}`, 400, nil}, {"nested-extra", `{"detail":[{"type":"extra_forbidden","loc":["body","metadata","store"],"msg":"Extra inputs are not permitted"}]}`, 422, nil}, {"nested-unknown", `{"error":{"message":"Invalid JSON payload received. Unknown name \"store\" at 'metadata': Cannot find field."}}`, 400, nil}, {"other-parameter", `{"error":{"message":"'metadata' is unsupported","param":"model","code":"unsupported_value"}}`, 400, nil},