@@ -434,11 +434,11 @@ private String canonicalize(boolean coordinatesOnly) {
434
434
}
435
435
purl .append ("/" );
436
436
if (namespace != null ) {
437
- purl .append (encodePath (namespace ));
437
+ purl .append (encodePath (namespace , ":" ));
438
438
purl .append ("/" );
439
439
}
440
440
if (name != null ) {
441
- purl .append (percentEncode (name ));
441
+ purl .append (percentEncode (name , ":" ));
442
442
}
443
443
if (version != null ) {
444
444
purl .append ("@" ).append (percentEncode (version ));
@@ -449,36 +449,44 @@ private String canonicalize(boolean coordinatesOnly) {
449
449
qualifiers .entrySet ().stream ().forEachOrdered ((entry ) -> {
450
450
purl .append (entry .getKey ().toLowerCase ());
451
451
purl .append ("=" );
452
- purl .append (percentEncode (entry .getValue ()));
452
+ purl .append (percentEncode (entry .getValue (), ":/" ));
453
453
purl .append ("&" );
454
454
});
455
455
purl .setLength (purl .length () - 1 );
456
456
}
457
457
if (subpath != null ) {
458
- purl .append ("#" ).append (encodePath (subpath ));
458
+ purl .append ("#" ).append (encodePath (subpath , "?#+&=" ));
459
459
}
460
460
}
461
461
return purl .toString ();
462
462
}
463
463
464
+ private String percentEncode (final String input , final Charset charset , final String charsToExclude ) {
465
+ return uriEncode (input , charset , charsToExclude );
466
+ }
467
+
468
+ private String percentEncode (final String input , final String charsToExclude ) {
469
+ return percentEncode (input , StandardCharsets .UTF_8 , charsToExclude );
470
+ }
471
+
464
472
/**
465
473
* Encodes the input in conformance with RFC 3986.
466
474
*
467
475
* @param input the String to encode
468
476
* @return an encoded String
469
477
*/
470
478
private String percentEncode (final String input ) {
471
- return uriEncode (input , StandardCharsets .UTF_8 );
479
+ return percentEncode (input , StandardCharsets .UTF_8 , null );
472
480
}
473
481
474
- private static String uriEncode (String source , Charset charset ) {
482
+ private static String uriEncode (String source , Charset charset , String chars ) {
475
483
if (source == null || source .length () == 0 ) {
476
484
return source ;
477
485
}
478
486
479
487
StringBuilder builder = new StringBuilder ();
480
488
for (byte b : source .getBytes (charset )) {
481
- if (isUnreserved (b )) {
489
+ if (isUnreserved (b ) || chars != null && chars . indexOf ( b ) != - 1 ) {
482
490
builder .append ((char ) b );
483
491
}
484
492
else {
@@ -491,7 +499,7 @@ private static String uriEncode(String source, Charset charset) {
491
499
}
492
500
493
501
private static boolean isUnreserved (int c ) {
494
- return (isAlpha (c ) || isDigit (c ) || '-' == c || '.' == c || '_' == c || '~' == c || ':' == c || '/' == c );
502
+ return (isAlpha (c ) || isDigit (c ) || '-' == c || '.' == c || '_' == c || '~' == c );
495
503
}
496
504
497
505
private static boolean isAlpha (int c ) {
@@ -718,8 +726,8 @@ private String[] parsePath(final String value, final boolean isSubpath) throws M
718
726
.toArray (String []::new );
719
727
}
720
728
721
- private String encodePath (final String path ) {
722
- return Arrays .stream (path .split ("/" )).map (segment -> percentEncode (segment )).collect (Collectors .joining ("/" ));
729
+ private String encodePath (final String path , String chars ) {
730
+ return Arrays .stream (path .split ("/" )).map (segment -> percentEncode (segment , chars )).collect (Collectors .joining ("/" ));
723
731
}
724
732
725
733
/**
0 commit comments