@Nullable
    private Node<V> findFirstNode(Node<V> node, String path, int begin, boolean exact, IntHolder nextHolder,
                                  NodeProcessor<V> processor) {
        final Node<V> checked = checkNode(node, path, begin, exact, nextHolder);
        if (checked != continueWalking()) {
            if (checked != null) {
                return processor.process(checked);
            }
            return null;
        }

        // The path is not matched to this node, but it is possible to be matched on my children
        // because the path starts with the path of this node. So we need to visit children as the
        // following sequences:
        //  - The child which is able to consume the next character of the path.
        //  - The child which has a path variable.
        //  - The child which is able to consume every remaining path. (catch-all)
        final int next = nextHolder.value;
        Node<V> child = node.children.get(path.charAt(next));
        if (child != null) {
            final Node<V> found = findFirstNode(child, path, next, exact, nextHolder, processor);
            if (found != null) {
                return found;
            }
        }
        child = node.parameterChild;
        if (child != null) {
            final Node<V> found = findFirstNode(child, path, next, exact, nextHolder, processor);
            if (found != null) {
                return found;
            }
        }
        if (node.catchAllChild != null) {
            return processor.process(node.catchAllChild);
        }
        return null;
    }
Finds a {@link Node} which is mapped to the given {@code path}. It is recursively called by itself
to visit the children of the given node. Returns {@code null} if there is no {@link Node} to find.
core/src/main/java/com/linecorp/armeria/server/RoutingTrie.java