code: @COPY
      @Timed
      public void copyResource(@Suspended final AsyncResponse response, @Context final Request request,
              @Context final UriInfo uriInfo, @Context final HttpHeaders headers,
              @Context final SecurityContext security) {
          final TrellisRequest req = new TrellisRequest(request, uriInfo, headers, security);
          final Session session = getSession(req.getPrincipalName());
          final IRI destination = getDestination(headers, getBaseUrl(req));
          final IRI identifier = rdf.createIRI(TRELLIS_DATA_PREFIX + req.getPath());
          // Default is recursive copy as per RFC-4918
          final Depth.DEPTH depth = getDepth(headers.getHeaderString("Depth"));
          getParent(destination).thenCombine(services.getResourceService().get(destination), this::checkResources)
              .thenCompose(parent -> services.getResourceService().touch(parent.getIdentifier()))
              .thenCompose(future -> services.getResourceService().get(identifier))
              .thenApply(this::checkResource)
              .thenCompose(res -> copyTo(res, session, depth, destination, getBaseUrl(req)))
              .thenApply(future -> status(NO_CONTENT).build())
              .exceptionally(this::handleException).thenApply(response::resume);
      }
docs: Copy a resource.
  @param response the async response
  @param request the request
  @param uriInfo the URI info
  @param headers the headers
  @param security the security context