{"record":{"id":"50ea0f282acb77ab","repo":"Tencent/VasSonic","slug":"this-isn-t-a-hierarchical-uri","errorCode":null,"errorMessage":"This isn't a hierarchical URI.","messagePattern":"This isn't a hierarchical URI\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sonic-android/sdk/src/main/java/com/tencent/sonic/sdk/SonicRuntime.java","lineNumber":130,"sourceCode":"        return null;\n    }\n\n    /**\n     * Returns a set of the unique names of all query parameters. Iterating\n     * over the set will return the names in order of their first occurrence.\n     *\n     * @throws UnsupportedOperationException if this isn't a hierarchical URI\n     *\n     * @param uri The uri\n     * @return A set of decoded names\n     */\n    public Set<String> getQueryParameterNames(Uri uri) {\n        if (uri == null) {\n            return Collections.emptySet();\n        }\n\n        if (uri.isOpaque()) {\n            throw new UnsupportedOperationException(\"This isn't a hierarchical URI.\");\n        }\n\n        String query = uri.getEncodedQuery();\n        if (query == null) {\n            return Collections.emptySet();\n        }\n\n        Set<String> names = new LinkedHashSet<String>();\n        int start = 0;\n        do {\n            int next = query.indexOf('&', start);\n            int end = (next == -1) ? query.length() : next;\n\n            int separator = query.indexOf('=', start);\n            if (separator > end || separator == -1) {\n                separator = end;\n            }\n","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/Tencent/VasSonic/blob/59936beff656d4b5718ff6444d6c5e001a2c5231/sonic-android/sdk/src/main/java/com/tencent/sonic/sdk/SonicRuntime.java#L112-L148","documentation":"getQueryParameterNames(Uri) mirrors android.net.Uri's behavior and only supports hierarchical (opaque=false) URIs. When the URI is opaque (e.g. mailto:foo@bar.com), it throws UnsupportedOperationException because opaque URIs have no query part to parse.","triggerScenarios":"Calling SonicRuntime.getQueryParameterNames() with a Uri for which uri.isOpaque() returns true — non-hierarchical schemes like mailto:, tel:, or custom schemes without '//'.","commonSituations":"Passing a session URL that is actually an intent/deep-link opaque URI into Sonic's parameter extraction; mishandled scheme strings like 'sonic:foo' instead of 'sonic://host/path'; extracting params from URIs built via Uri.parse on non-hierarchical strings.","solutions":["Check uri.isOpaque() before calling and return an empty set or skip parameter parsing for opaque URIs","Normalize the URL to a hierarchical form (ensure scheme://host) before passing it to Sonic","Only invoke Sonic session flows with http/https URLs, which are always hierarchical","Add an isHierarchical guard in the wrapper that extracts query parameters"],"exampleFix":"// before\nSet<String> names = runtime.getQueryParameterNames(uri); // throws for opaque URIs\n// after\nSet<String> names = (uri != null && uri.isHierarchical())\n    ? runtime.getQueryParameterNames(uri)\n    : Collections.emptySet();","handlingStrategy":"validation","validationCode":"if (uri == null || uri.isOpaque()) {\n  return Collections.emptySet(); // skip param extraction\n}","typeGuard":"// Java\nstatic boolean isParseableUri(Uri uri) {\n  return uri != null && uri.isHierarchical();\n}","tryCatchPattern":"try {\n  names = runtime.getQueryParameterNames(uri);\n} catch (UnsupportedOperationException e) {\n  names = Collections.emptySet(); // opaque URI: no query params\n}","preventionTips":["Only feed http/https URLs into Sonic session flows","Check isOpaque()/isHierarchical() before URI parsing","Ensure custom deep-link schemes include the '//' authority part"],"tags":["android","uri","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"59936beff656d4b5718ff6444d6c5e001a2c5231","analyzedAt":"2026-09-08T10:27:05.448Z","contentChangedAt":"2026-09-08T10:27:05.448Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}