[
https://issues.apache.org/jira/browse/CXF-6189?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14271583#comment-14271583
]
Lucas Pouzac commented on CXF-6189:
-----------------------------------
The best solution for decodeUrl seems to be
urlDecodeAsApacheCodecWithByteBufferAndCharBuffer as below.
It's a same solution that Apache Commons Codec 1.10 except I replace
ByteArrayOuptutStream by ByteBuffer and CharBuffer.
{code:java}
/**
* Radix used in encoding and decoding.
*/
static final int RADIX = 16;
protected static final byte ESCAPE_CHAR = '%';
public static String urlDecode(String value) {
return urlDecode(value, "UTF-8");
}
public static String urlDecode(String value, String enc) {
if (value == null) {
return null;
}
return
Charset.forName(enc).decode(urlDecode(CharBuffer.wrap(value))).toString();
}
public static final ByteBuffer urlDecode(CharBuffer in) {
ByteBuffer buffer = ByteBuffer.allocate(in.capacity());
while (in.hasRemaining()) {
final int b = in.get();
if (b == '+') {
buffer.put((byte) ' ');
} else if (b == ESCAPE_CHAR) {
try {
final int u = digit16((byte) in.get());
final int l = digit16((byte) in.get());
buffer.put((byte) ((u << 4) + l));
} catch (final ArrayIndexOutOfBoundsException e) {
throw new RuntimeException("Invalid URL encoding: ", e);
}
} else {
buffer.put((byte) b);
}
}
buffer.flip();
return buffer;
}
public static int digit16(final byte b) {
final int i = Character.digit((char) b, RADIX);
if (i == -1) {
throw new RuntimeException("Invalid URL encoding: not a valid digit
(radix " + RADIX + "): " + b);
}
return i;
}
{code}
It would still avoid the call if the characters '%' and '+' are not present.
Regards
> Improve memory usage of UrlUtils
> --------------------------------
>
> Key: CXF-6189
> URL: https://issues.apache.org/jira/browse/CXF-6189
> Project: CXF
> Issue Type: Bug
> Components: Core
> Affects Versions: 3.0.3
> Reporter: Lucas Pouzac
> Labels: performance
> Attachments: jmh.tar.gz, screenshot-1.png
>
>
> When I run load test, I find that the management of encoding parameters of
> the urls is consumer memory.
> I do not know if it is possible to optimize this part.
> Throughput of load test : 400 query/s
> ~80% GET query with 6 parameters
> ~20% POST query with 6 parameters GET and 1 payload
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)