这是indexloc提供的服务,不要输入任何密码
Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,21 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/** A utility class to parse {@link HttpResponse} and create a {@link UploadPartResponse}. */
/** A utility class to parse checksums from an {@link HttpResponse}. */
final class ChecksumResponseParser {

private static final String X_GOOG_HASH = "x-goog-hash";

private ChecksumResponseParser() {}

static UploadPartResponse parseUploadResponse(HttpResponse response) {
String eTag = response.getHeaders().getETag();
Map<String, String> hashes = extractHashesFromHeader(response);
return UploadPartResponse.builder().eTag(eTag).md5(hashes.get("md5")).build();
return UploadPartResponse.builder().eTag(eTag).md5(hashes.get("md5")).crc32c(hashes.get("crc32c")).build();
}

static CompleteMultipartUploadResponse parseCompleteResponse(HttpResponse response)
Expand All @@ -52,14 +54,18 @@ static CompleteMultipartUploadResponse parseCompleteResponse(HttpResponse respon
}

static Map<String, String> extractHashesFromHeader(HttpResponse response) {
return Optional.ofNullable(response.getHeaders().getFirstHeaderStringValue("x-goog-hash"))
.map(
h ->
Arrays.stream(h.split(","))
.map(s -> s.trim().split("=", 2))
.filter(a -> a.length == 2)
.filter(a -> "crc32c".equalsIgnoreCase(a[0]) || "md5".equalsIgnoreCase(a[0]))
.collect(Collectors.toMap(a -> a[0].toLowerCase(), a -> a[1], (v1, v2) -> v1)))
.orElse(Collections.emptyMap());
List<String> hashHeaders = response.getHeaders().getHeaderStringValues(X_GOOG_HASH);
if (hashHeaders == null || hashHeaders.isEmpty()) {
return Collections.emptyMap();
}

return hashHeaders.stream()
.flatMap(h -> Arrays.stream(h.split(",")))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(s -> s.split("=", 2))
.filter(a -> a.length == 2)
.filter(a -> "crc32c".equalsIgnoreCase(a[0]) || "md5".equalsIgnoreCase(a[0]))
.collect(Collectors.toMap(a -> a[0].toLowerCase(), a -> a[1], (v1, v2) -> v1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse;
import com.google.cloud.storage.multipartupload.model.ListPartsRequest;
import com.google.cloud.storage.multipartupload.model.ListPartsResponse;
import com.google.cloud.storage.multipartupload.model.UploadPartRequest;
Expand Down Expand Up @@ -100,6 +102,17 @@ public abstract CompleteMultipartUploadResponse completeMultipartUpload(
@BetaApi
public abstract UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requestBody);

/**
* Lists all multipart uploads in a bucket.
*
* @param request The request object containing the details for listing the multipart uploads.
* @return A {@link ListMultipartUploadsResponse} object containing the list of multipart uploads.
* @since 2.60.0 This new api is in preview and is subject to breaking changes.
*/
@BetaApi
public abstract ListMultipartUploadsResponse listMultipartUploads(
ListMultipartUploadsRequest request);

/**
* Creates a new instance of {@link MultipartUploadClient}.
*
Expand All @@ -116,4 +129,4 @@ public static MultipartUploadClient create(MultipartUploadSettings config) {
MultipartUploadHttpRequestManager.createFrom(options),
options.getRetryAlgorithmManager());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse;
import com.google.cloud.storage.multipartupload.model.ListPartsRequest;
import com.google.cloud.storage.multipartupload.model.ListPartsResponse;
import com.google.cloud.storage.multipartupload.model.UploadPartRequest;
Expand Down Expand Up @@ -100,4 +102,12 @@ public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requ
},
Decoder.identity());
}

@Override
public ListMultipartUploadsResponse listMultipartUploads(ListMultipartUploadsRequest request) {
return retrier.run(
retryAlgorithmManager.idempotent(),
() -> httpRequestManager.sendListMultipartUploadsRequest(uri, request),
Decoder.identity());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest;
import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest;
import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse;
import com.google.cloud.storage.multipartupload.model.ListPartsRequest;
import com.google.cloud.storage.multipartupload.model.ListPartsResponse;
import com.google.cloud.storage.multipartupload.model.UploadPartRequest;
Expand Down Expand Up @@ -111,6 +113,43 @@ ListPartsResponse sendListPartsRequest(URI uri, ListPartsRequest request) throws
return httpRequest.execute().parseAs(ListPartsResponse.class);
}

ListMultipartUploadsResponse sendListMultipartUploadsRequest(
URI uri, ListMultipartUploadsRequest request) throws IOException {

ImmutableMap.Builder<String, Object> params =
ImmutableMap.<String, Object>builder()
.put("bucket", request.bucket());
if(request.delimiter() != null){
params.put("delimiter", request.delimiter());
}
if(request.encodingType() != null){
params.put("encoding-type", request.encodingType());
}
if(request.keyMarker() != null){
params.put("key-marker", request.keyMarker());
}
if(request.maxUploads() != null){
params.put("max-uploads", request.maxUploads());
}
if(request.prefix() != null){
params.put("prefix", request.prefix());
}
if(request.uploadIdMarker() != null){
params.put("upload-id-marker", request.uploadIdMarker());
}
String listUri =
UriTemplate.expand(
uri.toString() + "{bucket}?uploads{delimiter,encoding-type,key-marker,max-uploads,prefix,upload-id-marker}",
params,
false);
System.out.println(listUri);
HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(listUri));
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
httpRequest.setParser(objectParser);
httpRequest.setThrowExceptionOnExecuteError(true);
return httpRequest.execute().parseAs(ListMultipartUploadsResponse.class);
}

AbortMultipartUploadResponse sendAbortMultipartUploadRequest(
URI uri, AbortMultipartUploadRequest request) throws IOException {

Expand Down Expand Up @@ -248,7 +287,7 @@ private static String urlEncode(String value) {
*/
private static String formatName(String name) {
// Only lowercase letters, digits, and "-" are allowed
return name.toLowerCase().replaceAll("[^\\w\\d\\-]", "-");
return name.toLowerCase().replaceAll("[^\\w-]", "-");
}

private static String formatSemver(String version) {
Expand Down
Loading
Loading