aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaurav Agrawal <gaurav.agrawal@huawei.com>2019-04-12 10:08:20 +0530
committerTimoney, Dan (dt5972) <dtimoney@att.com>2019-04-16 10:05:39 -0400
commite4c9cfddd142785d527f29ff5c2b5883cc255033 (patch)
treeab44bcdba586a8f9d04ef7cb28c478e7dd99d611
parent2f860ff302a9583a49a08524a5fcdd7435ee2359 (diff)
Add support for multi part form data
Add support for multipart form data in CCSDK Change-Id: Iacc35efe28b9d91afcfc1e87e0faf41fc74d5c8a Issue-ID: CCSDK-239 Signed-off-by: Gaurav Agrawal <gaurav.agrawal@huawei.com>
-rwxr-xr-xrestapi-call-node/provider/pom.xml6
-rw-r--r--restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java2
-rw-r--r--restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java86
-rw-r--r--restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java27
4 files changed, 105 insertions, 16 deletions
diff --git a/restapi-call-node/provider/pom.xml b/restapi-call-node/provider/pom.xml
index c5556011..2455866a 100755
--- a/restapi-call-node/provider/pom.xml
+++ b/restapi-call-node/provider/pom.xml
@@ -68,7 +68,11 @@
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
-
+ <dependency>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-multipart</artifactId>
+ <version>${jersey.version}</version>
+ </dependency>
<!-- For test -->
<dependency>
diff --git a/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java b/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java
index 8f65cf26..aeb07c4d 100644
--- a/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java
+++ b/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java
@@ -51,4 +51,6 @@ public class Parameters {
public AuthType authtype;
public Boolean returnRequestPayload;
public String accept;
+ public boolean multipartFormData;
+ public String multipartFile;
}
diff --git a/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java b/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java
index 521c66cb..a7235fcb 100644
--- a/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java
+++ b/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java
@@ -26,6 +26,7 @@ import static java.lang.Boolean.valueOf;
import static javax.ws.rs.client.Entity.entity;
import static org.onap.ccsdk.sli.plugins.restapicall.AuthType.fromString;
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketException;
@@ -51,17 +52,17 @@ import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.EntityTag;
-import javax.ws.rs.core.Feature;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.*;
+
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.HttpUrlConnectorProvider;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.glassfish.jersey.client.oauth1.ConsumerCredentials;
import org.glassfish.jersey.client.oauth1.OAuth1ClientSupport;
+import org.glassfish.jersey.media.multipart.MultiPart;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
import org.onap.ccsdk.sli.core.sli.SvcLogicException;
import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
@@ -168,6 +169,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
paramMap, "returnRequestPayload", false, null));
p.accept = parseParam(paramMap, "accept",
false, null);
+ p.multipartFormData = valueOf(parseParam(paramMap, "multipartFormData",
+ false, "false"));
+ p.multipartFile = parseParam(paramMap, "multipartFile",
+ false, null);
return p;
}
@@ -635,15 +640,17 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
HttpResponse r = new HttpResponse();
r.code = 200;
- if (!p.skipSending) {
- String accept = p.accept;
- if(accept == null) {
- accept = p.format == Format.XML ? "application/xml" : "application/json";
- }
- String contentType = p.contentType;
- if(contentType == null) {
- contentType = accept + ";charset=UTF-8";
- }
+ String accept = p.accept;
+ if(accept == null) {
+ accept = p.format == Format.XML ? "application/xml" : "application/json";
+ }
+
+ String contentType = p.contentType;
+ if(contentType == null) {
+ contentType = accept + ";charset=UTF-8";
+ }
+
+ if (!p.skipSending && !p.multipartFormData) {
Invocation.Builder invocationBuilder = webTarget.request(contentType).accept(accept);
@@ -680,6 +687,55 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
if (response.hasEntity() && r.code != 204) {
r.body = response.readEntity(String.class);
}
+ } else if (!p.skipSending && p.multipartFormData) {
+
+ WebTarget wt = client.register(MultiPartFeature.class).target(p.restapiUrl);
+
+ MultiPart multiPart = new MultiPart();
+ multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
+
+ FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
+ new File(p.multipartFile),
+ MediaType.APPLICATION_OCTET_STREAM_TYPE);
+ multiPart.bodyPart(fileDataBodyPart);
+
+
+ Invocation.Builder invocationBuilder = wt.request(contentType).accept(accept);
+
+ if (p.format == Format.NONE) {
+ invocationBuilder.header("", "");
+ }
+
+ if (p.customHttpHeaders != null && p.customHttpHeaders.length() > 0) {
+ String[] keyValuePairs = p.customHttpHeaders.split(",");
+ for (String singlePair : keyValuePairs) {
+ int equalPosition = singlePair.indexOf('=');
+ invocationBuilder.header(singlePair.substring(0, equalPosition),
+ singlePair.substring(equalPosition + 1, singlePair.length()));
+ }
+ }
+
+ invocationBuilder.header("X-ECOMP-RequestID", org.slf4j.MDC.get("X-ECOMP-RequestID"));
+
+ Response response;
+
+ try {
+ response = invocationBuilder.method(p.httpMethod.toString(), entity(multiPart, multiPart.getMediaType()));
+ } catch (ProcessingException | IllegalStateException e) {
+ throw new SvcLogicException(requestPostingException +
+ e.getLocalizedMessage(), e);
+ }
+
+ r.code = response.getStatus();
+ r.headers = response.getStringHeaders();
+ EntityTag etag = response.getEntityTag();
+ if (etag != null) {
+ r.message = etag.getValue();
+ }
+ if (response.hasEntity() && r.code != 204) {
+ r.body = response.readEntity(String.class);
+ }
+
}
long t2 = System.currentTimeMillis();
@@ -858,7 +914,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
log.info("Got response code 301. Sending same request to URL: {}", newUrl);
- webTarget = client.target(newUrl);
+ webTarget = client.target(newUrl);
invocationBuilder = webTarget.request(tt).accept(tt);
try {
diff --git a/restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java b/restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
index fd982d76..5b047e4e 100644
--- a/restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
+++ b/restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
@@ -224,6 +224,33 @@ public class TestRestapiCallNode {
rcn.sendRequest(p, ctx);
}
+ @Test(expected = SvcLogicException.class)
+ public void testFormData() throws SvcLogicException {
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
+ ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
+
+ Map<String, String> p = new HashMap<String, String>();
+ p.put("templateFileName", "src/test/resources/test-template.json");
+ p.put("restapiUrl", "http://echo.getpostman.com");
+ p.put("restapiUser", "user1");
+ p.put("restapiPassword", "abc123");
+ p.put("format", "json");
+ p.put("httpMethod", "post");
+ p.put("responsePrefix", "response");
+ p.put("skipSending", "false");
+ p.put("multipartFormData", "true");
+ p.put("multipartFile", "src/test/resources/test-template.json");
+
+ RestapiCallNode rcn = new RestapiCallNode();
+ rcn.sendRequest(p, ctx);
+ }
@Test(expected = SvcLogicException.class)
public void testWithInvalidURI() throws SvcLogicException {