private Callback<Void> securityPostProcessRequestCallback(BlobId blobId) {
      return buildCallback(metrics.getSecurityPostProcessRequestMetrics, result -> {
        // inject encryption metrics if need be
        if (BlobId.isEncrypted(blobId.getID())) {
          RestRequestMetrics restRequestMetrics = metricsGroup.getRestRequestMetrics(restRequest.isSslUsed(), true);
          restRequest.getMetricsTracker().injectMetrics(restRequestMetrics);
        }
        if (subResource == null) {
          router.getBlob(blobId.getID(), options, routerCallback(),
              QuotaUtils.buildQuotaChargeCallback(restRequest, quotaManager, true));
        } else {
          switch (subResource) {
            case BlobInfo:
            case UserMetadata:
            case BlobChunkIds:
            case Segment:
              router.getBlob(blobId.getID(), options, routerCallback(),
                  QuotaUtils.buildQuotaChargeCallback(restRequest, quotaManager, true));
              break;
            case Replicas:
              finalCallback.onCompletion(getReplicasHandler.getReplicas(blobId.getID(), restResponseChannel), null);
              break;
            default:
              LOGGER.error("Unexpected subResource {} when post process request", subResource);
          }
        }
      }, restRequest.getUri(), LOGGER, finalCallback);
    }
After {@link SecurityService#postProcessRequest} finishes, call {@link Router#getBlob} to dget
the blob info from the storage layer.
@param blobId the {@link BlobId} to get info
@return a {@link Callback} to be used with {@link SecurityService#postProcessRequest}.
ambry-frontend/src/main/java/com/github/ambry/frontend/GetBlobHandler.java