in core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/Proxy.java [83:128]
public void handle(HttpExchange t) throws IOException {
if (loader != null) {
String errorMessage = "Cannot initialize the action more than once.";
System.err.println(errorMessage);
Proxy.writeError(t, errorMessage);
return;
}
try {
InputStream is = t.getRequestBody();
JsonParser parser = new JsonParser();
JsonElement ie = parser.parse(new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)));
JsonObject inputObject = ie.getAsJsonObject();
if (inputObject.has("value")) {
JsonObject message = inputObject.getAsJsonObject("value");
if (message.has("main") && message.has("code")) {
String mainClass = message.getAsJsonPrimitive("main").getAsString();
String base64Jar = message.getAsJsonPrimitive("code").getAsString();
// FIXME: this is obviously not very useful. The idea is that we
// will implement/use a streaming parser for the incoming JSON object so that we
// can stream the contents of the jar straight to a file.
InputStream jarIs = new ByteArrayInputStream(base64Jar.getBytes(StandardCharsets.UTF_8));
// Save the bytes to a file.
Path jarPath = JarLoader.saveBase64EncodedFile(jarIs);
// Start up the custom classloader. This also checks that the
// main method exists.
loader = new JarLoader(jarPath, mainClass);
Proxy.writeResponse(t, 200, "OK");
return;
}
}
Proxy.writeError(t, "Missing main/no code to execute.");
return;
} catch (Exception e) {
e.printStackTrace(System.err);
writeLogMarkers();
Proxy.writeError(t, "An error has occurred (see logs for details): " + e);
return;
}
}