quarkusio/quarkus · error · ErrorDataDecoderException
No 'Content-Type' header present.
Error message
No 'Content-Type' header present.
What it means
This ErrorDataDecoderException is thrown by QuarkusMultipartResponseDecoder's constructor when the HTTP response it is asked to decode has no Content-Type header. A multipart decoder cannot know the boundary string or media type without it, so construction fails immediately and the response body cannot be decoded.
Source
Thrown at independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/multipart/QuarkusMultipartResponseDecoder.java:217
* the request to decode
* @param charset
* the charset to use as default
* @throws NullPointerException
* for request or charset or factory
* @throws ErrorDataDecoderException
* if the default charset was wrong when decoding or other
* errors
*/
public QuarkusMultipartResponseDecoder(QuarkusMultipartResponseDataFactory factory, HttpClientResponse response,
Charset charset) {
this.response = checkNotNull(response, "request");
this.charset = checkNotNull(charset, "charset");
this.factory = checkNotNull(factory, "factory");
// Fill default values
String contentTypeValue = this.response.headers().get(HttpHeaderNames.CONTENT_TYPE);
if (contentTypeValue == null) {
throw new ErrorDataDecoderException("No '" + HttpHeaderNames.CONTENT_TYPE + "' header present.");
}
String[] dataBoundary = getMultipartDataBoundary(contentTypeValue);
if (dataBoundary != null) {
multipartDataBoundary = dataBoundary[0];
if (dataBoundary.length > 1 && dataBoundary[1] != null) {
try {
this.charset = Charset.forName(dataBoundary[1]);
} catch (IllegalCharsetNameException e) {
throw new ErrorDataDecoderException(e);
}
}
} else {
destroy();
throw new ErrorDataDecoderException("Unable to parse multipart response - No delimiter specified");
}
currentStatus = MultiPartStatus.HEADERDELIMITER;
View on GitHub (pinned to e1c734241f)
Solutions
- Fix the server (or proxy) so multipart responses always include a Content-Type header such as multipart/mixed; boundary=...
- Check client-side filters/interceptors for code that removes or replaces the Content-Type header
- Verify the decoder is only invoked for responses that are actually multipart; check isMultipart() before constructing
- Catch ErrorDataDecoderException and fall back to reading the raw response body
Example fix
// before
// decoder constructed for any response
QuarkusMultipartResponseDecoder decoder = new QuarkusMultipartResponseDecoder(response, factory, charset);
// after
if (response.headers().contains(HttpHeaderNames.CONTENT_TYPE)) {
QuarkusMultipartResponseDecoder decoder = new QuarkusMultipartResponseDecoder(response, factory, charset);
} else {
// handle non-multipart / malformed response
} Defensive patterns
Strategy: validation
Validate before calling
if (!response.headers().contains(HttpHeaderNames.CONTENT_TYPE)) {
throw new IllegalArgumentException("Response is missing Content-Type; cannot decode multipart");
}
String ct = response.headers().get(HttpHeaderNames.CONTENT_TYPE);
if (!ct.startsWith("multipart/")) { /* route to a non-multipart decoder */ } Try / catch
try { decoder = new QuarkusMultipartResponseDecoder(response, factory, charset); } catch (ErrorDataDecoderException e) { /* fall back to raw body */ } Prevention
- Always assert Content-Type exists and starts with multipart/ before constructing the decoder
- Audit client filters/interceptors for header removal
- Test against your real server with a header-inspection proxy
When it happens
Trigger: Constructing a QuarkusMultipartResponseDecoder (or receiving a multipart response through the reactive client) where response.headers().get(HttpHeaderNames.CONTENT_TYPE) returns null — i.e. the server response lacks a Content-Type header entirely.
Common situations: A misbehaving or hand-rolled server/proxy strips the Content-Type header; a custom Netty pipeline feeds a non-multipart or malformed response into the multipart decoder; interceptors or response filters rewrite headers and drop Content-Type.
Related errors
- Needs a boundary value
- Cannot create a Encoder if request is a TRACE
- Illegal charset in multipart response Content-Type (wrapped)
- Unable to parse multipart response - No delimiter specified
- QuarkusMultipartResponseDecoder was destroyed already
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/f3c6c7cd51814e26.
Report an issue: GitHub.