@@ -1253,7 +1253,7 @@ public void testSignUrlLeadingSlash() throws NoSuchAlgorithmException, InvalidKe
1253
1253
ServiceAccountAuthCredentials .createFor (ACCOUNT , privateKey );
1254
1254
storage = options .toBuilder ().authCredentials (authCredentials ).build ().service ();
1255
1255
URL url = storage .signUrl (BlobInfo .builder (BUCKET_NAME1 , blobName ).build (), 14 , TimeUnit .DAYS );
1256
- String escapedBlobName = UrlEscapers .urlPathSegmentEscaper ().escape (blobName );
1256
+ String escapedBlobName = UrlEscapers .urlFragmentEscaper ().escape (blobName );
1257
1257
String stringUrl = url .toString ();
1258
1258
String expectedUrl = new StringBuilder ("https://storage.googleapis.com/" ).append (BUCKET_NAME1 )
1259
1259
.append (escapedBlobName ).append ("?GoogleAccessId=" ).append (ACCOUNT ).append ("&Expires=" )
@@ -1317,7 +1317,7 @@ public void testSignUrlForBlobWithSpecialChars() throws NoSuchAlgorithmException
1317
1317
String blobName = "/a" + specialChar + "b" ;
1318
1318
URL url =
1319
1319
storage .signUrl (BlobInfo .builder (BUCKET_NAME1 , blobName ).build (), 14 , TimeUnit .DAYS );
1320
- String escapedBlobName = UrlEscapers .urlPathSegmentEscaper ().escape (blobName );
1320
+ String escapedBlobName = UrlEscapers .urlFragmentEscaper ().escape (blobName );
1321
1321
String stringUrl = url .toString ();
1322
1322
String expectedUrl = new StringBuilder ("https://storage.googleapis.com/" ).append (BUCKET_NAME1 )
1323
1323
.append (escapedBlobName ).append ("?GoogleAccessId=" ).append (ACCOUNT ).append ("&Expires=" )
@@ -1337,6 +1337,37 @@ public void testSignUrlForBlobWithSpecialChars() throws NoSuchAlgorithmException
1337
1337
}
1338
1338
}
1339
1339
1340
+ @ Test
1341
+ public void testSignUrlForBlobWithSlashes () throws NoSuchAlgorithmException ,
1342
+ InvalidKeyException , SignatureException , UnsupportedEncodingException {
1343
+ EasyMock .replay (storageRpcMock );
1344
+ ServiceAccountAuthCredentials authCredentials =
1345
+ ServiceAccountAuthCredentials .createFor (ACCOUNT , privateKey );
1346
+ storage = options .toBuilder ().authCredentials (authCredentials ).build ().service ();
1347
+
1348
+ String blobName = "/foo/bar/baz #%20other cool stuff.txt" ;
1349
+ URL url =
1350
+ storage .signUrl (BlobInfo .builder (BUCKET_NAME1 , blobName ).build (), 14 , TimeUnit .DAYS );
1351
+
1352
+ String escapedBlobName = UrlEscapers .urlFragmentEscaper ().escape (blobName );
1353
+ String stringUrl = url .toString ();
1354
+ String expectedUrl = new StringBuilder ("https://storage.googleapis.com/" ).append (BUCKET_NAME1 )
1355
+ .append (escapedBlobName ).append ("?GoogleAccessId=" ).append (ACCOUNT ).append ("&Expires=" )
1356
+ .append (42L + 1209600 ).append ("&Signature=" ).toString ();
1357
+ assertTrue (stringUrl .startsWith (expectedUrl ));
1358
+ String signature = stringUrl .substring (expectedUrl .length ());
1359
+
1360
+ StringBuilder signedMessageBuilder = new StringBuilder ();
1361
+ signedMessageBuilder .append (HttpMethod .GET ).append ("\n \n \n " ).append (42L + 1209600 )
1362
+ .append ("\n /" ).append (BUCKET_NAME1 ).append (escapedBlobName );
1363
+
1364
+ Signature signer = Signature .getInstance ("SHA256withRSA" );
1365
+ signer .initVerify (publicKey );
1366
+ signer .update (signedMessageBuilder .toString ().getBytes (UTF_8 ));
1367
+ assertTrue (signer .verify (BaseEncoding .base64 ().decode (
1368
+ URLDecoder .decode (signature , UTF_8 .name ()))));
1369
+ }
1370
+
1340
1371
@ Test
1341
1372
public void testGetAllArray () {
1342
1373
BlobId blobId1 = BlobId .of (BUCKET_NAME1 , BLOB_NAME1 );
0 commit comments