@Nullable
    private static RequestTarget slowForServer(String reqTarget, boolean allowSemicolonInPathComponent,
                                               boolean allowDoubleDotsInQueryString) {
        final Bytes path;
        final Bytes query;

        // Split by the first '?'.
        final int queryPos = reqTarget.indexOf('?');
        if (queryPos >= 0) {
            if ((path = decodePercentsAndEncodeToUtf8(
                    reqTarget, 0, queryPos,
                    ComponentType.SERVER_PATH, null, allowSemicolonInPathComponent)) == null) {
                return null;
            }
            if ((query = decodePercentsAndEncodeToUtf8(
                    reqTarget, queryPos + 1, reqTarget.length(),
                    ComponentType.QUERY, EMPTY_BYTES, true)) == null) {
                return null;
            }
        } else {
            if ((path = decodePercentsAndEncodeToUtf8(
                    reqTarget, 0, reqTarget.length(),
                    ComponentType.SERVER_PATH, null, allowSemicolonInPathComponent)) == null) {
                return null;
            }
            query = null;
        }

        // Reject a relative path and accept an asterisk (e.g. OPTIONS * HTTP/1.1).
        if (isRelativePath(path)) {
            if (query == null && path.length == 1 && path.data[0] == '*') {
                return SERVER_INSTANCE_ASTERISK;
            } else {
                // Do not accept a relative path.
                return null;
            }
        }

        // Reject the prohibited patterns.
        if (pathContainsDoubleDots(path, allowSemicolonInPathComponent)) {
            return null;
        }
        if (!allowDoubleDotsInQueryString && queryContainsDoubleDots(query)) {
            return null;
        }

        final String encodedPath = encodePathToPercents(path);
        final String matrixVariablesRemovedPath;
        if (allowSemicolonInPathComponent) {
            matrixVariablesRemovedPath = encodedPath;
        } else {
            matrixVariablesRemovedPath = removeMatrixVariables(encodedPath);
            if (matrixVariablesRemovedPath == null) {
                return null;
            }
        }
        return new DefaultRequestTarget(RequestTargetForm.ORIGIN,
                                        null,
                                        null,
                                        null,
                                        -1,
                                        matrixVariablesRemovedPath,
                                        encodedPath,
                                        reqTarget,
                                        encodeQueryToPercents(query),
                                        null);
    }
Marks this {@link RequestTarget} as stored in {@link RequestTargetCache} so that it doesn't
try to store again.
core/src/main/java/com/linecorp/armeria/internal/common/DefaultRequestTarget.java