Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion src/main/java/burp/RequestSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ protected static Map<String, Object> retrieveResponseDetails(IHttpService servic
private static Map<String, Object> retrieveResponseDetails(IHttpService service, byte[] request, int retryCount) {
try {
String hostKey = service.getHost();
String cacheKey = service.toString() + Arrays.hashCode(request);
String cacheKey = buildServiceCacheKey(service, request);

// Check circuit breaker
if (isCircuitOpen(hostKey)) {
Expand Down Expand Up @@ -459,6 +459,28 @@ private static Map<String, Object> retrieveResponseDetails(IHttpService service,
return null;
}
}

/**
* Builds a cache key that normalizes the service attributes (protocol, host, port)
* and appends the request hash. This ensures equivalent services share cache
* entries while keeping cache growth in check.
*/
private static String buildServiceCacheKey(IHttpService service, byte[] request) {
String protocol = service.getProtocol() != null
? service.getProtocol().toLowerCase(Locale.ROOT)
: "http";
String host = service.getHost() != null
? service.getHost().toLowerCase(Locale.ROOT)
: "";
int port = service.getPort();

if (port <= 0) {
port = "https".equals(protocol) ? 443 : 80;
}

String serviceKey = protocol + "://" + host + ":" + port;
return serviceKey + "|" + Arrays.hashCode(request);
}

private static boolean isCircuitOpen(String hostKey) {
AtomicInteger failures = FAILURE_COUNTS.computeIfAbsent(hostKey, k -> new AtomicInteger(0));
Expand Down