@Override
  public AbstractStorageItem retrieveItem(
      ProxyRepository repository, ResourceStoreRequest request, String baseUrl)
      throws ItemNotFoundException, RemoteStorageException {
    final URL remoteURL = getAbsoluteUrlFromBase(baseUrl, request.getRequestPath());

    final String itemUrl = remoteURL.toString();

    final AsyncHttpClient client = getClient(repository);

    try {

      BodyDeferringInputStream ris = AHCUtils.fetchContent(client, itemUrl);

      // this blocks until response headers arrived
      Response response = ris.getAsapResponse();

      // expected: 200 OK
      validateResponse(repository, request, "GET", itemUrl, response, 200);

      long length = AHCUtils.getContentLength(response, -1);

      long lastModified = AHCUtils.getLastModified(response, System.currentTimeMillis());

      // non-reusable simplest content locator, the ris InputStream is ready to be consumed
      PreparedContentLocator contentLocator =
          new PreparedContentLocator(ris, response.getContentType());

      DefaultStorageFileItem result =
          new DefaultStorageFileItem(
              repository, request, true /* canRead */, true /* canWrite */, contentLocator);

      result.setLength(length);

      result.setModified(lastModified);

      result.setCreated(result.getModified());

      result.setRemoteUrl(itemUrl);

      result.getItemContext().setParentContext(request.getRequestContext());

      return result;
    } catch (ItemNotFoundException e) {
      throw e;
    } catch (RemoteStorageException e) {
      throw e;
    } catch (Exception e) {
      throw new RemoteStorageException(e);
    }
  }