Skip to content

Commit ba63bab

Browse files
committed
remove json parse in buildHeadersMap function
1 parent ea12899 commit ba63bab

File tree

1 file changed

+54
-7
lines changed

1 file changed

+54
-7
lines changed

libs/dao/src/main/java/com/akto/dto/OriginalHttpRequest.java

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import com.akto.dto.testing.TLSAuthParam;
44
import com.akto.dto.type.RequestTemplate;
55
import com.akto.util.HttpRequestResponseUtils;
6-
import com.alibaba.fastjson2.JSON;
6+
import com.fasterxml.jackson.core.JsonFactory;
7+
import com.fasterxml.jackson.core.JsonParser;
8+
import com.fasterxml.jackson.core.JsonToken;
79
import com.google.gson.Gson;
810
import com.mongodb.BasicDBObject;
911

12+
import java.io.IOException;
1013
import java.util.stream.Collectors;
1114
import lombok.Getter;
1215
import lombok.Setter;
@@ -19,6 +22,7 @@
1922
public class OriginalHttpRequest {
2023

2124
private static final Gson gson = new Gson();
25+
private static final JsonFactory JSON_FACTORY = new JsonFactory();
2226
private String url;
2327
private String type;
2428
private String queryParams;
@@ -242,17 +246,60 @@ public static Map<String,List<String>> buildHeadersMap(Map json, String key) {
242246
}
243247

244248
public static Map<String,List<String>> buildHeadersMap(String headersString) {
245-
Map headersFromRequest = JSON.parseObject(headersString);
246249
Map<String,List<String>> headers = new HashMap<>();
247-
if (headersFromRequest == null) return headers;
248-
for (Object k: headersFromRequest.keySet()) {
249-
List<String> values = headers.getOrDefault(k,new ArrayList<>());
250-
values.add(headersFromRequest.get(k).toString());
251-
headers.put(k.toString().toLowerCase(),values);
250+
if (headersString == null || headersString.isEmpty()) return headers;
251+
252+
try (JsonParser p = JSON_FACTORY.createParser(headersString)) {
253+
// Expect a single JSON object
254+
if (p.nextToken() != JsonToken.START_OBJECT) return headers;
255+
256+
String currentKey = null;
257+
while (p.nextToken() != JsonToken.END_OBJECT) {
258+
JsonToken t = p.currentToken();
259+
260+
if (t == JsonToken.FIELD_NAME) {
261+
currentKey = p.getCurrentName();
262+
} else if (currentKey != null) {
263+
// Capture any JSON value as a String
264+
String value = tokenToString(p, t);
265+
String keyLower = currentKey.toLowerCase();
266+
List<String> values = headers.get(keyLower);
267+
if (values == null) {
268+
values = new ArrayList<>(1);
269+
headers.put(keyLower, values);
270+
}
271+
values.add(value);
272+
currentKey = null;
273+
}
274+
}
275+
} catch (IOException e) {
276+
// Return empty map on parse failure
277+
return new HashMap<>();
252278
}
279+
253280
return headers;
254281
}
255282

283+
private static String tokenToString(JsonParser p, JsonToken t) throws IOException {
284+
switch (t) {
285+
case VALUE_STRING:
286+
return p.getValueAsString(); // already unescaped
287+
case VALUE_NUMBER_INT:
288+
case VALUE_NUMBER_FLOAT:
289+
case VALUE_TRUE:
290+
case VALUE_FALSE:
291+
return p.getText(); // numeric or boolean literal text
292+
case VALUE_NULL:
293+
return "null";
294+
case START_ARRAY:
295+
case START_OBJECT:
296+
// If nested occurs by mistake, read it as compact JSON text
297+
return p.readValueAsTree().toString();
298+
default:
299+
return p.getText(); // fallback
300+
}
301+
}
302+
256303
public void addHeaderFromLine(String line) {
257304
if (this.headers == null || this.headers.isEmpty()) {
258305
this.headers = new HashMap<>();

0 commit comments

Comments
 (0)