{"record":{"id":"72c356e5001ae38e","repo":"microg/GmsCore","slug":"transport-transport-not-supported","errorCode":null,"errorMessage":"Transport ${transport} not supported","messagePattern":"Transport (.+?) not supported","errorType":"error_code","errorClass":"UnsupportedTransportException","httpStatus":null,"severity":"error","filePath":"play-services-fido/src/main/java/com/google/android/gms/fido/common/Transport.java","lineNumber":65,"sourceCode":"    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(toString());\n    }\n\n    @PublicApi(exclude = true)\n    public static Transport fromString(String transport) throws UnsupportedTransportException {\n        for (Transport value : values()) {\n            if (value.value.equals(transport)) return value;\n        }\n        if (transport.equals(\"hybrid\")) {\n            return HYBRID;\n        }\n        throw new UnsupportedTransportException(\"Transport \" + transport + \" not supported\");\n    }\n\n    @PublicApi(exclude = true)\n    public static List<Transport> parseTransports(JSONArray jsonArray) throws JSONException {\n        if (jsonArray == null) return null;\n        Set<Transport> set = new HashSet<>();\n        for (int i = 0; i < jsonArray.length(); i++) {\n            String transport = jsonArray.getString(i);\n            if (transport != null && !transport.isEmpty()) {\n                try {\n                    set.add(fromString(transport));\n                } catch (UnsupportedTransportException e) {\n                    Log.w(\"Transport\", \"Ignoring unrecognized transport \" + transport);\n                }\n            }\n        }\n        return new ArrayList<>(set);\n    }","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-fido/src/main/java/com/google/android/gms/fido/common/Transport.java#L47-L83","documentation":"Transport.fromString() maps a wire string (from the FIDO WebAuthn JSON, e.g. the transports array) onto the Transport enum, with a legacy special case for \"hybrid\". When no enum constant matches, it throws UnsupportedTransportException. It exists so malformed or newer-spec transport strings surface as a typed error instead of being silently dropped.","triggerScenarios":"Calling parseTransports on a JSONArray containing a transport string not in the enum (values like \"usb\", \"nfc\", \"ble\", \"internal\", plus legacy \"hybrid\"), e.g. \"cable\", \"smart-card\", or a newer WebAuthn transport the library version predates.","commonSituations":"Parsing an authenticator registration/assertion response produced by a newer browser or authenticator supporting transports this microG FIDO build doesn't know; typo'd transport strings in test fixtures or server-generated options.","solutions":["Update microG / play-services-fido to a version whose Transport enum includes the new value.","Sanitize the JSON array before parsing: filter out unknown transport strings.","If you only need known transports, wrap each fromString call in try-catch and skip UnsupportedTransportException entries instead of parsing the whole array."],"exampleFix":"// before\nList<Transport> transports = Transport.parseTransports(jsonArray);\n// after\nList<Transport> transports = new ArrayList<>();\nfor (int i = 0; i < jsonArray.length(); i++) {\n    try { transports.add(Transport.fromString(jsonArray.getString(i))); }\n    catch (UnsupportedTransportException ignored) { }\n}","handlingStrategy":"try-catch","validationCode":"Set<String> known = new HashSet<>();\nfor (Transport t : Transport.values()) known.add(t.toString());\nboolean allKnown = IntStream.range(0, jsonArray.length()).allMatch(i -> known.contains(jsonArray.optString(i)) || \"hybrid\".equals(jsonArray.optString(i)));","typeGuard":null,"tryCatchPattern":"try { transports = Transport.parseTransports(jsonArray); } catch (UnsupportedTransportException e) { Log.w(TAG, \"Unknown transport: \" + e.getMessage()); transports = Collections.emptyList(); }","preventionTips":["Filter the transports JSON array against Transport.values() before parsing.","Keep the microG FIDO library current so newly standardized transports parse.","Treat unknown transports as ignorable metadata, not fatal input."],"tags":["fido","webauthn","enum-parsing","android"],"backgroundTag":"unsupported-enum-value","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}