void handle(RestRequest restRequest, RestResponseChannel restResponseChannel,
    Callback<R> callback) throws RestServiceException {
    // 1. Set headers required by Ambry. These become the blob properties.
    NamedBlobPath namedBlobPath = NamedBlobPath.parse(getRequestPath(restRequest), restRequest.getArgs());
    String accountName = namedBlobPath.getAccountName();
    restRequest.setArg(Headers.SERVICE_ID, accountName);
    //Setting default content-type if not provide by S3 client
    if (restRequest.getArgs().get(Headers.CONTENT_TYPE) == null) {
      restRequest.setArg(Headers.AMBRY_CONTENT_TYPE, RestUtils.OCTET_STREAM_CONTENT_TYPE);
    } else {
      restRequest.setArg(Headers.AMBRY_CONTENT_TYPE, restRequest.getArgs().get(Headers.CONTENT_TYPE));
    }
    if (restRequest.getArgs().get(CONTENT_ENCODING) != null) {
      restRequest.setArg(Headers.AMBRY_CONTENT_ENCODING, restRequest.getArgs().get(Headers.CONTENT_ENCODING));
    }

    // 2. Set the internal headers session id and chunk-upload. They are used during for multipart part uploads
    String uploadId = RestUtils.getHeader(restRequest.getArgs(), UPLOAD_ID_QUERY_PARAM, true);
    restRequest.setArg(S3_CHUNK_UPLOAD, true);
    restRequest.setArg(SESSION, uploadId);
    restRequest.setArg(SEND_FAILURE_REASON, Boolean.TRUE);
    restRequest.setArg(TTL, frontendConfig.chunkUploadInitialChunkTtlSecs);

    // TODO [S3] verifyChunkAccountAndContainer? getAndVerifyReservedMetadataBlobId?
    new S3MultipartUploadPartHandler.CallbackChain(restRequest, restResponseChannel, callback).start();
  }
@param restRequest the {@link RestRequest} that contains the request parameters.
@param restResponseChannel the {@link RestResponseChannel} where headers should be set.
@param callback the {@link Callback} to invoke when the response is ready (or if there is an exception).
@throws RestServiceException exception when the processing fails
ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3MultipartUploadPartHandler.java