From a4f58511f8adf53ace6403588fad391f5e813d94 Mon Sep 17 00:00:00 2001 From: atomiczsec <75549184+atomiczsec@users.noreply.github.com> Date: Sun, 16 Nov 2025 11:33:54 -0500 Subject: [PATCH] Fix retrieveResponseDetails structure --- src/main/java/burp/RequestSender.java | 48 ++++++++++----------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/burp/RequestSender.java b/src/main/java/burp/RequestSender.java index ed66a9f..a575b41 100644 --- a/src/main/java/burp/RequestSender.java +++ b/src/main/java/burp/RequestSender.java @@ -405,42 +405,27 @@ private static URL createNewURLWithSegment(URL orgURL, String additional, String * Uses Caffeine cache for high-performance caching with TTL. */ protected static Map retrieveResponseDetails(IHttpService service, byte[] request) { + return retrieveResponseDetails(service, request, 0); + } + + private static Map retrieveResponseDetails(IHttpService service, byte[] request, int retryCount) { String hostKey = service.getHost(); - String cacheKey = service.toString() + Arrays.hashCode(request); + String cacheKey = buildServiceCacheKey(service, request); - for (int attempt = 0; attempt < MAX_RETRIES; attempt++) { + for (int attempt = retryCount; attempt < MAX_RETRIES; attempt++) { try { + // Check circuit breaker before doing any work if (isCircuitOpen(hostKey)) { BurpExtender.logDebug("Circuit breaker open for " + hostKey); return null; } - return retrieveResponseDetails(service, request, 0); - } - - private static Map retrieveResponseDetails(IHttpService service, byte[] request, int retryCount) { - try { - String hostKey = service.getHost(); - String cacheKey = buildServiceCacheKey(service, request); - - // Check circuit breaker - if (isCircuitOpen(hostKey)) { - BurpExtender.logDebug("Circuit breaker open for " + hostKey); - return null; - } - - // Rate limiting - if (!checkRateLimit(hostKey)) { - try { Thread.sleep(100); } catch (InterruptedException ignored) {} - } - - // Check cache first - Map cached = RESPONSE_CACHE.getIfPresent(cacheKey); - if (cached != null) { - return cached; - } - waitForRateLimit(hostKey); + // Respect host-level rate limiting + if (!checkRateLimit(hostKey)) { + waitForRateLimit(hostKey); + } + // Serve from cache when possible Map cached = RESPONSE_CACHE.getIfPresent(cacheKey); if (cached != null) { return cached; @@ -457,9 +442,8 @@ private static Map retrieveResponseDetails(IHttpService service, recordFailure(hostKey); if (attempt < MAX_RETRIES - 1) { sleepRespectingInterrupts(calculateRetryDelay(attempt)); - continue; } - return null; + continue; } IResponseInfo responseInfo = BurpExtender.getHelpers().analyzeResponse(response.getResponse()); @@ -468,8 +452,10 @@ private static Map retrieveResponseDetails(IHttpService service, details.put("headers", responseInfo.getHeaders()); details.put("responseTime", responseTime); - byte[] responseBody = java.util.Arrays.copyOfRange(response.getResponse(), - responseInfo.getBodyOffset(), response.getResponse().length); + byte[] responseBody = java.util.Arrays.copyOfRange( + response.getResponse(), + responseInfo.getBodyOffset(), + response.getResponse().length); details.put("body", responseBody); if (responseInfo.getStatusCode() >= 200 && responseInfo.getStatusCode() < 500) {