@Override public CompletableFuture<ResponseInfo<String>> execute(RequestInfo<String> request, Executor longRunningTaskExecutor, ChannelHandlerContext ctx) { List<String> hashesFound = new ArrayList<>(); for (InterfaceHttpData multipartData : request.getMultipartParts()) { String name = multipartData.getName(); byte[] payloadBytes; try { payloadBytes = ((HttpData)multipartData).get(); } catch (IOException e) { throw new RuntimeException(e); } String filename = null; switch (multipartData.getHttpDataType()) { case Attribute: // Do nothing - filename stays null break; case FileUpload: filename = ((FileUpload)multipartData).getFilename(); break; default: throw new RuntimeException("Unsupported multipart type: " + multipartData.getHttpDataType().name()); } hashesFound.add(getHashForMultipartPayload(name, filename, payloadBytes)); } return CompletableFuture.completedFuture(ResponseInfo.newBuilder(StringUtils.join(hashesFound, ",")).build()); }