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

  1. Ensure every parameter after ';' has the form name=value
  2. Remove the trailing ';' if no parameter follows
  3. 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

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

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/437a4ed610dd8c90. Report an issue: GitHub.