docs: @Override
      @FFDCIgnore({ RESTHandlerInternalError.class, RESTHandlerUserError.class, RESTHandlerMethodNotAllowedError.class, RESTHandlerUnsupportedMediaType.class,
                   RESTHandlerJsonException.class })
      public boolean handleRequest(RESTRequest request, RESTResponse response) throws IOException {
          final String requestURL = request.getContextPath() + request.getPath();
          final HandlerInfo handlerInfo = getHandler(requestURL);
          final boolean isRouting = DefaultRoutingHelper.containsLegacyRoutingContext(request) || DefaultRoutingHelper.containsRoutingContext(request);
  
          if (handlerInfo == null && !isRouting) {
              //calling proxy servlet will handle this case 
              return false;
          }
  
          try {
              //Security checks applicable to /ibm/api participants
              if (request.getContextPath().equals(RESTHandler.PROPERTY_REST_HANDLER_DEFAULT_CONTEXT_ROOT)) {
                  //Check if the handler is doing custom security or not.
                  //The first argument will be true if we're routing the call and a corresponding service wasn't present on this controller
                  if (handlerInfo == null || !hasProperty(handlerInfo.handlerRef, RESTHandler.PROPERTY_REST_HANDLER_CUSTOM_SECURITY)) {
                      //This path is not performing custom security, so check for default authorization
                      if (!getAuthorizationHelper().checkAdministratorRole(request, response)) {
                          //We failed the check, so return true, since the default authorization helper would have filled up the response already.
                          return true;
                      }
                  }
              }
  
              //If we matched a path that had variables, extended the request to contain the resolved variables
              if (handlerInfo != null && handlerInfo.path != null && handlerInfo.path.containsVariable()) {
                  //When mapping variables we don't include the context root
                  request = new ExtendedRESTRequestImpl(request, handlerInfo.path.mapVariables(requestURL));
              }
  
              //Routing special code
              if (isRouting) {
                  //Check if we're doing custom routing or not
                  if (handlerInfo == null || !hasProperty(handlerInfo.handlerRef, RESTHandler.PROPERTY_REST_HANDLER_CUSTOM_ROUTING)) {
                      //This path is not doing custom routing, so use the routing helper
                      getRoutingHelper().routeRequest(request, response);
                      return true;
                  }
                  //...there's routing context, but matched handler wants to do custom routing, so let the request go through
              }
  
              try {
                  //Delegate request to handler
                  handlerInfo.handler.handleRequest(request, response);
              } catch (RESTHandlerInternalError ie) {
                  //Handlers general internal errors and osgi errors
                  response.sendError(ie.getStatusCode(), ie.getMessage());
              } catch (RESTHandlerUserError ue) {
                  response.sendError(ue.getStatusCode(), ue.getMessage());
              } catch (RESTHandlerUnsupportedMediaType e) {
                  response.sendError(e.getStatusCode(), e.getMessage());
              } catch (RESTHandlerMethodNotAllowedError e) {
                  //A 405 response (Method Not Allowed) needs to have the response header of "Allow", to say which methods can be used
                  response.setResponseHeader("Allow", e.getAllowedMethods());
                  response.sendError(e.getStatusCode());
              } catch (RESTHandlerJsonException e) {
                  if (e.isMessageContentJSON()) {
                      response.setStatus(e.getStatusCode());
                      response.setContentType("application/json");
                      response.setCharacterEncoding("UTF-8");
                      response.getWriter().write(e.getMessage());
                  } else {
                      response.sendError(e.getStatusCode(), e.getMessage());
                  }
              }
  
          } catch (IOException ioe) {
              response.sendError(500, ioe.getMessage());
          }
  
          return true;
      }