NIFI-881: Added support for Proxy Host and Proxy Port properties to InvokeHTTP

Signed-off-by: Aldrin Piri <aldrin@apache.org>
This commit is contained in:
Mark Payne 2015-08-20 20:36:36 -04:00 committed by Aldrin Piri
parent 4f6c1cfff3
commit 82d32230e6
1 changed files with 57 additions and 15 deletions

View File

@ -25,9 +25,13 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.URL; import java.net.URL;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -56,6 +60,8 @@ import org.apache.nifi.annotation.behavior.WritesAttributes;
import org.apache.nifi.annotation.documentation.CapabilityDescription; import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags; import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.ValidationContext;
import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.flowfile.FlowFile;
import org.apache.nifi.logging.ProcessorLog; import org.apache.nifi.logging.ProcessorLog;
import org.apache.nifi.processor.AbstractProcessor; import org.apache.nifi.processor.AbstractProcessor;
@ -115,7 +121,19 @@ public final class InvokeHTTP extends AbstractProcessor {
attributesToSend = Pattern.compile(trimmedValue); attributesToSend = Pattern.compile(trimmedValue);
} }
} }
}
@Override
protected Collection<ValidationResult> customValidate(final ValidationContext validationContext) {
final List<ValidationResult> results = new ArrayList<>(1);
final boolean proxyHostSet = validationContext.getProperty(Config.PROP_PROXY_HOST).isSet();
final boolean proxyPortSet = validationContext.getProperty(Config.PROP_PROXY_PORT).isSet();
if ((proxyHostSet && !proxyPortSet) || (!proxyHostSet && proxyPortSet)) {
results.add(new ValidationResult.Builder().subject("Proxy Host and Port").valid(false).explanation("If Proxy Host or Proxy Port is set, both must be set").build());
}
return results;
} }
@Override @Override
@ -220,6 +238,20 @@ public final class InvokeHTTP extends AbstractProcessor {
.identifiesControllerService(SSLContextService.class) .identifiesControllerService(SSLContextService.class)
.build(); .build();
public static final PropertyDescriptor PROP_PROXY_HOST = new PropertyDescriptor.Builder()
.name("Proxy Host")
.description("The fully qualified hostname or IP address of the proxy server")
.required(false)
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.build();
public static final PropertyDescriptor PROP_PROXY_PORT = new PropertyDescriptor.Builder()
.name("Proxy Port")
.description("The port of the proxy server")
.required(false)
.addValidator(StandardValidators.PORT_VALIDATOR)
.build();
// Per RFC 7235, 2617, and 2616. // Per RFC 7235, 2617, and 2616.
// basic-credentials = base64-user-pass // basic-credentials = base64-user-pass
// base64-user-pass = userid ":" password // base64-user-pass = userid ":" password
@ -249,16 +281,18 @@ public final class InvokeHTTP extends AbstractProcessor {
.build(); .build();
public static final List<PropertyDescriptor> PROPERTIES = Collections.unmodifiableList(Arrays.asList( public static final List<PropertyDescriptor> PROPERTIES = Collections.unmodifiableList(Arrays.asList(
PROP_METHOD, PROP_METHOD,
PROP_URL, PROP_URL,
PROP_SSL_CONTEXT_SERVICE, PROP_SSL_CONTEXT_SERVICE,
PROP_CONNECT_TIMEOUT, PROP_CONNECT_TIMEOUT,
PROP_READ_TIMEOUT, PROP_READ_TIMEOUT,
PROP_DATE_HEADER, PROP_DATE_HEADER,
PROP_FOLLOW_REDIRECTS, PROP_FOLLOW_REDIRECTS,
PROP_ATTRIBUTES_TO_SEND, PROP_ATTRIBUTES_TO_SEND,
PROP_BASIC_AUTH_USERNAME, PROP_BASIC_AUTH_USERNAME,
PROP_BASIC_AUTH_PASSWORD PROP_BASIC_AUTH_PASSWORD,
PROP_PROXY_HOST,
PROP_PROXY_PORT
)); ));
// property to allow the hostname verifier to be overridden // property to allow the hostname verifier to be overridden
@ -386,10 +420,10 @@ public final class InvokeHTTP extends AbstractProcessor {
private void openConnection() throws IOException { private void openConnection() throws IOException {
// read the url property from the context // read the url property from the context
String urlstr = trimToEmpty(context.getProperty(PROP_URL).evaluateAttributeExpressions(request).getValue()); final String urlstr = trimToEmpty(context.getProperty(PROP_URL).evaluateAttributeExpressions(request).getValue());
URL url = new URL(urlstr); final URL url = new URL(urlstr);
String authuser = trimToEmpty(context.getProperty(PROP_BASIC_AUTH_USERNAME).getValue()); final String authuser = trimToEmpty(context.getProperty(PROP_BASIC_AUTH_USERNAME).getValue());
String authpass = trimToEmpty(context.getProperty(PROP_BASIC_AUTH_PASSWORD).getValue()); final String authpass = trimToEmpty(context.getProperty(PROP_BASIC_AUTH_PASSWORD).getValue());
String authstrencoded = null; String authstrencoded = null;
if (!authuser.isEmpty()) { if (!authuser.isEmpty()) {
@ -399,7 +433,15 @@ public final class InvokeHTTP extends AbstractProcessor {
} }
// create the connection // create the connection
conn = (HttpURLConnection) url.openConnection(); final String proxyHost = context.getProperty(PROP_PROXY_HOST).getValue();
final Integer proxyPort = context.getProperty(PROP_PROXY_PORT).asInteger();
if (proxyHost == null || proxyPort == null) {
conn = (HttpURLConnection) url.openConnection();
} else {
final Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
conn = (HttpURLConnection) url.openConnection(proxy);
}
if (authstrencoded != null) { if (authstrencoded != null) {
conn.setRequestProperty("Authorization", "Basic " + authstrencoded); conn.setRequestProperty("Authorization", "Basic " + authstrencoded);
} }