private Callback<Long> fetchStitchRequestBodyCallback(RetainingAsyncWritableChannel channel, BlobInfo blobInfo) {
      return buildCallback(frontendMetrics.postReadStitchRequestMetrics,
          bytesRead -> router.stitchBlob(blobInfo.getBlobProperties(), blobInfo.getUserMetadata(),
              getChunksToStitch(blobInfo.getBlobProperties(), readJsonFromChannel(channel)), null,
              routerStitchBlobCallback(blobInfo),
              QuotaUtils.buildQuotaChargeCallback(restRequest, quotaManager, false)), uri, LOGGER,
          finalCallback);
    }
After reading the body of the stitch request, parse the request body,
and make a call to {@link Router#stitchBlob}.
@param channel the {@link RetainingAsyncWritableChannel} that will contain the request body.
@param blobInfo the {@link BlobInfo} to make the router call with.
@return a {@link Callback} to be used with {@link RestRequest#readInto}.
ambry-frontend/src/main/java/com/github/ambry/frontend/PostBlobHandler.java