Calling java class from mock script
Hi,
I have a mock soap service and want to do some magic with basic auth headers. When I try to import the java.utils.Base64 I get class not found errrors. Are the std java classes not on the classpath?
Searching for this problem only gives examples of custom classes. The documentation and API suggest only a limited set of XML/SOAP/JSON/REST classes.
Thnx,
Wim-Jan
Adding relevant piece of groovy:
note that it is to help clarify the issue and imcomplete since I cut out or substituted sensitive info
import java.utils.Base64
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def alert = com.eviware.soapui.support.UISupport;
log.info("------------- begin call -----------------------------");
def soapRequest = mockRequest.requestContent;
def headers = mockRequest.requestHeaders;
def incommingBasicAuth = headers.get("Authorization", "defaultAuth");
if (incommingBasicAuth == "defaultAuth") {
log.info("no basicAuth header found!");
} else {
String decodedAuth = Base64.getDecoder().decode;
def uNamePw = decodedAuth.split(":");
log.info("basicAuth header for " + uNamePw + " found!");
}
log.info("--- request will be forwarded to actual service ----")
String basicAuth = "";
if (incommingBasicAuth == "defaultAuth") {
log.info("Set hardcoded username,password");
String userCredentials = "someuser:somepw";
basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));
} else {
log.info("use username password form incomming request");
basicAuth = incommingBasicAuth;
}
def soapUrl = new URL("https://somewebservice.nl/")
def connection = soapUrl.openConnection()
// insert the basic auth header
connection.setRequestProperty("Authorization", basicAuth);
connection.setRequestMethod("POST")
connection.setRequestProperty("Content-Type", "text/html")
connection.setRequestProperty("SOAPAction", "")
connection.doOutput = true
Writer writer = new OutputStreamWriter(connection.outputStream);
writer.write(soapRequest)
writer.flush()
writer.close()
connection.connect()
def soapResponse = connection.content.text
// work as proxy, i.e. just return response recieved from https://somewebservice.nl/
requestContext.responseMessage = soapResponse
To use a Java class such as Base64 you must have the import and the jdk must be on the class path. Goovy does include the following classes by default.
import java.lang.* import java.util.* import java.io.* import java.net.* import groovy.lang.* import groovy.util.* import java.math.BigInteger import java.math.BigDecimalHowever in this case Groovy already has built in base64 encoding/decoding. http://docs.groovy-lang.org/2.4.3/html/api/org/codehaus/groovy/runtime/EncodingGroovyMethods.html
String encoded = 'AUTHORISATION-TOKEN'.bytes.encodeBase64().toString()
log.info encoded
byte[] decoded = encoded.decodeBase64()
log.info new String(decoded)I'd question the need for mock to actually need to authorisatise, in most cases I test for their presence not their values.