|
22 | 22 | import java.util.ArrayList; |
23 | 23 | import java.util.Base64; |
24 | 24 | import java.util.BitSet; |
| 25 | +import java.util.HexFormat; |
25 | 26 | import java.util.List; |
26 | 27 | import java.util.Locale; |
27 | 28 | import java.util.regex.Matcher; |
@@ -60,6 +61,8 @@ public final class ContentDisposition { |
60 | 61 |
|
61 | 62 | private static final BitSet PRINTABLE = new BitSet(256); |
62 | 63 |
|
| 64 | + private static final HexFormat HEX_FORMAT = HexFormat.of().withUpperCase(); |
| 65 | + |
63 | 66 |
|
64 | 67 | static { |
65 | 68 | // RFC 2045, Section 6.7, and RFC 2047, Section 4.2 |
@@ -385,9 +388,10 @@ private static String decodeRfc5987Filename(String filename, Charset charset) { |
385 | 388 | index++; |
386 | 389 | } |
387 | 390 | else if (b == '%' && index < value.length - 2) { |
388 | | - char[] array = new char[]{(char) value[index + 1], (char) value[index + 2]}; |
389 | 391 | try { |
390 | | - baos.write(Integer.parseInt(String.valueOf(array), 16)); |
| 392 | + int high = HexFormat.fromHexDigit(value[index + 1]); |
| 393 | + int low = HexFormat.fromHexDigit(value[index + 2]); |
| 394 | + baos.write(high << 4 | low); |
391 | 395 | } |
392 | 396 | catch (NumberFormatException ex) { |
393 | 397 | throw new IllegalArgumentException(INVALID_HEADER_FIELD_PARAMETER_FORMAT, ex); |
@@ -428,11 +432,8 @@ private static String decodeQuotedPrintableFilename(String filename, Charset cha |
428 | 432 | index++; |
429 | 433 | } |
430 | 434 | else if (b == '=' && index < value.length - 2) { |
431 | | - int i1 = Character.digit((char) value[index + 1], 16); |
432 | | - int i2 = Character.digit((char) value[index + 2], 16); |
433 | | - if (i1 == -1 || i2 == -1) { |
434 | | - throw new IllegalArgumentException("Not a valid hex sequence: " + filename.substring(index)); |
435 | | - } |
| 435 | + int i1 = HexFormat.fromHexDigit(value[index + 1]); |
| 436 | + int i2 = HexFormat.fromHexDigit(value[index + 2]); |
436 | 437 | baos.write((i1 << 4) | i2); |
437 | 438 | index += 3; |
438 | 439 | } |
@@ -469,10 +470,7 @@ else if (isPrintable(b)) { |
469 | 470 | } |
470 | 471 | else { |
471 | 472 | sb.append('='); |
472 | | - char ch1 = hexDigit(b >> 4); |
473 | | - char ch2 = hexDigit(b); |
474 | | - sb.append(ch1); |
475 | | - sb.append(ch2); |
| 473 | + HEX_FORMAT.toHexDigits(sb, b); |
476 | 474 | } |
477 | 475 | } |
478 | 476 | sb.append("?="); |
@@ -546,21 +544,12 @@ private static String encodeRfc5987Filename(String input, Charset charset) { |
546 | 544 | } |
547 | 545 | else { |
548 | 546 | sb.append('%'); |
549 | | - char hex1 = hexDigit(b >> 4); |
550 | | - char hex2 = hexDigit(b); |
551 | | - sb.append(hex1); |
552 | | - sb.append(hex2); |
| 547 | + HEX_FORMAT.toHexDigits(sb, b); |
553 | 548 | } |
554 | 549 | } |
555 | 550 | return sb.toString(); |
556 | 551 | } |
557 | 552 |
|
558 | | - private static char hexDigit(int b) { |
559 | | - return Character.toUpperCase(Character.forDigit(b & 0xF, 16)); |
560 | | - } |
561 | | - |
562 | | - |
563 | | - |
564 | 553 | /** |
565 | 554 | * A mutable builder for {@code ContentDisposition}. |
566 | 555 | */ |
|
0 commit comments