|
3 | 3 | import com.akto.dto.testing.TLSAuthParam; |
4 | 4 | import com.akto.dto.type.RequestTemplate; |
5 | 5 | 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; |
7 | 9 | import com.google.gson.Gson; |
8 | 10 | import com.mongodb.BasicDBObject; |
9 | 11 |
|
| 12 | +import java.io.IOException; |
10 | 13 | import java.util.stream.Collectors; |
11 | 14 | import lombok.Getter; |
12 | 15 | import lombok.Setter; |
|
19 | 22 | public class OriginalHttpRequest { |
20 | 23 |
|
21 | 24 | private static final Gson gson = new Gson(); |
| 25 | + private static final JsonFactory JSON_FACTORY = new JsonFactory(); |
22 | 26 | private String url; |
23 | 27 | private String type; |
24 | 28 | private String queryParams; |
@@ -242,17 +246,60 @@ public static Map<String,List<String>> buildHeadersMap(Map json, String key) { |
242 | 246 | } |
243 | 247 |
|
244 | 248 | public static Map<String,List<String>> buildHeadersMap(String headersString) { |
245 | | - Map headersFromRequest = JSON.parseObject(headersString); |
246 | 249 | 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<>(); |
252 | 278 | } |
| 279 | + |
253 | 280 | return headers; |
254 | 281 | } |
255 | 282 |
|
| 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 | + |
256 | 303 | public void addHeaderFromLine(String line) { |
257 | 304 | if (this.headers == null || this.headers.isEmpty()) { |
258 | 305 | this.headers = new HashMap<>(); |
|
0 commit comments