|
66 | 66 | import java.io.InputStream; |
67 | 67 | import java.io.UnsupportedEncodingException; |
68 | 68 | import java.net.MalformedURLException; |
| 69 | +import java.net.URI; |
69 | 70 | import java.net.URL; |
70 | 71 | import java.net.URLEncoder; |
71 | | -import java.nio.file.Path; |
72 | | -import java.nio.file.Paths; |
73 | 72 | import java.util.Arrays; |
74 | 73 | import java.util.Collections; |
75 | 74 | import java.util.EnumMap; |
@@ -529,61 +528,63 @@ public URL signUrl(BlobInfo blobInfo, long duration, TimeUnit unit, SignUrlOptio |
529 | 528 |
|
530 | 529 | String escapedName = UrlEscapers.urlFragmentEscaper().escape(blobInfo.getName()); |
531 | 530 | stPath.append(escapedName.replace("?", "%3F")); |
532 | | - |
533 | | - Path path = Paths.get(stPath.toString()); |
534 | | - |
| 531 | + |
| 532 | + URI resource = URI.create(stPath.toString()); |
| 533 | + |
535 | 534 | try { |
536 | | - SignatureInfo signatureInfo = buildSignarueInfo(optionMap, blobInfo, expiration, path); |
| 535 | + SignatureInfo signatureInfo = buildSignarueInfo(optionMap, blobInfo, expiration, resource); |
537 | 536 | byte[] signatureBytes = |
538 | 537 | credentials.sign(signatureInfo.constructUnsignedPayload().getBytes(UTF_8)); |
539 | | - StringBuilder stBuilder = new StringBuilder("https://storage.googleapis.com").append(path); |
| 538 | + StringBuilder stBuilder = |
| 539 | + new StringBuilder("https://storage.googleapis.com").append(resource); |
540 | 540 | String signature = |
541 | 541 | URLEncoder.encode(BaseEncoding.base64().encode(signatureBytes), UTF_8.name()); |
542 | 542 | stBuilder.append("?GoogleAccessId=").append(credentials.getAccount()); |
543 | 543 | stBuilder.append("&Expires=").append(expiration); |
544 | 544 | stBuilder.append("&Signature=").append(signature); |
545 | | - |
| 545 | + |
546 | 546 | return new URL(stBuilder.toString()); |
547 | | - |
| 547 | + |
548 | 548 | } catch (MalformedURLException | UnsupportedEncodingException ex) { |
549 | 549 | throw new IllegalStateException(ex); |
550 | 550 | } |
551 | 551 | } |
552 | 552 |
|
553 | 553 | /** |
554 | 554 | * Builds signature info. |
555 | | - * @param optionMap |
556 | | - * @param blobInfo |
557 | | - * @param expiration |
558 | | - * @param path |
559 | | - * @return |
| 555 | + * @param optionMap the option map |
| 556 | + * @param blobInfo the blob info |
| 557 | + * @param expiration the expiration in seconds |
| 558 | + * @param resource the resource URI |
| 559 | + * @return signature info |
560 | 560 | */ |
561 | 561 | private SignatureInfo buildSignarueInfo(Map<SignUrlOption.Option, Object> optionMap, |
562 | | - BlobInfo blobInfo, long expiration, Path path) { |
563 | | - |
564 | | - HttpMethod httpVerb = optionMap.containsKey(SignUrlOption.Option.HTTP_METHOD) ? |
565 | | - (HttpMethod) optionMap.get(SignUrlOption.Option.HTTP_METHOD) : HttpMethod.GET; |
566 | | - |
| 562 | + BlobInfo blobInfo, long expiration, URI resource) { |
| 563 | + |
| 564 | + HttpMethod httpVerb = optionMap.containsKey(SignUrlOption.Option.HTTP_METHOD) |
| 565 | + ? (HttpMethod) optionMap.get(SignUrlOption.Option.HTTP_METHOD) |
| 566 | + : HttpMethod.GET; |
| 567 | + |
567 | 568 | SignatureInfo.Builder signatureInfoBuilder = |
568 | | - new SignatureInfo.Builder(httpVerb, expiration, path); |
569 | | - |
570 | | - if (firstNonNull((Boolean) optionMap.get(SignUrlOption.Option.MD5), false)) { |
571 | | - checkArgument(blobInfo.getMd5() != null, "Blob is missing a value for md5"); |
572 | | - signatureInfoBuilder.setContentMd5(blobInfo.getMd5()); |
573 | | - } |
574 | | - |
575 | | - if (firstNonNull((Boolean) optionMap.get(SignUrlOption.Option.CONTENT_TYPE), false)) { |
576 | | - checkArgument(blobInfo.getContentType() != null, "Blob is missing a value for content-type"); |
577 | | - signatureInfoBuilder.setContentType(blobInfo.getContentType()); |
578 | | - } |
579 | | - |
580 | | - @SuppressWarnings("unchecked") |
581 | | - Map<String, String> extHeaders = |
582 | | - (Map<String, String>) (optionMap.containsKey(SignUrlOption.Option.EXT_HEADERS) ? |
583 | | - (Map<String, String>) optionMap.get(SignUrlOption.Option.EXT_HEADERS) : |
584 | | - Collections.emptyMap()); |
585 | | - |
586 | | - return signatureInfoBuilder.setCanonicalizedExtensionHeaders(extHeaders).build(); |
| 569 | + new SignatureInfo.Builder(httpVerb, expiration, resource); |
| 570 | + |
| 571 | + if (firstNonNull((Boolean) optionMap.get(SignUrlOption.Option.MD5), false)) { |
| 572 | + checkArgument(blobInfo.getMd5() != null, "Blob is missing a value for md5"); |
| 573 | + signatureInfoBuilder.setContentMd5(blobInfo.getMd5()); |
| 574 | + } |
| 575 | + |
| 576 | + if (firstNonNull((Boolean) optionMap.get(SignUrlOption.Option.CONTENT_TYPE), false)) { |
| 577 | + checkArgument(blobInfo.getContentType() != null, "Blob is missing a value for content-type"); |
| 578 | + signatureInfoBuilder.setContentType(blobInfo.getContentType()); |
| 579 | + } |
| 580 | + |
| 581 | + @SuppressWarnings("unchecked") |
| 582 | + Map<String, String> extHeaders = |
| 583 | + (Map<String, String>) (optionMap.containsKey(SignUrlOption.Option.EXT_HEADERS) |
| 584 | + ? (Map<String, String>) optionMap.get(SignUrlOption.Option.EXT_HEADERS) |
| 585 | + : Collections.emptyMap()); |
| 586 | + |
| 587 | + return signatureInfoBuilder.setCanonicalizedExtensionHeaders(extHeaders).build(); |
587 | 588 | } |
588 | 589 |
|
589 | 590 | @Override |
|
0 commit comments