Skip to content

Commit 76049c8

Browse files
committed
refactor: Address SonarQube findings on body parsing helpers
- ContentTypeHeader.parameter: replace dual-continue loop with a single early-return guarded by an inline key check; extract quote-stripping into a small unquote() helper. - FormUrlEncodedParser.decodeComponent: chain the original IllegalArgumentException via initCause() on the rethrown ValidationException so the underlying cause is preserved. - FormUrlEncodedParser.addEntry: replace get()+null-check+put() with Map.merge(), which is the right primitive for collision handling. - TextPlainParserTest: use isEmpty() instead of isEqualTo("").
1 parent 59eede4 commit 76049c8

3 files changed

Lines changed: 33 additions & 32 deletions

File tree

src/main/java/com/retailsvc/http/internal/ContentTypeHeader.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,21 @@ public static Optional<String> parameter(String header, String name) {
3131
if (semi < 0) {
3232
return Optional.empty();
3333
}
34-
String[] parts = header.substring(semi + 1).split(";");
35-
for (String p : parts) {
34+
for (String p : header.substring(semi + 1).split(";")) {
3635
String trimmed = p.trim();
3736
int eq = trimmed.indexOf('=');
38-
if (eq <= 0) {
39-
continue;
37+
String key = (eq <= 0) ? "" : trimmed.substring(0, eq).trim().toLowerCase(Locale.ROOT);
38+
if (key.equals(target)) {
39+
return Optional.of(unquote(trimmed.substring(eq + 1).trim()));
4040
}
41-
String key = trimmed.substring(0, eq).trim().toLowerCase(Locale.ROOT);
42-
if (!key.equals(target)) {
43-
continue;
44-
}
45-
String value = trimmed.substring(eq + 1).trim();
46-
if (value.length() >= 2 && value.startsWith("\"") && value.endsWith("\"")) {
47-
value = value.substring(1, value.length() - 1);
48-
}
49-
return Optional.of(value);
5041
}
5142
return Optional.empty();
5243
}
44+
45+
private static String unquote(String value) {
46+
if (value.length() >= 2 && value.startsWith("\"") && value.endsWith("\"")) {
47+
return value.substring(1, value.length() - 1);
48+
}
49+
return value;
50+
}
5351
}

src/main/java/com/retailsvc/http/internal/FormUrlEncodedParser.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,31 @@ private static String decodeComponent(String value, Charset charset) {
4444
try {
4545
return URLDecoder.decode(value, charset);
4646
} catch (IllegalArgumentException ex) {
47-
throw new ValidationException(
48-
new ValidationError(
49-
"/body", "decode", "malformed form URL encoding: " + ex.getMessage(), value));
47+
ValidationException ve =
48+
new ValidationException(
49+
new ValidationError(
50+
"/body", "decode", "malformed form URL encoding: " + ex.getMessage(), value));
51+
ve.initCause(ex);
52+
throw ve;
5053
}
5154
}
5255

5356
private static void addEntry(Map<String, Object> out, String key, String value) {
54-
Object existing = out.get(key);
55-
if (existing == null) {
56-
out.put(key, value);
57-
return;
58-
}
59-
if (existing instanceof List<?> list) {
60-
@SuppressWarnings("unchecked")
61-
List<String> typed = (List<String>) list;
62-
typed.add(value);
63-
return;
64-
}
65-
List<String> list = new ArrayList<>();
66-
list.add((String) existing);
67-
list.add(value);
68-
out.put(key, list);
57+
out.merge(
58+
key,
59+
value,
60+
(existing, incoming) -> {
61+
if (existing instanceof List<?> list) {
62+
@SuppressWarnings("unchecked")
63+
List<String> typed = (List<String>) list;
64+
typed.add((String) incoming);
65+
return typed;
66+
}
67+
List<String> merged = new ArrayList<>();
68+
merged.add((String) existing);
69+
merged.add((String) incoming);
70+
return merged;
71+
});
6972
}
7073

7174
/** Returns the parsed map after coercing field values against the given body schema. */

src/test/java/com/retailsvc/http/internal/TextPlainParserTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void respectsCharsetFromHeader() {
2424

2525
@Test
2626
void emptyBodyDecodesToEmptyString() {
27-
assertThat(parser.parse(new byte[0], null)).isEqualTo("");
27+
assertThat(parser.parse(new byte[0], null)).isEmpty();
2828
}
2929

3030
@Test

0 commit comments

Comments
 (0)