{"record":{"id":"46bb174fdd58b2c9","repo":"netchx/netch","slug":"transfer-protocol-server-transferprotocol-not","errorCode":null,"errorMessage":"transfer protocol \"{server.TransferProtocol}\" not implemented yet","messagePattern":"transfer protocol \"(.+?)\" not implemented yet","errorType":"exception","errorClass":"MessageException","httpStatus":null,"severity":"error","filePath":"Netch/Servers/V2ray/V2rayConfigUtils.cs","lineNumber":415,"sourceCode":"                    key = server.QUICSecret,\n                    header = new\n                    {\n                        type = server.FakeType\n                    }\n                };\n\n                break;\n            case \"grpc\":\n\n                streamSettings.grpcSettings = new GrpcSettings\n                {\n                    serviceName = server.Path,\n                    multiMode = server.FakeType == \"multi\"\n                };\n\n                break;\n            default:\n                throw new MessageException($\"transfer protocol \\\"{server.TransferProtocol}\\\" not implemented yet\");\n        }\n\n        if (Global.Settings.V2RayConfig.TCPFastOpen)\n        {\n            streamSettings.sockopt = new Sockopt\n            {\n                tcpFastOpen = true\n            };\n        }\n\n        return streamSettings;\n    }\n\n    public static string getUUID(string uuid)\n    {\n        if (uuid.Length == 36 || uuid.Length == 32)\n        {\n            return uuid;","sourceCodeStart":397,"sourceCodeEnd":433,"githubUrl":"https://github.com/netchx/netch/blob/9d99eb1c5a2acbf2a34f2600f94242601019a300/Netch/Servers/V2ray/V2rayConfigUtils.cs#L397-L433","documentation":"The StreamSettings builder switches on server.TransferProtocol and explicitly handles tcp, ws, kcp, h2, quic, grpc. The default arm throws for any other value, signalling a transport Netch does not (yet) generate V2Ray config for. Unlike error [22] (about the tcp header/FakeType), this fires on the top-level transport field itself. The combo box in the editor normally restricts choices to VMessGlobal.TransferProtocols, but imported/serialized configs bypass that constraint.","triggerScenarios":"server.TransferProtocol set to a string outside {tcp, ws, kcp, h2, quic, grpc}: a typo, a value from a newer V2Ray spec, a protocol dropped in this build, or a hand-edited settings.json.","commonSituations":"Loading an old settings.json naming a transport removed in this build; a future protocol not yet wired up; manual JSON edit introducing an invalid value; a share link using an exotic transport.","solutions":["Set TransferProtocol to one of: tcp, ws, kcp, h2, quic, grpc.","Update Netch to a build that implements the protocol.","Re-import the server from a correct vmess:// link.","Edit the server and pick a supported transport from the drop-down."],"exampleFix":"// before\ndefault:\n    throw new MessageException($\"transfer protocol \\\"{server.TransferProtocol}\\\" not implemented yet\");\n// after - fall back to tcp and warn instead of throwing\nLog.Warning(\"Unsupported transfer protocol {Protocol}, falling back to tcp\", server.TransferProtocol);\nserver.TransferProtocol = \"tcp\";\ngoto case \"tcp\";","handlingStrategy":"validation","validationCode":"static readonly HashSet<string> SupportedTransports = new() { \"tcp\", \"ws\", \"kcp\", \"h2\", \"quic\", \"grpc\" };\nif (!SupportedTransports.Contains(server.TransferProtocol))\n    throw new MessageException($\"Unsupported transport '{server.TransferProtocol}'\");","typeGuard":"static readonly string[] Supported = { \"tcp\", \"ws\", \"kcp\", \"h2\", \"quic\", \"grpc\" };\nbool IsSupportedTransport(string t) => Array.IndexOf(Supported, t) >= 0;","tryCatchPattern":"try { return BuildStreamSettings(server); }\ncatch (MessageException ex) when (ex.Message.Contains(\"not implemented yet\"))\n{\n    Log.Error(\"Server {Remark} uses unsupported transport {T}\", server.Remark, server.TransferProtocol);\n    throw;\n}","preventionTips":["Bind the server editor's TransferProtocol combo box to VMessGlobal.TransferProtocols so only supported values are selectable.","Validate imported servers against the supported set and reject/skip invalid ones in ShareLink.ParseText.","Add a unit test asserting every entry in VMessGlobal.TransferProtocols has a matching case in the switch."],"tags":["v2ray","stream-settings","transport","config","validation"],"backgroundTag":null,"analyzedSha":"9d99eb1c5a2acbf2a34f2600f94242601019a300","analyzedAt":"2026-08-13T14:12:19.105Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}