|
16 | 16 |
|
17 | 17 | package io.minio; |
18 | 18 |
|
| 19 | +import com.google.common.net.UrlEscapers; |
| 20 | +import com.google.common.escape.Escaper; |
19 | 21 | import com.google.common.io.ByteStreams; |
20 | 22 | import com.google.gson.Gson; |
21 | 23 | import com.squareup.okhttp.HttpUrl; |
|
126 | 128 | */ |
127 | 129 | @SuppressWarnings({"SameParameterValue", "WeakerAccess"}) |
128 | 130 | public final class MinioClient { |
| 131 | + private static final Escaper QUERY_ESCAPER = UrlEscapers.urlPathSegmentEscaper(); |
129 | 132 | private static final Logger LOGGER = Logger.getLogger(MinioClient.class.getName()); |
130 | 133 | // maximum allowed object size is 5TiB |
131 | 134 | private static final long MAX_OBJECT_SIZE = 5L * 1024 * 1024 * 1024 * 1024; |
@@ -590,6 +593,29 @@ public void setTimeout(long connectTimeout, long writeTimeout, long readTimeout) |
590 | 593 | httpClient.setReadTimeout(readTimeout, TimeUnit.MILLISECONDS); |
591 | 594 | } |
592 | 595 |
|
| 596 | + /** |
| 597 | + * Returns encoded query string for URL. |
| 598 | + */ |
| 599 | + private static String encodeQueryString(String str) { |
| 600 | + return QUERY_ESCAPER.escape(str) |
| 601 | + .replaceAll("\\!", "%21") |
| 602 | + .replaceAll("\\$", "%24") |
| 603 | + .replaceAll("\\&", "%26") |
| 604 | + .replaceAll("\\'", "%27") |
| 605 | + .replaceAll("\\(", "%28") |
| 606 | + .replaceAll("\\)", "%29") |
| 607 | + .replaceAll("\\*", "%2A") |
| 608 | + .replaceAll("\\+", "%2B") |
| 609 | + .replaceAll("\\,", "%2C") |
| 610 | + .replaceAll("\\\\", "%2F") |
| 611 | + .replaceAll("\\:", "%3A") |
| 612 | + .replaceAll("\\;", "%3B") |
| 613 | + .replaceAll("\\=", "%3D") |
| 614 | + .replaceAll("\\@", "%40") |
| 615 | + .replaceAll("\\[", "%5B") |
| 616 | + .replaceAll("\\]", "%5D"); |
| 617 | + } |
| 618 | + |
593 | 619 | /** |
594 | 620 | * Creates Request object for given request parameters. |
595 | 621 | * |
@@ -658,7 +684,8 @@ private Request createRequest(Method method, String bucketName, String objectNam |
658 | 684 |
|
659 | 685 | if (queryParamMap != null) { |
660 | 686 | for (Map.Entry<String,String> entry : queryParamMap.entrySet()) { |
661 | | - urlBuilder.addQueryParameter(entry.getKey(), entry.getValue()); |
| 687 | + urlBuilder.addEncodedQueryParameter(encodeQueryString(entry.getKey()), |
| 688 | + encodeQueryString(entry.getValue())); |
662 | 689 | } |
663 | 690 | } |
664 | 691 |
|
|
0 commit comments