Returns a URI-decoded token. @param token encoded token @return decoded token
(final byte[] token)
| 412 | * @return decoded token |
| 413 | */ |
| 414 | public static byte[] decodeUri(final byte[] token) { |
| 415 | final int tl = token.length; |
| 416 | final TokenBuilder tb = new TokenBuilder(tl); |
| 417 | for(int t = 0; t < tl; t++) { |
| 418 | int b = token[t]; |
| 419 | if(b == '+') { |
| 420 | b = ' '; |
| 421 | } else if(b == '%') { |
| 422 | final int b1 = ++t < tl ? dec(token[t]) : -1, b2 = ++t < tl ? dec(token[t]) : -1; |
| 423 | b = b1 != -1 && b2 != -1 ? b1 << 4 | b2 : -1; |
| 424 | } |
| 425 | if(b == -1) tb.add(Token.REPLACEMENT); |
| 426 | else tb.addByte((byte) b); |
| 427 | } |
| 428 | |
| 429 | Token.string(tb.next()).codePoints().forEach(cp -> |
| 430 | tb.add(XMLToken.valid(cp) ? cp : Token.REPLACEMENT) |
| 431 | ); |
| 432 | return tb.finish(); |
| 433 | } |
| 434 | |
| 435 | /** |
| 436 | * URI-decodes a string. |
no test coverage detected