@Override
  protected void doHandle(RestRequest restRequest, RestResponseChannel restResponseChannel,
      Callback<ReadableStreamChannel> callback) throws RestServiceException {

    // Create the channel to read the request body
    RetainingAsyncWritableChannel channel = new RetainingAsyncWritableChannel();

    // inject metrics for batch delete
    RestRequestMetrics requestMetrics =
        metrics.batchDeleteMetricsGroup.getRestRequestMetrics(restRequest.isSslUsed(), false);
    restRequest.getMetricsTracker().injectMetrics(requestMetrics);

    // Pass the callback to handle the response
    restRequest.readInto(channel,
        parseRequestBodyAndDeleteCallback(channel, restRequest, deleteBlobHandler, restResponseChannel, callback));
  }
Handles the S3 request and constructs the response.

@param restRequest         the {@link RestRequest} that contains the request headers and body.
@param restResponseChannel the {@link RestResponseChannel} that contains the response headers and body.
@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/S3BatchDeleteHandler.java