protected void onResponse(List<ResponseInfo> responseInfoList) {
    for (ResponseInfo responseInfo : responseInfoList) {
      try {
        RequestInfo requestInfo = responseInfo.getRequestInfo();
        if (requestInfo == null) {
          // If requestInfo is null, it means request has been failed previously due to long wait in pending requests
          // queue. The failed request was already handled by one of the managers(PutManager, GetManager, etc). Current
          // response comes from timed-out connection associated with previous request. Router only needs to notify
          // responseHandler to mark the data node resource down.
          DataNodeId dataNodeId = responseInfo.getDataNode();
          responseHandler.onConnectionTimeout(dataNodeId);
        } else {
          if (!responseInfo.isQuotaRejected()) {
            long responseReceiveTime = requestInfo.getResponseHeaderReceiveTime();
            if (responseReceiveTime != -1) {
              routerMetrics.responseReceiveToHandleLatencyMs.update(System.currentTimeMillis() - responseReceiveTime);
            }
          }
          RequestOrResponseType type = ((RequestOrResponse) requestInfo.getRequest()).getRequestType();
          logger.debug("Handling response of type {} for {}", type, requestInfo.getRequest().getCorrelationId());
          switch (type) {
            case PutRequest:
              putManager.handleResponse(responseInfo);
              break;
            case GetRequest:
              getManager.handleResponse(responseInfo);
              break;
            case DeleteRequest:
              deleteManager.handleResponse(responseInfo);
              break;
            case TtlUpdateRequest:
              ttlUpdateManager.handleResponse(responseInfo);
              break;
            case UndeleteRequest:
              undeleteManager.handleResponse(responseInfo);
              break;
            case ReplicateBlobRequest:
              replicateBlobManager.handleResponse(responseInfo);
              break;
            default:
              logger.error("Unexpected response type: {} received, discarding", type);
          }
        }
      } catch (Exception e) {
        logger.error("Unexpected error received while handling a response: ", e);
        routerMetrics.operationManagerHandleResponseErrorCount.inc();
      }
    }
  }
Handle the response from polling the {@link NetworkClient}.
@param responseInfoList the list of {@link ResponseInfo} containing the responses.
ambry-router/src/main/java/com/github/ambry/router/OperationController.java