Skip to content

Commit 7518dbc

Browse files
authored
Merge pull request #5726 from thc202/exim/base64-response
exim: base64 decode the HAR response body
2 parents 509acf8 + 74a1ca2 commit 7518dbc

File tree

5 files changed

+83
-2
lines changed

5 files changed

+83
-2
lines changed

addOns/exim/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
99

1010
### Fixed
1111
- Correctly load Automation Framework template plans.
12+
- Base64 decode the response body when importing HARs.
1213

1314
## [0.10.0] - 2024-07-22
1415
### Changed

addOns/exim/src/main/java/org/zaproxy/addon/exim/har/HarImporter.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import de.sstoehr.harreader.model.HarResponse;
2929
import java.io.File;
3030
import java.util.ArrayList;
31+
import java.util.Base64;
3132
import java.util.List;
3233
import java.util.function.Predicate;
3334
import java.util.stream.Collectors;
@@ -46,7 +47,6 @@
4647
import org.parosproxy.paros.network.HttpResponseHeader;
4748
import org.zaproxy.addon.commonlib.ui.ProgressPaneListener;
4849
import org.zaproxy.addon.exim.ExtensionExim;
49-
import org.zaproxy.zap.network.HttpResponseBody;
5050
import org.zaproxy.zap.utils.Stats;
5151
import org.zaproxy.zap.utils.ThreadUtils;
5252

@@ -253,7 +253,19 @@ private static void setHttpResponse(HarResponse harResponse, HttpMessage message
253253
}
254254
message.setResponseFromTargetHost(true);
255255
if (harContent != null) {
256-
message.setResponseBody(new HttpResponseBody(harContent.getText()));
256+
if ("base64".equals(harContent.getEncoding())) {
257+
var text = harContent.getText();
258+
if (text != null)
259+
try {
260+
message.setResponseBody(Base64.getDecoder().decode(text));
261+
} catch (IllegalArgumentException e) {
262+
LOGGER.debug(
263+
"Failed to base64 decode body {}. Setting as plain text.", text, e);
264+
message.setResponseBody(text);
265+
}
266+
} else {
267+
message.setResponseBody(harContent.getText());
268+
}
257269
}
258270
}
259271

addOns/exim/src/test/java/org/zaproxy/addon/exim/har/HarImporterUnitTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,28 @@ void shouldSkipLocalPrivate() throws Exception {
335335
is(equalTo("Skipping local private entry: about:blank")));
336336
}
337337

338+
@Test
339+
void shouldBase64DecodeResponseBody() throws Exception {
340+
// Given
341+
HarLog harLog = getHarLog("response-base64.har", "");
342+
// When
343+
List<HttpMessage> messages = HarImporter.getHttpMessages(harLog);
344+
// Then
345+
assertThat(messages, hasSize(1));
346+
assertThat(messages.get(0).getResponseBody().toString(), is(equalTo("1234")));
347+
}
348+
349+
@Test
350+
void shouldFallbackToPlainTextOnMalformedBase64ResponseBody() throws Exception {
351+
// Given
352+
HarLog harLog = getHarLog("response-base64-invalid.har", "");
353+
// When
354+
List<HttpMessage> messages = HarImporter.getHttpMessages(harLog);
355+
// Then
356+
assertThat(messages, hasSize(1));
357+
assertThat(messages.get(0).getResponseBody().toString(), is(equalTo("Not base 64")));
358+
}
359+
338360
private HarLog getHarLog(String path, String replacement) throws HarReaderException {
339361
return new HarReader()
340362
.readFromString(getHtml(path, Map.of(PLACEHOLDER, replacement)))
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"log": {
3+
"version": "1.2",
4+
"entries": [
5+
{
6+
"request": {
7+
"method": "GET",
8+
"url": "http://example.com/",
9+
"httpVersion": "HTTP/1.1"
10+
},
11+
"response": {
12+
"status": 200,
13+
"statusText": "OK",
14+
"httpVersion": "HTTP/1.1",
15+
"content": {
16+
"encoding": "base64",
17+
"text": "Not base 64"
18+
}
19+
}
20+
}
21+
]
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"log": {
3+
"version": "1.2",
4+
"entries": [
5+
{
6+
"request": {
7+
"method": "GET",
8+
"url": "http://example.com/",
9+
"httpVersion": "HTTP/1.1"
10+
},
11+
"response": {
12+
"status": 200,
13+
"statusText": "OK",
14+
"httpVersion": "HTTP/1.1",
15+
"content": {
16+
"encoding": "base64",
17+
"text": "MTIzNA=="
18+
}
19+
}
20+
}
21+
]
22+
}
23+
}

0 commit comments

Comments
 (0)