docs: public static String[] getRoutingContext(RESTRequest request, boolean errorIfNull) {
          //Look for headers first
          String targetHost = request.getHeader(ClientProvider.ROUTING_KEY_HOST_NAME);
          if (targetHost != null) {
              targetHost = URLDecoder(targetHost, null);
              String targetUserDir = request.getHeader(ClientProvider.ROUTING_KEY_SERVER_USER_DIR);
              String targetServer = request.getHeader(ClientProvider.ROUTING_KEY_SERVER_NAME);
  
              targetUserDir = (targetUserDir == null) ? null : URLDecoder(targetUserDir, null);
              targetServer = (targetServer == null) ? null : URLDecoder(targetServer, null);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                  Tr.event("RESTHelper", tc, "Found routing context in headers.  Host:" + targetHost + " | UserDir:" + targetUserDir + " | Server:" + targetServer);
              }
  
              return new String[] { targetHost, targetUserDir, targetServer };
  
          } else {
  
              //TODO: re-visit once a decision is made on the value of these keys (current values are too big
  
              //Look for query strings (note: query params are not automatically decoded when returned from getQueryString())
              final String queryStr = request.getQueryString();
  
              //Optimization:  Do a quick lookup to see if the raw queryStr contains a routing context key
              if (queryStr == null || !queryStr.contains(ClientProvider.ROUTING_KEY_HOST_NAME)) {
                  if (errorIfNull) {
                      //TODO: make real translated message
                      throw ErrorHelper.createRESTHandlerJsonException(new IOException("routing context was not present in the request!"), null, APIConstants.STATUS_BAD_REQUEST);
                  }
  
                  return null;
              }
  
              //We know it contains at least the host, so split it
              String[] queryParts = queryStr.split("[&=]");
              String[] routingParams = new String[3];
  
              final int size = queryParts.length;
              for (int i = 0; i < size; i++) {
                  if (ClientProvider.ROUTING_KEY_HOST_NAME.equals(queryParts[i])) {
                      //The value will be at i + 1
                      routingParams[0] = URLDecoder(queryParts[i + 1], null);
                      //Move to next key
                      i++;
                      continue;
                  } else if (ClientProvider.ROUTING_KEY_SERVER_USER_DIR.equals(queryParts[i])) {
                      //The value will be at i + 1
                      routingParams[1] = URLDecoder(queryParts[i + 1], null);
                      //Move to next key
                      i++;
                      continue;
                  } else if (ClientProvider.ROUTING_KEY_SERVER_NAME.equals(queryParts[i])) {
                      //The value will be at i + 1
                      routingParams[2] = URLDecoder(queryParts[i + 1], null);
                      //Move to next key
                      i++;
                      continue;
                  }
              }
              if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                  Tr.event("RESTHelper", tc, "Found routing context in queryStr.  Host:" + routingParams[0] + " | UserDir:" + routingParams[1] + " | Server:" + routingParams[2]);
              }
  
              return routingParams;
          }
      }