private Callback<GetBlobResult> routerCallback() {
      final AtomicReference<GetBlobResult> resultRef = new AtomicReference(null);
      return buildCallback(metrics.getBlobRouterMetrics, result -> {
            resultRef.set(result);
            accountAndContainerInjector.ensureAccountAndContainerInjected(restRequest,
                result.getBlobInfo().getBlobProperties(), metricsGroup);
            securityService.processResponse(restRequest, restResponseChannel, result.getBlobInfo(),
                securityProcessResponseCallback(result));
          }, restRequest.getUri(), LOGGER,
          // Still pass result.getBlobDataChannel() to finalCallback if we already have it.
          (r, e) -> {
            // Even we failed in router operations, we already used some of the resources in router,
            // so let's record the charges for this request.
            securityService.processRequestCharges(restRequest, restResponseChannel, null);
            finalCallback.onCompletion(resultRef.get() != null ? resultRef.get().getBlobDataChannel() : null, e);
          });
    }
After {@link Router#getBlob} finishes, call {@link SecurityService#processResponse}.
@return a {@link Callback} to be used with {@link Router#getBlob}.
ambry-frontend/src/main/java/com/github/ambry/frontend/GetBlobHandler.java