Github user jzonthemtn commented on a diff in the pull request:
https://github.com/apache/nifi/pull/2588#discussion_r194370513
--- Diff:
nifi-nar-bundles/nifi-aws-bundle/nifi-aws-abstract-processors/src/main/java/org/apache/nifi/processors/aws/wag/client/GenericApiGatewayClient.java
---
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.processors.aws.wag.client;
+
+import com.amazonaws.AmazonServiceException;
+import com.amazonaws.AmazonWebServiceClient;
+import com.amazonaws.ClientConfiguration;
+import com.amazonaws.DefaultRequest;
+import com.amazonaws.auth.AWS4Signer;
+import com.amazonaws.auth.AWSCredentialsProvider;
+import com.amazonaws.http.AmazonHttpClient;
+import com.amazonaws.http.ExecutionContext;
+import com.amazonaws.http.HttpMethodName;
+import com.amazonaws.http.HttpResponseHandler;
+import com.amazonaws.http.JsonResponseHandler;
+import com.amazonaws.internal.auth.DefaultSignerProvider;
+import com.amazonaws.protocol.json.JsonOperationMetadata;
+import com.amazonaws.protocol.json.SdkStructuredPlainJsonFactory;
+import com.amazonaws.regions.Region;
+import com.amazonaws.transform.JsonErrorUnmarshaller;
+import com.amazonaws.transform.JsonUnmarshallerContext;
+import com.amazonaws.transform.Unmarshaller;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GenericApiGatewayClient extends AmazonWebServiceClient {
+ private static final String API_GATEWAY_SERVICE_NAME = "execute-api";
+ private static final String API_KEY_HEADER = "x-api-key";
+
+ private final JsonResponseHandler<GenericApiGatewayResponse>
responseHandler;
+ private final HttpResponseHandler<AmazonServiceException>
errorResponseHandler;
+ private final AWSCredentialsProvider credentials;
+ private String apiKey;
+ private final AWS4Signer signer;
+
+ GenericApiGatewayClient(ClientConfiguration clientConfiguration,
String endpoint, Region region,
+ AWSCredentialsProvider credentials, String
apiKey, AmazonHttpClient httpClient) {
+ super(clientConfiguration);
+ setRegion(region);
+ setEndpoint(endpoint);
+ this.credentials = credentials;
+ this.apiKey = apiKey;
+ this.signer = new AWS4Signer();
+ this.signer.setServiceName(API_GATEWAY_SERVICE_NAME);
+ this.signer.setRegionName(region.getName());
+
+ final JsonOperationMetadata metadata = new
JsonOperationMetadata().withHasStreamingSuccessResponse(false).withPayloadJson(false);
+ final Unmarshaller<GenericApiGatewayResponse,
JsonUnmarshallerContext> responseUnmarshaller = in -> new
GenericApiGatewayResponse(in.getHttpResponse());
+ this.responseHandler =
SdkStructuredPlainJsonFactory.SDK_JSON_FACTORY.createResponseHandler(metadata,
responseUnmarshaller);
+ JsonErrorUnmarshaller defaultErrorUnmarshaller = new
JsonErrorUnmarshaller(GenericApiGatewayException.class, null) {
+ @Override
+ public AmazonServiceException unmarshall(JsonNode jsonContent)
throws Exception {
+ return new
GenericApiGatewayException(jsonContent.toString());
+ }
+ };
+ this.errorResponseHandler =
SdkStructuredPlainJsonFactory.SDK_JSON_FACTORY.createErrorResponseHandler(
+ Collections.singletonList(defaultErrorUnmarshaller), null);
+
+ if (httpClient != null) {
+ super.client = httpClient;
+ }
+ }
+
+ public GenericApiGatewayResponse execute(GenericApiGatewayRequest
request) {
+ return execute(request.getHttpMethod(), request.getResourcePath(),
request.getHeaders(), request.getParameters(), request.getBody());
+ }
+
+ private GenericApiGatewayResponse execute(HttpMethodName method,
String resourcePath, Map<String, String> headers, Map<String,List<String>>
parameters, InputStream content) {
+ final ExecutionContext executionContext = buildExecutionContext();
+
+ DefaultRequest request = new
DefaultRequest(API_GATEWAY_SERVICE_NAME);
+ request.setHttpMethod(method);
+ request.setContent(content);
+ request.setEndpoint(this.endpoint);
+ request.setResourcePath(resourcePath);
+ request.setHeaders(buildRequestHeaders(headers, apiKey));
+ if (parameters != null) {
+ request.setParameters(parameters);
+ }
+ return this.client.execute(request, responseHandler,
errorResponseHandler, executionContext).getAwsResponse();
+ }
+
+ private ExecutionContext buildExecutionContext() {
+ final ExecutionContext executionContext =
ExecutionContext.builder().withSignerProvider(
+ new DefaultSignerProvider(this, signer)).build();
+ executionContext.setCredentialsProvider(credentials);
+ executionContext.setSigner(signer);
+ return executionContext;
+ }
+
+ private Map<String, String> buildRequestHeaders(Map<String, String>
headers, String apiKey) {
+ if (headers == null) {
+ headers = new HashMap<>();
+ }
+ if (apiKey != null) {
+ final Map<String, String> headersWithApiKey = new HashMap<>();
--- End diff --
Is it possible to just add the API key to `headers` without making a new
map and then always `return headers;`?
---