private Map<String, List<String>> mergeParams(SdkHttpFullRequest.Builder request, RequestExecutionContext context) { Map<String, List<String>> merged = new LinkedHashMap<>(request.rawQueryParameters().size()); merged.putAll(request.rawQueryParameters()); context.requestConfig().rawQueryParameters() .forEach((key, val) -> merged.put(key, CollectionUtils.mergeLists(merged.get(key), val))); return merged; } }
private static SdkHttpFullRequest.Builder changeQueryParametersToFormData(SdkHttpFullRequest.Builder input) { byte[] params = SdkHttpUtils.encodeAndFlattenFormData(input.rawQueryParameters()).orElse("") .getBytes(StandardCharsets.UTF_8); return input.clearQueryParameters() .contentStreamProvider(() -> new ByteArrayInputStream(params)) .putHeader("Content-Length", singletonList(String.valueOf(params.length))) .putHeader("Content-Type", singletonList("application/x-www-form-urlencoded; charset=" + lowerCase(StandardCharsets.UTF_8.toString()))); } }
/** * Step 1 of the AWS Signature version 4 calculation. Refer to * http://docs.aws * .amazon.com/general/latest/gr/sigv4-create-canonical-request.html to * generate the canonical request. */ private String createCanonicalRequest(SdkHttpFullRequest.Builder request, String contentSha256, boolean doubleUrlEncode) { String canonicalRequest = request.method().toString() + SignerConstant.LINE_SEPARATOR + // This would optionally double url-encode the resource path getCanonicalizedResourcePath(request.encodedPath(), doubleUrlEncode) + SignerConstant.LINE_SEPARATOR + getCanonicalizedQueryString(request.rawQueryParameters()) + SignerConstant.LINE_SEPARATOR + getCanonicalizedHeaderString(request.headers()) + SignerConstant.LINE_SEPARATOR + getSignedHeadersString(request.headers()) + SignerConstant.LINE_SEPARATOR + contentSha256; LOG.trace(() -> "AWS4 Canonical Request: " + canonicalRequest); return canonicalRequest; }
/** * Step 1 of the AWS Signature version 4 calculation. Refer to * http://docs.aws * .amazon.com/general/latest/gr/sigv4-create-canonical-request.html to * generate the canonical request. */ private String createCanonicalRequest(SdkHttpFullRequest.Builder request, String contentSha256, boolean doubleUrlEncode) { String canonicalRequest = request.method().toString() + SignerConstant.LINE_SEPARATOR + // This would optionally double url-encode the resource path getCanonicalizedResourcePath(request.encodedPath(), doubleUrlEncode) + SignerConstant.LINE_SEPARATOR + getCanonicalizedQueryString(request.rawQueryParameters()) + SignerConstant.LINE_SEPARATOR + getCanonicalizedHeaderString(request.headers()) + SignerConstant.LINE_SEPARATOR + getSignedHeadersString(request.headers()) + SignerConstant.LINE_SEPARATOR + contentSha256; LOG.trace(() -> "AWS4 Canonical Request: " + canonicalRequest); return canonicalRequest; }
private boolean shouldPutParamsInBody(SdkHttpFullRequest.Builder input) { return input.method() == SdkHttpMethod.POST && input.contentStreamProvider() == null && !CollectionUtils.isNullOrEmpty(input.rawQueryParameters()); }
@Override public SdkHttpFullRequest.Builder execute(SdkHttpFullRequest.Builder request, RequestExecutionContext context) throws Exception { return request.rawQueryParameters(mergeParams(request, context)); }
@Override public SdkHttpFullRequest.Builder toBuilder() { return new Builder() .contentStreamProvider(contentStreamProvider) .protocol(protocol) .host(host) .port(port) .encodedPath(path) .rawQueryParameters(queryParameters) .method(httpMethod) .headers(headers) ; }
@Override public SdkHttpFullRequest.Builder toBuilder() { return new Builder() .contentStreamProvider(contentStreamProvider) .protocol(protocol) .host(host) .port(port) .encodedPath(path) .rawQueryParameters(queryParameters) .method(httpMethod) .headers(headers) ; }