package com.intuit.tank.runner.method; /* * #%L * Intuit Tank Agent (apiharness) * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.harness.APITestHarness; import com.intuit.tank.harness.data.AssignmentData; import com.intuit.tank.harness.data.HDRequest; import com.intuit.tank.harness.data.HDResponse; import com.intuit.tank.harness.data.Header; import com.intuit.tank.harness.data.RequestStep; import com.intuit.tank.harness.data.ValidationData; import com.intuit.tank.harness.functions.FunctionHandler; import com.intuit.tank.harness.logging.LogUtil; import com.intuit.tank.harness.test.data.Variables; import com.intuit.tank.http.BaseRequest; import com.intuit.tank.http.BaseResponse; import com.intuit.tank.http.HttpRequestFactory; import com.intuit.tank.http.HttpResponseFactory; import com.intuit.tank.http.xml.XMLRequest; import com.intuit.tank.logging.LogEventType; import com.intuit.tank.logging.LoggingProfile; import com.intuit.tank.results.TankResultBuilder; import com.intuit.tank.runner.ErrorContainer; import com.intuit.tank.runner.TestStepContext; import com.intuit.tank.script.RequestDataPhase; import com.intuit.tank.script.ScriptConstants; import com.intuit.tank.vm.api.enumerated.ValidationType; import com.intuit.tank.vm.common.TankConstants; import com.intuit.tank.vm.common.util.ValidationUtil; public class RequestRunner implements Runner { private static Logger LOG = LogManager.getLogger(RequestRunner.class); private String uniqueName; private BaseRequest baseRequest; private BaseResponse baseResponse; private RequestStep testStep; private Variables variables; private String host; private String loggingKey; private String method; private String path; private String port; private String reqFormat; private String protocol; private String respFormat; private TestStepContext tsc; private HDResponse response; /** * @param context */ RequestRunner(TestStepContext context) { this.tsc = context; variables = context.getVariables(); testStep = (RequestStep) context.getTestStep(); response = testStep.getResponse(); uniqueName = context.getUniqueName(); initialize(); } /** * initializes the variables */ private void initialize() { HDRequest request = testStep.getRequest(); HDResponse response = testStep.getResponse(); // set proxy if proxyVariables are set String proxy = variables.getVariable("TANK_HTTP_PROXY"); if (StringUtils.isNotBlank(proxy)) { try { String[] proxyInfo = StringUtils.split(":"); int proxyPort = 80; if (proxy.startsWith("http://")) { proxy = proxy.substring(7); } else if (proxy.startsWith("https://")) { proxy = proxy.substring(8); proxyPort = 443; } if (proxyInfo.length > 2) { LOG.error("Proxy should be specified as proxyHost:proxyPort."); } else { if (proxyInfo.length == 2) { proxyPort = NumberUtils.toInt(proxyInfo[1]); } String proxyHost = proxyInfo[0]; tsc.getHttpClient().setProxy(proxyHost, proxyPort); } } catch (Exception e) { LOG.error("Error setting proxy " + proxy + ": " + e, e); } } host = processHost(request.getHost()); loggingKey = request.getLoggingKey(); method = request.getMethod(); path = processPath(request.getPath()); reqFormat = StringUtils.isEmpty(request.getReqFormat()) ? "nvp" : request.getReqFormat(); protocol = processProtocol(request.getProtocol()); port = processPort(request.getPort()); if (port == null) { port = "-1"; } respFormat = StringUtils.isEmpty(response.getRespFormat()) ? "json" : response.getRespFormat(); baseRequest = HttpRequestFactory.getHttpRequest(reqFormat, tsc.getHttpClient()); baseRequest.setHost(host); baseRequest.setProtocol(protocol); baseRequest.setPort(port); baseRequest.setPath(path); List<Header> postDatas = request.getPostDatas(); List<Header> queryStringPairs = request.getQueryString(); List<Header> requestHeaders = request.getRequestHeaders(); processQueryString(queryStringPairs); populateHeaders(requestHeaders); baseResponse = HttpResponseFactory.getHttpResponse(respFormat); populatePostData(postDatas); if (!StringUtils.isBlank(request.getPayload()) && !reqFormat.equalsIgnoreCase(ScriptConstants.NVP_TYPE)) { String payload = request.getPayload(); baseRequest.setBody(variables.evaluate(payload)); } LogUtil.getLogEvent().setRequest(baseRequest); //unset proxy TODO: add proxy and noproxy requ3est objects tsc.getHttpClient().setProxy(null, -1); } /* * (non-Javadoc) * * @see com.intuit.tank.runner.method.Runner#execute() */ @Override public String execute() { String validation = TankConstants.HTTP_CASE_PASS; if (APITestHarness.getInstance().getAgentRunData().getActiveProfile() == LoggingProfile.TRACE) { LOG.info(LogUtil.getLogMessage("Executing step...")); } if (checkPreValidations()) { if (LOG.isDebugEnabled() || APITestHarness.getInstance().getAgentRunData().getActiveProfile() == LoggingProfile.VERBOSE || APITestHarness.getInstance().getAgentRunData().getActiveProfile() == LoggingProfile.TRACE) { LOG.info(LogUtil.getLogMessage("Skipping request because of Pre-Validation.")); } return TankConstants.HTTP_CASE_PASS; } try { if (method.equalsIgnoreCase("GET")) { baseRequest.doGet(baseResponse); } else if (method.equalsIgnoreCase("POST")) { baseRequest.doPost(baseResponse); } else if (method.equalsIgnoreCase("PUT")) { baseRequest.doPut(baseResponse); } else if (method.equalsIgnoreCase("DELETE")) { baseRequest.doDelete(baseResponse); } } catch (Throwable e) { LOG.error( LogUtil.getLogMessage("Unexpected Exception executing request: " + e.toString(), LogEventType.IO), e); } if (APITestHarness.getInstance().getTPMonitor().isEnabled()) { if (!StringUtils.isEmpty(loggingKey)) { APITestHarness.getInstance().getTPMonitor().addToMap(loggingKey, baseRequest); } } validation = processValidations(variables, "", baseResponse); LogUtil.getLogEvent().setValidationStatus(validation); if (!validation.equalsIgnoreCase(TankConstants.HTTP_CASE_PASS)) { LOG.error(LogUtil.getLogMessage("Validation Failed", LogEventType.Validation, LoggingProfile.VERBOSE)); } if (APITestHarness.getInstance().getAgentRunData().getActiveProfile() == LoggingProfile.VERBOSE) { LOG.info(LogUtil.getLogMessage("Made Call ...")); } processVariables(variables, baseResponse); if (APITestHarness.getInstance().getAgentRunData().getActiveProfile() == LoggingProfile.TRACE) { LOG.info(LogUtil.getLogMessage("Variables Processed. Exiting ...")); } if (!APITestHarness.getInstance().isDebug()) { processPerfResponse(validation, uniqueName, Integer.valueOf(variables.getVariable("THREAD_ID")), baseRequest, baseResponse); } tsc.setRequest(baseRequest); tsc.setResponse(baseResponse); return validation; } /** * * Processes the perf response, logs the results. * * @param result * @param uniqueName * @param threadNum * @param req * @param resp */ private void processPerfResponse(String result, String uniqueName, int threadNum, BaseRequest req, BaseResponse resp) { try { TankResultBuilder builder = new TankResultBuilder(); builder.withJobId(APITestHarness.getInstance().getAgentRunData().getJobId()) .withInstanceId(APITestHarness.getInstance().getAgentRunData().getInstanceId()); if (resp != null) { builder.withResponseTime((int) resp.getResponseTime()); builder.withStatusCode(resp.getHttpCode()); builder.withResponseSize(resp.getResponseBytes() != null ? resp.getResponseBytes().length : 0); } if (!result.equalsIgnoreCase(TankConstants.HTTP_CASE_PASS)) { builder.withError(true); } if (!StringUtils.isEmpty(loggingKey)) { builder.withRequestName(loggingKey); APITestHarness.getInstance().queueTimingResult(builder.build()); } // else { // APITestHarness.getInstance().getTPMonitor().addToMap(TPSMonitor.NOT_LOGGED_KEY, req); // } if (tsc.getTimerMap().isActive()) { this.tsc.getTimerMap().addResult(builder.build()); } } catch (Exception e) { LOG.warn("Error: req" + req + " : resp=" + resp + " : " + e, e); } } /** * Process the validation * * @return */ private boolean checkPreValidations() { boolean ret = false; List<ValidationData> validations = new ArrayList<ValidationData>(response.getValidation().getHeaderValidation()); validations.addAll(response.getValidation().getBodyValidation()); validations.addAll(response.getValidation().getCookieValidation()); validations = filterPhase(RequestDataPhase.POST_REQUEST, validations); for (ValidationData item : validations) { item = item.copy(); if (ValidationUtil.isVariable(item.getKey()) && variables.variableExists(item.getKey())) { item.setKey(variables.getVariable(item.getKey())); } else if (ValidationUtil.isFunction(item.getKey())) { item.setKey(FunctionHandler.executeFunction(item.getKey(), variables)); } if (ValidationUtil.isVariable(item.getValue()) && variables.variableExists(item.getValue())) { item.setValue(variables.getVariable(item.getValue())); } else if (ValidationUtil.isFunction(item.getValue())) { item.setValue(FunctionHandler.executeFunction(item.getValue(), variables)); } item.setKey(variables.evaluate(item.getKey())); item.setValue(variables.evaluate(item.getValue())); if (item.getKey() != null && item.getValue() != null) { ret = evaluateResult(item.getKey(), item.getValue(), item.getCondition(), variables); } } return ret; } /** * Process the validation * * @return */ private String processValidations(Variables variables, String uniqueName, BaseResponse reqResponse) { String testStepResult = TankConstants.HTTP_CASE_PASS; List<ValidationData> headerValidation = filterPhase(RequestDataPhase.PRE_REQUEST, response.getValidation() .getHeaderValidation()); List<ValidationData> bodyValidation = filterPhase(RequestDataPhase.PRE_REQUEST, response.getValidation() .getBodyValidation()); List<ValidationData> cookieValidation = filterPhase(RequestDataPhase.PRE_REQUEST, response.getValidation() .getCookieValidation()); if (!headerValidation.isEmpty() || !bodyValidation.isEmpty() || !cookieValidation.isEmpty()) { String testCaseResult = TankConstants.HTTP_CASE_PASS; if (reqResponse.getHttpCode() == -1) { LOG.error(LogUtil.getLogMessage("Failure due to IO Error.")); return TankConstants.HTTP_CASE_FAIL; } for (ValidationData item : headerValidation) { ValidationData original = item.copy(); item = item.copy(); if (ValidationUtil.isVariable(item.getValue()) && variables.variableExists(item.getValue())) { item.setValue(variables.getVariable(item.getValue())); } else if (ValidationUtil.isFunction(item.getValue())) { item.setValue(FunctionHandler.executeFunction(item.getValue(), variables)); } item.setValue(variables.evaluate(item.getValue())); if (item.getKey().toUpperCase().startsWith(TankConstants.HTTP_CASE_HTTP)) { testCaseResult = this.validateHTTP(original, item, variables, reqResponse.getHttpCode(), reqResponse.getHttpMsg(), uniqueName); } else { testCaseResult = this.validateHeader(original, item, variables, reqResponse, uniqueName); } if (!testCaseResult.equalsIgnoreCase(TankConstants.HTTP_CASE_PASS)) { testStepResult = TankConstants.HTTP_CASE_FAIL; } } for (ValidationData item : bodyValidation) { ValidationData original = item.copy(); item = item.copy(); if (ValidationUtil.isVariable(item.getValue()) && variables.variableExists(item.getValue())) { item.setValue(variables.getVariable(item.getValue())); } else if (ValidationUtil.isFunction(item.getValue())) { item.setValue(FunctionHandler.executeFunction(item.getValue(), variables)); } item.setValue(variables.evaluate(item.getValue())); testCaseResult = validateBody(original, item, variables, reqResponse, uniqueName); if (!testCaseResult.equalsIgnoreCase(TankConstants.HTTP_CASE_PASS)) { testStepResult = TankConstants.HTTP_CASE_FAIL; } } for (ValidationData item : cookieValidation) { ValidationData original = item.copy(); item = item.copy(); if (ValidationUtil.isVariable(item.getValue()) && variables.variableExists(item.getValue())) { item.setValue(variables.getVariable(item.getValue())); } else if (ValidationUtil.isFunction(item.getValue())) { item.setValue(FunctionHandler.executeFunction(item.getValue(), variables)); } item.setValue(variables.evaluate(item.getValue())); testCaseResult = validateCookie(original, item, variables, reqResponse, uniqueName); if (!testCaseResult.equalsIgnoreCase(TankConstants.HTTP_CASE_PASS)) { testStepResult = TankConstants.HTTP_CASE_FAIL; } } } return testStepResult; } /** * @param preRequest * @param headerValidation * @return */ private List<ValidationData> filterPhase(RequestDataPhase phase, List<ValidationData> list) { List<ValidationData> ret = new ArrayList<ValidationData>(); for (ValidationData d : list) { if (d.getPhase() != phase) { ret.add(d); } } return ret; } /** * Populate the function data * * @param value * The function name * @return The function value */ private String processFunction(String value, Variables variables) { String returnValue = value; if (FunctionHandler.validFunction(returnValue)) { returnValue = FunctionHandler.executeFunction(returnValue, variables); } return returnValue != null ? returnValue : ""; } /** * Process the assignment defined in the response content and update the Variables set with updated values. * * @param variables * @param reqResponse */ private void processVariables(Variables variables, BaseResponse reqResponse) { List<AssignmentData> bodyVariable = response.getAssignment().getBodyVariable(); List<AssignmentData> headerVariable = this.response.getAssignment().getHeaderVariable(); List<AssignmentData> cookieVariable = this.response.getAssignment().getCookieVariable(); if (reqResponse.getHttpCode() == -1) { return; } for (AssignmentData assignmentData : headerVariable) { String headerKey = stripEquals(assignmentData.getValue()); if (ValidationUtil.isVariable(headerKey)) { headerKey = variables.getVariable(headerKey); } else if (ValidationUtil.isFunction(headerKey)) { headerKey = FunctionHandler.executeFunction(headerKey, variables); } headerKey = variables.evaluate(headerKey); String realValue = reqResponse.getHttpHeader(headerKey); if (realValue == null) { realValue = ""; } LOG.debug("Setting variable " + assignmentData.getKey() + "=" + realValue); variables.addVariable(assignmentData.getKey(), realValue); } for (AssignmentData assignmentData : cookieVariable) { String cookieKey = stripEquals(assignmentData.getValue()); if (ValidationUtil.isVariable(cookieKey)) { cookieKey = variables.getVariable(cookieKey); } else if (ValidationUtil.isFunction(cookieKey)) { cookieKey = FunctionHandler.executeFunction(cookieKey, variables); } cookieKey = variables.evaluate(cookieKey); String realValue = reqResponse.getCookie(cookieKey); if (realValue == null) { realValue = ""; } variables.addVariable(assignmentData.getKey(), realValue); LOG.debug("Setting variable " + assignmentData.getKey() + "=" + realValue); } for (AssignmentData assignmentData : bodyVariable) { variables.addVariable("RESPONSE_BODY", reqResponse.getResponseBody()); String value = stripEquals(assignmentData.getValue()); String realValue = null; if (ValidationUtil.isFunction(value)) { realValue = FunctionHandler.executeFunction(value, variables, reqResponse.getResponseBody()); } else { value = variables.evaluate(value); realValue = reqResponse.getValue(value); } if (realValue == null) { realValue = ""; } variables.addVariable(assignmentData.getKey(), realValue); LOG.debug("Setting variable " + assignmentData.getKey() + "=" + realValue); variables.removeVariable("RESPONSE_BODY"); } } private String stripEquals(String value) { if (value.length() > 0 && value.startsWith("=")) { value = value.substring(1); } return value; } /** * Populate the variable data * * @param value * The variable name * @return The variable value */ private String processVariable(Variables variables, String value) { if (value == null) { return null; } else if (StringUtils.isEmpty(value)) { return ""; } String returnValue = value; if (ValidationUtil.isVariable(returnValue)) { returnValue = variables.getVariable(returnValue); } return returnValue != null ? returnValue : ""; } /** * Validate the raw HTTP data * * @param item * The validation item * @return TRUE if matches; FALSE otherwise */ private String validateHTTP(ValidationData original, ValidationData item, Variables variables, int httpCode, String httpMsg, String uniqueName) { String actualValue = null; if (item.getKey().equalsIgnoreCase("HTTPRESPONSECODE")) { actualValue = "" + httpCode; } else if (item.getKey().equalsIgnoreCase("HTTPRESPONSEMESSAGE")) { actualValue = httpMsg; } boolean result = this.evaluateResult(actualValue, item.getValue(), item.getCondition(), variables); if (result) { return TankConstants.HTTP_CASE_PASS; } String msg = "Failed http validation: value = " + actualValue; LOG.error(LogUtil.getLogMessage(item.toString() + " " + msg, LogEventType.Validation)); tsc.addError(new ErrorContainer("HTTP_CODE", original, item, msg)); return TankConstants.HTTP_CASE_FAIL; } /** * Validate an item against the response header * * @param item * The validation item * @return TRUE if matches; FALSE otherwise */ private String validateHeader(ValidationData original, ValidationData item, Variables variables, BaseResponse reqResponse, String uniqueName) { String actualValue = reqResponse.getHttpHeader(item.getKey()); boolean result = this.evaluateResult(actualValue, item.getValue(), item.getCondition(), variables); if (result) { return TankConstants.HTTP_CASE_PASS; } String msg = "Failed header validation: header value = " + actualValue; LOG.error(LogUtil.getLogMessage(item.toString() + " " + msg, LogEventType.Validation)); tsc.addError(new ErrorContainer("HEADER", original, item, msg)); return TankConstants.HTTP_CASE_FAIL; } /** * Validate an item against the response body * * @param item * The validation item * @return TRUE if matches; FALSE otherwise */ private String validateBody(ValidationData original, ValidationData item, Variables variables, BaseResponse reqResponse, String uniqueName) { String actualValue = reqResponse.getValue(item.getKey()); LOG.debug("Body compare actual value: " + actualValue); boolean result = evaluateResult(actualValue, item.getValue(), item.getCondition(), variables); if (result) { return TankConstants.HTTP_CASE_PASS; } String msg = "Failed body validation: body value = " + actualValue; LOG.error(LogUtil.getLogMessage(item.toString() + " " + msg, LogEventType.Validation, LoggingProfile.USER_VARIABLE)); tsc.addError(new ErrorContainer("BODY", original, item, msg)); return TankConstants.HTTP_CASE_FAIL; } /** * Validate an item against the cookies * * @param item * The validation item * @param item * @return TRUE if matches; FALSE otherwise */ private String validateCookie(ValidationData original, ValidationData item, Variables variables, BaseResponse reqResponse, String uniqueName) { String actualValue = reqResponse.getCookie(item.getKey()); LOG.debug("Cookie compare actual value: " + actualValue); boolean result = evaluateResult(actualValue, item.getValue(), item.getCondition(), variables); if (result) { return TankConstants.HTTP_CASE_PASS; } String msg = "Failed cookie validation: cookie value = " + actualValue; LOG.error(LogUtil.getLogMessage(item.toString() + " " + msg, LogEventType.Validation)); tsc.addError(new ErrorContainer("COOKIE", original, item, msg)); return TankConstants.HTTP_CASE_FAIL; } /** * Evaluate the validation information * * @param name * The test case name * @param actualValue * The actual value from the response * @param expectedValue * The expected value * @param condition * The condition * @return TRUE if matches; FALSE otherwise */ private boolean evaluateResult(String actualValue, String expectedValue, String condition, Variables variables) { if (condition == null) { return false; } boolean testResult = true; expectedValue = processVariable(variables, expectedValue); expectedValue = processFunction(expectedValue, variables); expectedValue = variables.evaluate(expectedValue); ValidationType validationType = ValidationType.getValidationType(condition); if (validationType == ValidationType.empty) { // Process EMPTY testResult = StringUtils.isEmpty(actualValue); } else if (validationType == ValidationType.notempty) { // Process NOTEMPTY testResult = !StringUtils.isEmpty(actualValue); } else if (validationType == ValidationType.equals) { // Process Equals testResult = expectedValue.equalsIgnoreCase(actualValue); } else if (validationType == ValidationType.notequals) { // Process Equals testResult = !expectedValue.equalsIgnoreCase(actualValue); } else if (validationType == ValidationType.contains) { // Process Equals testResult = !StringUtils.isEmpty(actualValue) && actualValue.toLowerCase().contains(expectedValue.toLowerCase()); } else if (validationType == ValidationType.doesnotcontain) { // Process Equals testResult = actualValue == null || !actualValue.toLowerCase().contains(expectedValue.toLowerCase()); } else if (validationType == ValidationType.lessthan) { // Process less than testResult = compare(actualValue, expectedValue) < 0; } else if (validationType == ValidationType.greaterthan) { // Process greater than testResult = compare(actualValue, expectedValue) > 0; } else { testResult = false; } return testResult; } private int compare(String actualValue, String expected) { if (NumberUtils.isNumber(actualValue) && NumberUtils.isNumber(expected)) { Double a = NumberUtils.toDouble(actualValue); Double e = NumberUtils.toDouble(expected); return a.compareTo(e); } return actualValue.compareTo(expected); } /** * Adds the post data to the base request * * @param postDatas */ private void populatePostData(List<Header> postDatas) { for (int i = postDatas.size(); --i >= 0;) { Header header = postDatas.get(i); String value = header.getValue(); if ((baseRequest instanceof XMLRequest) && header.getKey().startsWith("ns:")) { baseRequest.setNamespace(header.getKey().substring(3), value); postDatas.remove(i); } } for (Header header : postDatas) { if (header.getAction().equalsIgnoreCase("remove")) { // this.request.item.getName()); } else if (header.getAction().equalsIgnoreCase("add") || header.getAction().equalsIgnoreCase("set")) { String value = header.getValue(); if (ValidationUtil.isFunction(value)) { value = FunctionHandler.executeFunction(value, variables); } else if (ValidationUtil.isVariable(value)) { value = variables.getVariable(value); } value = variables.evaluate(value); baseRequest.setKey(header.getKey(), value); } } } /** * Adds the headers to the baseRequest. * * @param requestHeaders */ private void populateHeaders(List<Header> requestHeaders) { for (Header header : requestHeaders) { if (header.getAction().equalsIgnoreCase("remove")) { baseRequest.removeHeader(header.getKey()); } else if (header.getAction().equalsIgnoreCase("add") || header.getAction().equalsIgnoreCase("set")) { String value = header.getValue(); if (ValidationUtil.isFunction(value)) { value = FunctionHandler.executeFunction(value, variables); } else if (ValidationUtil.isVariable(value)) { value = variables.getVariable(value); } value = variables.evaluate(value); if (header.getKey().equalsIgnoreCase("Content-Type")) { baseRequest.setContentType(value); } else { baseRequest.addHeader(header.getKey(), value); } } } // now add configured headers Map<String, String> headerMap = tsc.getParent().getHeaderMap(); if (headerMap != null) { for (Entry<String, String> entry : headerMap.entrySet()) { baseRequest.addHeader(entry.getKey(), entry.getValue()); } } } /** * Adds the query string to the baseRequest * * @param queryString */ private void processQueryString(List<Header> queryString) { for (Header header : queryString) { if (header.getAction().equalsIgnoreCase("remove")) { baseRequest.removeURLVariable(header.getKey()); } else if (header.getAction().equalsIgnoreCase("add") || header.getAction().equalsIgnoreCase("set")) { String value = header.getValue(); if (ValidationUtil.isFunction(value)) { value = FunctionHandler.executeFunction(value, variables); } else if (ValidationUtil.isVariable(value)) { value = variables.getVariable(value); } value = variables.evaluate(value); baseRequest.addURLVariable(header.getKey(), value); } } } /** * process the value of the host and returns the actual value if it is a function or a variable definition. * * @param host * @return */ private String processHost(String host) { if (host != null) { if (ValidationUtil.isFunction(host)) { host = FunctionHandler.executeFunction(host, variables); } else if (ValidationUtil.isVariable(host)) { host = variables.getVariable(host); } host = variables.evaluate(host); } return host; } /** * process the value of the path and returns the actual value if it is a function. * * @param path * @return */ private String processPath(String path) { if (ValidationUtil.isFunction(path)) { path = FunctionHandler.executeFunction(path, variables); } else if (ValidationUtil.isVariable(path)) { path = variables.getVariable(path); } if (StringUtils.isBlank(path)) { path = "/"; } path = variables.evaluate(path); return path; } /** * process the value of the host and returns the actual value if it is a function definition. * * @param port * @return */ private String processPort(String port) { if (ValidationUtil.isFunction(port)) { port = FunctionHandler.executeFunction(port, variables); } return port; } private String processProtocol(String protocol) { if (protocol != null) { if (ValidationUtil.isFunction(protocol)) { protocol = FunctionHandler.executeFunction(protocol, variables); } else if (ValidationUtil.isVariable(protocol)) { protocol = variables.getVariable(protocol); } protocol = variables.evaluate(protocol); } return protocol; } }