@@ -53,7 +53,7 @@ public final class ContentDisposition {
53
53
Pattern .compile ("=\\ ?([0-9a-zA-Z-_]+)\\ ?B\\ ?([+/0-9a-zA-Z]+=*)\\ ?=" );
54
54
55
55
private final static Pattern QUOTED_PRINTABLE_ENCODED_PATTERN =
56
- Pattern .compile ("=\\ ?([0-9a-zA-Z-_]+)\\ ?Q\\ ?(\\ p{Print} +)\\ ?=" );
56
+ Pattern .compile ("=\\ ?([0-9a-zA-Z-_]+)\\ ?Q\\ ?([!->@-~] +)\\ ?=" ); // Printable ASCII other than "?" or SPACE
57
57
58
58
private static final String INVALID_HEADER_FIELD_PARAMETER_FORMAT =
59
59
"Invalid header field parameter format (as defined in RFC 5987)" ;
@@ -375,22 +375,29 @@ else if (attribute.equals("filename") && (filename == null)) {
375
375
if (value .startsWith ("=?" ) ) {
376
376
Matcher matcher = BASE64_ENCODED_PATTERN .matcher (value );
377
377
if (matcher .find ()) {
378
- charset = Charset .forName (matcher .group (1 ));
379
- String encodedValue = matcher .group (2 );
380
- StringBuilder sb = new StringBuilder (new String (Base64 .getDecoder ().decode (encodedValue ), charset ));
381
- while (matcher .find ()){
378
+ Base64 .Decoder decoder = Base64 .getDecoder ();
379
+ StringBuilder builder = new StringBuilder ();
380
+ do {
382
381
charset = Charset .forName (matcher .group (1 ));
383
- encodedValue = matcher .group (2 );
384
- sb .append (new String (Base64 . getDecoder (). decode ( encodedValue ) , charset ));
382
+ byte [] decoded = decoder . decode ( matcher .group (2 ) );
383
+ builder .append (new String (decoded , charset ));
385
384
}
386
- filename = sb .toString ();
385
+ while (matcher .find ());
386
+
387
+ filename = builder .toString ();
387
388
}
388
389
else {
389
390
matcher = QUOTED_PRINTABLE_ENCODED_PATTERN .matcher (value );
390
391
if (matcher .find ()) {
391
- charset = Charset .forName (matcher .group (1 ));
392
- String encodedValue = matcher .group (2 );
393
- filename = decodeQuotedPrintableFilename (encodedValue , charset );
392
+ StringBuilder builder = new StringBuilder ();
393
+ do {
394
+ charset = Charset .forName (matcher .group (1 ));
395
+ String decoded = decodeQuotedPrintableFilename (matcher .group (2 ), charset );
396
+ builder .append (decoded );
397
+ }
398
+ while (matcher .find ());
399
+
400
+ filename = builder .toString ();
394
401
}
395
402
else {
396
403
filename = value ;
0 commit comments