Repository: nifi Updated Branches: refs/heads/0.x fa8341961 -> 90c749d73
NIFI-1620 Allow empty Content-Type in InvokeHTTP processor This closes #272. Signed-off-by: Aldrin Piri <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/90c749d7 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/90c749d7 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/90c749d7 Branch: refs/heads/0.x Commit: 90c749d736060229d0e8a92da67d9e5467b0aa8b Parents: fa83419 Author: Pierre Villard <[email protected]> Authored: Sat Mar 12 17:13:04 2016 +0100 Committer: Aldrin Piri <[email protected]> Committed: Sat Jun 18 12:48:38 2016 -0400 ---------------------------------------------------------------------- .../nifi/processors/standard/InvokeHTTP.java | 48 +++++++++++++------- .../standard/util/TestInvokeHttpCommon.java | 34 +++++++++++++- 2 files changed, 63 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/90c749d7/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java index 4470bf6..c85997d 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java @@ -221,9 +221,18 @@ public final class InvokeHTTP extends AbstractProcessor { .required(true) .expressionLanguageSupported(true) .defaultValue("${" + CoreAttributes.MIME_TYPE.key() + "}") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.createAttributeExpressionLanguageValidator(AttributeExpression.ResultType.STRING)) .build(); + public static final PropertyDescriptor PROP_SEND_BODY = new PropertyDescriptor.Builder() + .name("send-message-body") + .displayName("Send Message Body") + .description("If true, sends the HTTP message body on POST/PUT requests (default). If false, suppresses the message body and content-type header for these requests.") + .defaultValue("true") + .allowableValues("true", "false") + .required(false) + .build(); + // Per RFC 7235, 2617, and 2616. // basic-credentials = base64-user-pass // base64-user-pass = userid ":" password @@ -347,6 +356,7 @@ public final class InvokeHTTP extends AbstractProcessor { PROP_TRUSTED_HOSTNAME, PROP_ADD_HEADERS_TO_REQUEST, PROP_CONTENT_TYPE, + PROP_SEND_BODY, PROP_USE_CHUNKED_ENCODING, PROP_PENALIZE_NO_RETRY)); @@ -761,24 +771,28 @@ public final class InvokeHTTP extends AbstractProcessor { } private RequestBody getRequestBodyToSend(final ProcessSession session, final ProcessContext context, final FlowFile requestFlowFile) { - return new RequestBody() { - @Override - public MediaType contentType() { - String contentType = context.getProperty(PROP_CONTENT_TYPE).evaluateAttributeExpressions(requestFlowFile).getValue(); - contentType = StringUtils.isBlank(contentType) ? DEFAULT_CONTENT_TYPE : contentType; - return MediaType.parse(contentType); - } + if(context.getProperty(PROP_SEND_BODY).asBoolean()) { + return new RequestBody() { + @Override + public MediaType contentType() { + String contentType = context.getProperty(PROP_CONTENT_TYPE).evaluateAttributeExpressions(requestFlowFile).getValue(); + contentType = StringUtils.isBlank(contentType) ? DEFAULT_CONTENT_TYPE : contentType; + return MediaType.parse(contentType); + } - @Override - public void writeTo(BufferedSink sink) throws IOException { - session.exportTo(requestFlowFile, sink.outputStream()); - } + @Override + public void writeTo(BufferedSink sink) throws IOException { + session.exportTo(requestFlowFile, sink.outputStream()); + } - @Override - public long contentLength(){ - return useChunked ? -1 : requestFlowFile.getSize(); - } - }; + @Override + public long contentLength(){ + return useChunked ? -1 : requestFlowFile.getSize(); + } + }; + } else { + return RequestBody.create(null, new byte[0]); + } } private Request.Builder setHeaderProperties(final ProcessContext context, Request.Builder requestBuilder, final FlowFile requestFlowFile) { http://git-wip-us.apache.org/repos/asf/nifi/blob/90c749d7/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java index d0f29b9..a0dade1 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java @@ -979,6 +979,26 @@ public abstract class TestInvokeHttpCommon { } @Test + public void testPostWithEmptyBodySet() throws Exception { + final String suppliedMimeType = ""; + addHandler(new MutativeMethodHandler(MutativeMethod.POST, suppliedMimeType)); + + runner.setNonLoopConnection(false); + runner.setProperty(InvokeHTTP.PROP_METHOD, "POST"); + runner.setProperty(InvokeHTTP.PROP_URL, url + "/post"); + runner.setProperty(InvokeHTTP.PROP_CONTENT_TYPE, suppliedMimeType); + runner.setProperty(InvokeHTTP.PROP_SEND_BODY, "false"); + + final Map<String, String> attrs = new HashMap<>(); + attrs.put(CoreAttributes.MIME_TYPE.key(), suppliedMimeType); + runner.enqueue("Hello".getBytes(), attrs); + + runner.run(1); + runner.assertTransferCount(InvokeHTTP.REL_SUCCESS_REQ, 1); + runner.assertTransferCount(InvokeHTTP.REL_RESPONSE, 1); + } + + @Test public void testPutWithMimeType() throws Exception { final String suppliedMimeType = "text/plain"; addHandler(new MutativeMethodHandler(MutativeMethod.PUT, suppliedMimeType)); @@ -1385,10 +1405,20 @@ public abstract class TestInvokeHttpCommon { baseRequest.setHandled(true); if(method.name().equals(request.getMethod())) { - assertEquals(this.expectedContentType,request.getHeader("Content-Type")); + if(this.expectedContentType.isEmpty()) { + Assert.assertNull(request.getHeader("Content-Type")); + } else { + assertEquals(this.expectedContentType,request.getHeader("Content-Type")); + } + final String body = request.getReader().readLine(); this.trackedHeaderValue = baseRequest.getHttpFields().get(headerToTrack); - assertEquals("Hello", body); + + if(this.expectedContentType.isEmpty()) { + Assert.assertNull(body); + } else { + assertEquals("Hello", body); + } } else { response.setStatus(404); response.setContentType("text/plain");
