{"record":{"id":"7acd2c6af90ebd72","repo":"quarkusio/quarkus","slug":"unable-to-parse-multipart-response-no-delimiter","errorCode":null,"errorMessage":"Unable to parse multipart response - No delimiter specified","messagePattern":"Unable to parse multipart response - No delimiter specified","errorType":"exception","errorClass":"ErrorDataDecoderException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/multipart/QuarkusMultipartResponseDecoder.java","lineNumber":232,"sourceCode":"\n        String contentTypeValue = this.response.headers().get(HttpHeaderNames.CONTENT_TYPE);\n        if (contentTypeValue == null) {\n            throw new ErrorDataDecoderException(\"No '\" + HttpHeaderNames.CONTENT_TYPE + \"' header present.\");\n        }\n\n        String[] dataBoundary = getMultipartDataBoundary(contentTypeValue);\n        if (dataBoundary != null) {\n            multipartDataBoundary = dataBoundary[0];\n            if (dataBoundary.length > 1 && dataBoundary[1] != null) {\n                try {\n                    this.charset = Charset.forName(dataBoundary[1]);\n                } catch (IllegalCharsetNameException e) {\n                    throw new ErrorDataDecoderException(e);\n                }\n            }\n        } else {\n            destroy();\n            throw new ErrorDataDecoderException(\"Unable to parse multipart response - No delimiter specified\");\n        }\n        currentStatus = MultiPartStatus.HEADERDELIMITER;\n\n        try {\n            if (this.response instanceof HttpContent) {\n                // Offer automatically if the given request is als type of HttpContent\n                // See #1089\n                offer((HttpContent) this.response);\n            } else {\n                parseBody();\n            }\n        } catch (Throwable e) {\n            destroy();\n            PlatformDependent.throwException(e);\n        }\n    }\n\n    private void checkDestroyed() {","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/multipart/QuarkusMultipartResponseDecoder.java#L214-L250","documentation":"Thrown when the Content-Type header exists but contains no boundary= parameter, so getMultipartDataBoundary returns null. Without a delimiter the decoder cannot split multipart parts; it destroys itself and fails fast with ErrorDataDecoderException.","triggerScenarios":"Receiving a response whose Content-Type is multipart/* but lacks the boundary parameter (e.g. 'multipart/form-data' with no '; boundary=...'), then offering its content to QuarkusMultipartResponseDecoder.","commonSituations":"Server bug omitting the boundary; a gateway rewriting the Content-Type and dropping the boundary; manually constructed multipart Content-Type strings missing '; boundary=...'.","solutions":["Fix the server/gateway so the multipart Content-Type always includes a boundary parameter","If the boundary is known out-of-band, set it in the Content-Type before decoding","Verify the response is genuinely multipart before using the multipart decoder","Catch ErrorDataDecoderException and handle the response as a single-part body"],"exampleFix":"// before (server)\nContent-Type: multipart/form-data\n// after\nContent-Type: multipart/form-data; boundary=----quarkusBoundary123","handlingStrategy":"validation","validationCode":"String ct = response.headers().get(HttpHeaderNames.CONTENT_TYPE);\nif (ct != null && ct.startsWith(\"multipart/\") && !ct.toLowerCase().contains(\"boundary=\")) {\n    throw new IllegalArgumentException(\"Multipart Content-Type without boundary\");\n}","typeGuard":null,"tryCatchPattern":"try { decoder = new QuarkusMultipartResponseDecoder(response, factory, charset); } catch (ErrorDataDecoderException e) { /* handle missing boundary: read raw */ }","preventionTips":["Validate boundary= presence in the Content-Type before decoding","Fix gateway code that reconstructs Content-Type strings"],"tags":["http","multipart","boundary"],"backgroundTag":"missing-multipart-boundary","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}