{"record":{"id":"340543dc898c3f28","repo":"quarkusio/quarkus","slug":"header-already-encoded","errorCode":null,"errorMessage":"Header already encoded","messagePattern":"Header already encoded","errorType":"exception","errorClass":"ErrorDataEncoderException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/multipart/PausableHttpPostRequestEncoder.java","lineNumber":812,"sourceCode":"     */\n    public HttpRequest finalizeRequest() throws ErrorDataEncoderException {\n        // Finalize the multipartHttpDatas\n        if (!headerFinalized) {\n            if (isMultipart) {\n                QuarkusInternalAttribute internal = new QuarkusInternalAttribute(charset);\n                if (duringMixedMode) {\n                    internal.addValue(\"\\r\\n--\" + multipartMixedBoundary + \"--\");\n                }\n                internal.addValue(\"\\r\\n--\" + multipartDataBoundary + \"--\\r\\n\");\n                multipartHttpDatas.add(internal);\n                multipartMixedBoundary = null;\n                currentFileUpload = null;\n                duringMixedMode = false;\n                globalBodySize += internal.size();\n            }\n            headerFinalized = true;\n        } else {\n            throw new ErrorDataEncoderException(\"Header already encoded\");\n        }\n\n        HttpHeaders headers = request.headers();\n        List<String> contentTypes = headers.getAll(HttpHeaderNames.CONTENT_TYPE);\n        if (contentTypes != null) {\n            headers.remove(HttpHeaderNames.CONTENT_TYPE);\n            for (String contentType : contentTypes) {\n                // \"multipart/form-data; boundary=--89421926422648\"\n                String lowercased = contentType.toLowerCase();\n                if (lowercased.startsWith(HttpHeaderValues.MULTIPART_FORM_DATA.toString()) ||\n                        lowercased.startsWith(HttpHeaderValues.APPLICATION_X_WWW_FORM_URLENCODED.toString())) {\n                    // ignore\n                } else {\n                    headers.add(HttpHeaderNames.CONTENT_TYPE, contentType);\n                }\n            }\n        }\n        if (isMultipart) {","sourceCodeStart":794,"sourceCodeEnd":830,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/multipart/PausableHttpPostRequestEncoder.java#L794-L830","documentation":"finalizeRequest() can only finalize headers once; calling it again after headerFinalized is true throws ErrorDataEncoderException(\"Header already encoded\"). It enforces the encoder's one-shot finalization contract.","triggerScenarios":"Calling finalizeRequest() twice on the same encoder instance, e.g. on retry or when sending the same request twice.","commonSituations":"Retry logic that re-invokes finalizeRequest on the original encoder; shared helper methods that each call finalize.","solutions":["Create a fresh encoder (and re-add body data) for each send/retry","Guard finalizeRequest with a boolean so it runs once per encoder","Only call finalizeRequest at the outermost request-building layer"],"exampleFix":"// before\nencoder.finalizeRequest();\n// retry path\nencoder.finalizeRequest(); // throws\n// after\nencoder.finalizeRequest();\n// retry path\nPausableHttpPostRequestEncoder encoder2 = new PausableHttpPostRequestEncoder(request, true, charset, factory, mode);","handlingStrategy":"try-catch","validationCode":"if (encoder.isFinalized()) { encoder = newEncoderFrom(request, bodyData); } else { encoder.finalizeRequest(); }","typeGuard":"null","tryCatchPattern":"try { encoder.finalizeRequest(); } catch (ErrorDataEncoderException e) { /* already finalized: reuse or rebuild */ }","preventionTips":["Call finalizeRequest exactly once per encoder","For retries, rebuild encoder and body data from scratch","Centralize finalization in one code path"],"tags":["multipart","encoder-state","resteasy-reactive","lifecycle"],"backgroundTag":"object-already-finalized","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"}