NIFI-3408 Add exception class when InvokeHTTP fails

This closes #1467.
This commit is contained in:
Giovanni Lanzani 2017-02-02 16:49:15 +01:00 committed by Pierre Villard
parent 229b20f395
commit 31b943d2c1
2 changed files with 32 additions and 1 deletions

View File

@ -104,6 +104,7 @@ import org.joda.time.format.DateTimeFormatter;
@WritesAttribute(attribute = "invokehttp.request.url", description = "The request URL"),
@WritesAttribute(attribute = "invokehttp.tx.id", description = "The transaction ID that is returned after reading the response"),
@WritesAttribute(attribute = "invokehttp.remote.dn", description = "The DN of the remote server"),
@WritesAttribute(attribute = "invokehttp.java.exception", description = "The Java exception raised when the processor fails"),
@WritesAttribute(attribute = "user-defined", description = "If the 'Put Response Body In Attribute' property is set then whatever it is set to "
+ "will become the attribute key and the value would be the body of the HTTP response.")})
@DynamicProperty(name = "Header Name", value = "Attribute Expression Language", supportsExpressionLanguage = true, description = "Send request header "
@ -118,6 +119,8 @@ public final class InvokeHTTP extends AbstractProcessor {
public final static String REQUEST_URL = "invokehttp.request.url";
public final static String TRANSACTION_ID = "invokehttp.tx.id";
public final static String REMOTE_DN = "invokehttp.remote.dn";
public final static String EXCEPTION_CLASS = "invokehttp.java.exception";
public static final String DEFAULT_CONTENT_TYPE = "application/octet-stream";
@ -126,7 +129,7 @@ public final class InvokeHTTP extends AbstractProcessor {
// This set includes our strings defined above as well as some standard flowfile
// attributes.
public static final Set<String> IGNORED_ATTRIBUTES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
STATUS_CODE, STATUS_MESSAGE, RESPONSE_BODY, REQUEST_URL, TRANSACTION_ID, REMOTE_DN,
STATUS_CODE, STATUS_MESSAGE, RESPONSE_BODY, REQUEST_URL, TRANSACTION_ID, REMOTE_DN, EXCEPTION_CLASS,
"uuid", "filename", "path")));
// properties
@ -753,6 +756,9 @@ public final class InvokeHTTP extends AbstractProcessor {
if (requestFlowFile != null) {
logger.error("Routing to {} due to exception: {}", new Object[]{REL_FAILURE.getName(), e}, e);
requestFlowFile = session.penalize(requestFlowFile);
String attributeKey = EXCEPTION_CLASS;
String attributeValue = e.getClass().getName();
requestFlowFile = session.putAttribute(requestFlowFile, attributeKey, attributeValue);
// transfer original to failure
session.transfer(requestFlowFile, REL_FAILURE);
} else {

View File

@ -184,6 +184,31 @@ public class TestInvokeHTTP extends TestInvokeHttpCommon {
bundle1.assertAttributeEquals("Content-Type", "text/plain;charset=iso-8859-1");
}
@Test
public void testFailingHttpRequest() throws Exception {
runner = TestRunners.newTestRunner(InvokeHTTP.class);
// Remember: we expect that connecting to the following URL should raise a Java exception
runner.setProperty(InvokeHTTP.PROP_URL, "http://127.0.0.1:0");
createFlowFiles(runner);
runner.run();
runner.assertTransferCount(InvokeHTTP.REL_SUCCESS_REQ, 0);
runner.assertTransferCount(InvokeHTTP.REL_RESPONSE, 0);
runner.assertTransferCount(InvokeHTTP.REL_RETRY, 0);
runner.assertTransferCount(InvokeHTTP.REL_NO_RETRY, 0);
runner.assertTransferCount(InvokeHTTP.REL_FAILURE, 1);
runner.assertPenalizeCount(1);
// expected in request java.exception
final MockFlowFile bundle = runner.getFlowFilesForRelationship(InvokeHTTP.REL_FAILURE).get(0);
bundle.assertAttributeEquals(InvokeHTTP.EXCEPTION_CLASS, "java.lang.IllegalArgumentException");
}
public static class MyProxyHandler extends AbstractHandler {
@Override