From e4c9cfddd142785d527f29ff5c2b5883cc255033 Mon Sep 17 00:00:00 2001 From: Gaurav Agrawal Date: Fri, 12 Apr 2019 10:08:20 +0530 Subject: 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 --- restapi-call-node/provider/pom.xml | 6 +- .../ccsdk/sli/plugins/restapicall/Parameters.java | 2 + .../sli/plugins/restapicall/RestapiCallNode.java | 86 ++++++++++++++++++---- .../plugins/restapicall/TestRestapiCallNode.java | 27 +++++++ 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 @@ jersey-client ${jersey.version} - + + org.glassfish.jersey.media + jersey-media-multipart + ${jersey.version} + 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 p = new HashMap(); + 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 { -- cgit 1.2.3-korg