Skip to content
Merged
Show file tree
Hide file tree
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
30 changes: 29 additions & 1 deletion zap/src/main/java/org/parosproxy/paros/network/HttpMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,11 @@ public class HttpMessage implements Message {
body.setContentEncodings(encodings);
};

private static final CharsetProvider DEFAULT_CHARSET_PROVIDER =
(header, body) -> header.getCharset();

private static HttpEncodingsHandler contentEncodingsHandler;
private static CharsetProvider charsetProvider;

private HttpRequestHeader mReqHeader = new HttpRequestHeader();
private HttpRequestBody mReqBody = new HttpRequestBody();
Expand Down Expand Up @@ -508,7 +512,7 @@ public void setRequestBody(byte[] body) {
}

private static void setBodyCharset(HttpBody body, HttpHeader header) {
String charset = header.getCharset();
String charset = getCharset(header, body);
body.setCharset(charset);

if (charset != null
Expand All @@ -524,6 +528,25 @@ private static void setBodyCharset(HttpBody body, HttpHeader header) {
}
}

/**
* Sets the provider of charset.
*
* <p><strong>Note:</strong> Not part of the public API.
*
* @param provider the provider.
*/
public static void setCharsetProvider(CharsetProvider provider) {
charsetProvider = provider;
}

private static String getCharset(HttpHeader header, HttpBody body) {
var localProvider = charsetProvider;
if (localProvider == null) {
localProvider = DEFAULT_CHARSET_PROVIDER;
}
return localProvider.get(header, body);
}

/**
* Resets the set of warned content-type values.
*
Expand Down Expand Up @@ -1327,4 +1350,9 @@ public interface HttpEncodingsHandler {

void handle(HttpHeader header, HttpBody body);
}

/** <strong>Note:</strong> Not part of the public API. */
public interface CharsetProvider {
String get(HttpHeader header, HttpBody body);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class HttpMessageUnitTest {
@AfterEach
void cleanUp() throws Exception {
HttpMessage.setContentEncodingsHandler(null);
HttpMessage.setCharsetProvider(null);
HttpMessage.resetWarnedContentTypeValues();
Configurator.reconfigure(getClass().getResource("/log4j2-test.properties").toURI());
}
Expand Down Expand Up @@ -586,6 +587,19 @@ void shouldNotBeWebSocketUpgradeIfResponseMissUpgradeHeader() throws Exception {
assertThat(webSocketUpgrade, is(equalTo(false)));
}

@Test
void shouldUseCharsetProviderWhenSettingRequestBody() {
// Given
HttpMessage.setCharsetProvider((header, body) -> "UTF-16BE");
HttpMessage message = new HttpMessage();
withLoggerAppender();
// When
message.setRequestBody("");
// Then
assertThat(message.getRequestBody().getCharset(), is(equalTo("UTF-16BE")));
assertThat(testAppender.getLogEvents(), hasSize(0));
}

@ParameterizedTest
@MethodSource(value = "setBodyData")
void shouldUseContentTypeCharsetWhenSettingRequestBody(
Expand Down Expand Up @@ -698,6 +712,19 @@ static Stream<Arguments> getNonPostMethods() {
.map(Arguments::arguments);
}

@Test
void shouldUseCharsetProviderWhenSettingResponseBody() {
// Given
HttpMessage.setCharsetProvider((header, body) -> "UTF-16LE");
HttpMessage message = new HttpMessage();
withLoggerAppender();
// When
message.setResponseBody("");
// Then
assertThat(message.getResponseBody().getCharset(), is(equalTo("UTF-16LE")));
assertThat(testAppender.getLogEvents(), hasSize(0));
}

@ParameterizedTest
@MethodSource(value = "setBodyData")
void shouldUseContentTypeCharsetWhenSettingResponseBody(
Expand Down
Loading