quarkusio/quarkus · warning · BadRequestException
Malformed parameters:
Error message
Malformed parameters:
What it means
parseParameters() parses name=value pairs after a ';' in a media-type item. If it cannot find an '=' for the next parameter, the parameters section is malformed and this BadRequestException is thrown.
Source
Thrown at independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/request/AcceptHeaders.java:170
parameters = new LinkedHashMap<String, String>();
offset = parseParameters(parameters, header, offset);
qualityValue = evaluateAcceptParameters(parameters);
} else {
subtype = header.substring(offset, itemEndIndex);
offset = itemEndIndex + 1;
}
result.put(new MediaType(type.trim(), subtype.trim(), parameters), qualityValue);
}
//LogMessages.LOGGER.debug(result.toString());
return result;
}
private static int parseParameters(Map<String, String> parameters, String header, int offset) {
while (true) {
int equalsIndex = header.indexOf('=', offset);
if (equalsIndex < 0)
throw new BadRequestException("Malformed parameters: " + header);
String name = header.substring(offset, equalsIndex).trim();
offset = equalsIndex + 1;
if (header.charAt(offset) == '"') {
int end = offset;
++offset;
do {
end = header.indexOf('"', ++end);
if (end < 0)
throw new BadRequestException("Unclosed quotes:" + header);
} while (header.charAt(end - 1) == '\\');
String value = header.substring(offset, end);
parameters.put(name, value);
offset = end + 1;
int parameterEndIndex = header.indexOf(';', offset);
int itemEndIndex = header.indexOf(',', offset);
if (parameterEndIndex == itemEndIndex) {
assert itemEndIndex == -1;View on GitHub (pinned to e1c734241f)
Solutions
- Ensure every parameter after ';' has the form name=value
- Remove the trailing ';' if no parameter follows
- Inspect intermediary proxies that may truncate header values
Example fix
// before Accept: text/html;charset // after Accept: text/html;charset=utf-8
Defensive patterns
Strategy: validation
Validate before calling
boolean parametersAreKeyValuePairs(String item) {
String[] parts = item.split(";");
for (int i = 1; i < parts.length; i++) {
String p = parts[i].trim();
if (!p.contains("=")) return false;
}
return true;
} Type guard
boolean hasWellFormedParams(String header) {
return header != null && java.util.Arrays.stream(header.split(","))
.allMatch(this::parametersAreKeyValuePairs);
} Try / catch
try {
types = AcceptHeaders.getMediaTypeQualityValues(accept);
} catch (BadRequestException e) {
log.warn("Malformed Accept parameters: " + accept);
types = Collections.emptyMap();
} Prevention
- Never emit a trailing ';' in a media-type item
- Always pair parameter names with values (name=value)
- Strip empty parameter segments when building headers programmatically
When it happens
Trigger: Accept headers with dangling parameters, e.g. 'application/json;' or 'text/html;charset' (name without =value).
Common situations: Truncated headers from proxies or load balancers; manual header editing mistakes; template strings where the value part was never filled in.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- param was null
- Param was null
- Does not support fromString
- Unsupported parameter:
- Empty Field in header:
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/437a4ed610dd8c90.
Report an issue: GitHub.