docs: public void handle(HttpRequest request, HttpResponder responder) {
      if (urlRewriter != null) {
        try {
          request.setUri(URI.create(request.uri()).normalize().toString());
          if (!urlRewriter.rewrite(request, responder)) {
            return;
          }
        } catch (Throwable t) {
          responder.sendString(HttpResponseStatus.INTERNAL_SERVER_ERROR,
                               String.format("Caught exception processing request. Reason: %s",
                                            t.getMessage()));
          LOG.error("Exception thrown during rewriting of uri {}", request.uri(), t);
          return;
        }
      }
  
      try {
        String path = URI.create(request.uri()).normalize().getPath();
  
        List<PatternPathRouterWithGroups.RoutableDestination<HttpResourceModel>> routableDestinations
          = patternRouter.getDestinations(path);
  
        PatternPathRouterWithGroups.RoutableDestination<HttpResourceModel> matchedDestination =
          getMatchedDestination(routableDestinations, request.method(), path);
  
        if (matchedDestination != null) {
          //Found a httpresource route to it.
          HttpResourceModel httpResourceModel = matchedDestination.getDestination();
  
          // Call preCall method of handler hooks.
          boolean terminated = false;
          HandlerInfo info = new HandlerInfo(httpResourceModel.getMethod().getDeclaringClass().getName(),
                                             httpResourceModel.getMethod().getName());
          for (HandlerHook hook : handlerHooks) {
            if (!hook.preCall(request, responder, info)) {
              // Terminate further request processing if preCall returns false.
              terminated = true;
              break;
            }
          }
  
          // Call httpresource method
          if (!terminated) {
            // Wrap responder to make post hook calls.
            responder = new WrappedHttpResponder(responder, handlerHooks, request, info);
            if (httpResourceModel.handle(request, responder, matchedDestination.getGroupNameValues()).isStreaming()) {
              responder.sendString(HttpResponseStatus.METHOD_NOT_ALLOWED,
                                   String.format("Body Consumer not supported for internalHttpResponder: %s",
                                                 request.uri()));
            }
          }
        } else if (routableDestinations.size() > 0)  {
          //Found a matching resource but could not find the right HttpMethod so return 405
          responder.sendString(HttpResponseStatus.METHOD_NOT_ALLOWED,
                               String.format("Problem accessing: %s. Reason: Method Not Allowed", request.uri()));
        } else {
          responder.sendString(HttpResponseStatus.NOT_FOUND, String.format("Problem accessing: %s. Reason: Not Found",
                                                                           request.uri()));
        }
      } catch (Throwable t) {
        responder.sendString(HttpResponseStatus.INTERNAL_SERVER_ERROR,
                             String.format("Caught exception processing request. Reason: %s", t.getMessage()));
        LOG.error("Exception thrown during request processing for uri {}", request.uri(), t);
      }
    }