private Callback<String> routerStitchBlobCallback(BlobInfo blobInfo,
        BlobProperties propertiesPassedInRouterUpload) {
      return buildCallback(frontendMetrics.putRouterStitchBlobMetrics, blobId -> {
        // The actual blob size is now present in the instance of BlobProperties passed to the router.stitchBlob().
        // Update it in the BlobInfo so that IdConverter can add it to the named blob DB
        blobInfo.getBlobProperties().setBlobSize(propertiesPassedInRouterUpload.getBlobSize());
        idConverter.convert(restRequest, blobId, blobInfo.getBlobProperties(), idConverterCallback(blobInfo, blobId));
      }, uri, LOGGER, deleteDatasetCallback);
    }
After {@link Router#putBlob} finishes, call {@link IdConverter#convert} to convert the returned ID into a format
that will be returned in the "Location" header.
@param blobInfo                       the {@link BlobInfo} to use for security checks.
@param propertiesPassedInRouterUpload the {@link BlobProperties} instance that is passed to Router during upload
@return a {@link Callback} to be used with {@link Router#putBlob}.
ambry-frontend/src/main/java/com/github/ambry/frontend/NamedBlobPutHandler.java