private Callback<Void> securityProcessResponseCallback() {
      return buildCallback(frontendMetrics.putBlobSecurityProcessResponseMetrics, securityCheckResult -> {
        // Create xml response to send to user
        RequestPath requestPath = (RequestPath) restRequest.getArgs().get(REQUEST_PATH);
        NamedBlobPath namedBlobPath = NamedBlobPath.parse(requestPath, restRequest.getArgs());
        String bucket = namedBlobPath.getContainerName();
        String key = namedBlobPath.getBlobName();
        String eTag = (String) restResponseChannel.getHeader(Headers.LOCATION);
        String s3Location = restRequest.getPath();
        CompleteMultipartUploadResult completeMultipartUploadResult =
            new CompleteMultipartUploadResult(bucket, key, s3Location, eTag);
        LOGGER.debug("Sending response for Multipart upload complete {}", completeMultipartUploadResult);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ObjectMapper objectMapper = new XmlMapper();
        objectMapper.writeValue(outputStream, completeMultipartUploadResult);
        ReadableStreamChannel channel =
            new ByteBufferReadableStreamChannel(ByteBuffer.wrap(outputStream.toByteArray()));
        restResponseChannel.setStatus(ResponseStatus.Ok);
        restResponseChannel.setHeader(Headers.DATE, new GregorianCalendar().getTime());
        restResponseChannel.setHeader(Headers.CONTENT_TYPE, XML_CONTENT_TYPE);
        restResponseChannel.setHeader(Headers.CONTENT_LENGTH, channel.getSize());
        finalCallback.onCompletion(channel, null);
      }, restRequest.getUri(), LOGGER, finalCallback);
    }
After {@link SecurityService#processResponse}, call {@code finalCallback}.
@return a {@link Callback} to be used with {@link SecurityService#processResponse}.
ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3MultipartCompleteUploadHandler.java