{"record":{"id":"1ab836b98b96196d","repo":"quarkusio/quarkus","slug":"the-accept-header-value-did-not-correspond-to-a-va-1ab836","errorCode":null,"errorMessage":"The accept header value did not correspond to a valid media type","messagePattern":"The accept header value did not correspond to a valid media type","errorType":"http","errorClass":"IllegalArgumentException","httpStatus":400,"severity":"error","filePath":"independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java","lineNumber":139,"sourceCode":"    public MediaType selectMediaType(ResteasyReactiveRequestContext requestContext, Holder holder) {\n        MediaType selected = null;\n        List<String> accepts = requestContext.getHttpHeaders().getRequestHeader(HttpHeaders.ACCEPT);\n        if (!accepts.isEmpty()) {\n            boolean sawParseableAccept = false;\n            for (String accept : accepts) {\n                // MediaTypeHelper.parseHeader skips unparseable tokens; an empty result means the header was malformed\n                if (!MediaTypeHelper.parseHeader(accept).isEmpty()) {\n                    sawParseableAccept = true;\n                }\n                Map.Entry<MediaType, MediaType> entry = holder.serverMediaType\n                        .negotiateProduces(accept, null);\n                if (entry.getValue() != null) {\n                    selected = entry.getValue();\n                    break;\n                }\n            }\n            if (!sawParseableAccept) {\n                throw new IllegalArgumentException(\"The accept header value did not correspond to a valid media type\");\n            }\n        }\n        if (selected == null) {\n            selected = holder.mtsWithParams.get(0);\n        }\n        if (selected.equals(MediaType.WILDCARD_TYPE)) {\n            return MediaType.APPLICATION_OCTET_STREAM_TYPE;\n        }\n        return selected;\n    }\n\n    private MediaType[] getProducesMediaTypes(RuntimeResource runtimeResource) {\n        return runtimeResource.getProduces() == null\n                ? DEFAULT_MEDIA_TYPES\n                : runtimeResource.getProduces().getSortedOriginalMediaTypes();\n    }\n\n    private List<MediaType> getConsumesMediaTypes(RuntimeResource runtimeResource) {","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java#L121-L157","documentation":"Thrown from MediaTypeMapper.selectMediaType (called from handle) as an IllegalArgumentException when none of the Accept header values on the request could be parsed while trying to select a response media type for the holder's variants. sawParseableAccept remains false after iterating all Accept entries, so it throws with the malformed-accept message. Upstream machinery typically maps this to HTTP 400.","triggerScenarios":"A request with an Accept header reaches selectMediaType on a resource with multiple @Produces variants; each Accept token fails parsing inside the selection loop; line 139 throws, e.g. 'Accept: text' or 'Accept: %%%'.","commonSituations":"Content negotiators in client SDKs emitting invalid Accept strings; corrupted headers from CDN/proxy layers; tests with hand-crafted header values.","solutions":["Send a valid Accept header (e.g. application/json) or drop it to allow server-side default selection.","Fix the client's media-type negotiation configuration to emit standard type/subtype values.","Inspect intermediary layers (CDN, gateway) for Accept header rewriting."],"exampleFix":"// before\nrequest.accept(\"text\");\n// after\nrequest.accept(MediaType.APPLICATION_JSON);","handlingStrategy":"validation","validationCode":"boolean anyParseable = false;\nfor (String t : acceptHeader.split(\",\")) {\n    try { jakarta.ws.rs.core.MediaType.valueOf(t.trim()); anyParseable = true; break; }\n    catch (IllegalArgumentException ignored) { }\n}\nif (!anyParseable) acceptHeader = null; // let the server choose the default","typeGuard":null,"tryCatchPattern":"try {\n    return client.get();\n} catch (BadRequestException e) {\n    log.error(\"Accept header unparseable during negotiation: {}\", acceptHeader, e);\n    throw e;\n}","preventionTips":["Use SDK/negotiator APIs that emit standard media types.","Disable CDN/proxy Accept-header rewriting for API traffic.","Include one always-valid token (e.g. */*) at the end of composed Accept headers."],"tags":["rest","accept-header","content-negotiation","malformed-header"],"backgroundTag":"malformed-accept-header","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"}