private Message handleRequestWithIfMatch(Request request) throws IOException {
    final Path path = Path.fromString(request.uri().getPath());
    final Resource resource = resolveResource(path);

    final String ifMatch = getOnlyElement(request.headers().get(Header.IF_MATCH));

    if (ifMatch.equals("*") || !ifMatch.equals(resource.etag())) {
      return handleRequestWithoutIfMatch(request);
    } else {
      return Response.clientErrorPreconditionFailed();
    }
  }
  private Message handleRequestWithIfModifiedSince(final Request request) throws IOException {
    final Path path = Path.fromUri(request.uri());
    final Resource resource = resolveResource(path);

    try {
      String date = getOnlyElement(request.headers().get(IF_MODIFIED_SINCE));
      Date ifModifiedSince = new SimpleDateFormat().parse(date);
      if (!ifModifiedSince.after(new Date()) && !(resource.lastModified().after(new Date()))) {
        return redirectionNotModified();
      } else {
        return handleRequestWithoutIfModifiedSince(request);
      }
    } catch (ParseException e) {
      return handleRequestWithoutIfModifiedSince(request);
    }
  }
  private Message handleRequestWithoutIfModifiedSince(final Request request) throws IOException {
    switch (request.method()) {
      case POST:

      case PUT:

        //		case DELETE:
        //			return delete(request);

      case GET:
      case HEAD:
        if (request.headers().containsKey(Header.ACCEPT)) {
          return handleRequestWithAccept(request);
        } else {
          return handleRequestWithoutAccept(request);
        }

      default:
        return clientErrorMethodNotAllowed();
    }
  }