mirror of
https://github.com/silkimen/cordova-plugin-advanced-http.git
synced 2026-02-11 00:00:06 +08:00
56 lines
1.8 KiB
Java
56 lines
1.8 KiB
Java
package com.silkimen.http;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.charset.CharacterCodingException;
|
|
import java.nio.charset.Charset;
|
|
import java.nio.charset.CharsetDecoder;
|
|
import java.nio.charset.CodingErrorAction;
|
|
import java.nio.charset.MalformedInputException;
|
|
|
|
public class HttpBodyDecoder {
|
|
private static final String[] ACCEPTED_CHARSETS = new String[] { "UTF-8", "ISO-8859-1" };
|
|
|
|
public static String decodeBody(byte[] body, String charsetName)
|
|
throws CharacterCodingException, MalformedInputException {
|
|
|
|
return decodeBody(ByteBuffer.wrap(body), charsetName);
|
|
}
|
|
|
|
public static String decodeBody(ByteBuffer body, String charsetName)
|
|
throws CharacterCodingException, MalformedInputException {
|
|
|
|
if (charsetName == null) {
|
|
return tryDecodeByteBuffer(body);
|
|
} else {
|
|
return decodeByteBuffer(body, charsetName);
|
|
}
|
|
}
|
|
|
|
private static String tryDecodeByteBuffer(ByteBuffer buffer)
|
|
throws CharacterCodingException, MalformedInputException {
|
|
|
|
for (int i = 0; i < ACCEPTED_CHARSETS.length - 1; i++) {
|
|
try {
|
|
return decodeByteBuffer(buffer, ACCEPTED_CHARSETS[i]);
|
|
} catch (MalformedInputException e) {
|
|
continue;
|
|
} catch (CharacterCodingException e) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return decodeBody(buffer, ACCEPTED_CHARSETS[ACCEPTED_CHARSETS.length - 1]);
|
|
}
|
|
|
|
private static String decodeByteBuffer(ByteBuffer buffer, String charsetName)
|
|
throws CharacterCodingException, MalformedInputException {
|
|
|
|
return createCharsetDecoder(charsetName).decode(buffer).toString();
|
|
}
|
|
|
|
private static CharsetDecoder createCharsetDecoder(String charsetName) {
|
|
return Charset.forName(charsetName).newDecoder().onMalformedInput(CodingErrorAction.REPORT)
|
|
.onUnmappableCharacter(CodingErrorAction.REPORT);
|
|
}
|
|
}
|