{"record":{"id":"e75660942709d86e","repo":"ginuerzh/gost","slug":"s-unsupported-e75660","errorCode":null,"errorMessage":"%s unsupported","messagePattern":"(.+?) unsupported","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ss.go","lineNumber":47,"sourceCode":"\tcipher core.Cipher\n}\n\n// ShadowConnector creates a Connector for shadowsocks proxy client.\n// It accepts an optional cipher info for shadowsocks data encryption/decryption.\nfunc ShadowConnector(info *url.Userinfo) Connector {\n\treturn &shadowConnector{\n\t\tcipher: initShadowCipher(info),\n\t}\n}\n\nfunc (c *shadowConnector) Connect(conn net.Conn, address string, options ...ConnectOption) (net.Conn, error) {\n\treturn c.ConnectContext(context.Background(), conn, \"tcp\", address, options...)\n}\n\nfunc (c *shadowConnector) ConnectContext(ctx context.Context, conn net.Conn, network, address string, options ...ConnectOption) (net.Conn, error) {\n\tswitch network {\n\tcase \"udp\", \"udp4\", \"udp6\":\n\t\treturn nil, fmt.Errorf(\"%s unsupported\", network)\n\t}\n\n\topts := &ConnectOptions{}\n\tfor _, option := range options {\n\t\toption(opts)\n\t}\n\n\ttimeout := opts.Timeout\n\tif timeout <= 0 {\n\t\ttimeout = ConnectTimeout\n\t}\n\n\tsocksAddr, err := gosocks5.NewAddr(address)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trawaddr := sPool.Get().([]byte)\n\tdefer sPool.Put(rawaddr)","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/ginuerzh/gost/blob/a33fdbf4c98034f4bfeeaea9868909822b9c526d/ss.go#L29-L65","documentation":"The shadowsocks connector (shadowConnector) only supports TCP-based networks. ConnectContext rejects any network argument of \"udp\", \"udp4\", or \"udp6\" with this '<network> unsupported' error, because the shadow stream connector cannot carry UDP associations.","triggerScenarios":"Calling shadowConnector.Connect / ConnectContext with network set to \"udp\", \"udp4\", or \"udp6\" instead of \"tcp\" (or a TCP alias).","commonSituations":"Passing a user- or config-supplied network string straight into the dialer; wiring a UDP client through a TCP shadow connector instead of using the dedicated shadow UDP connector (shadowUDPConnector).","solutions":["Use network \"tcp\", \"tcp4\", or \"tcp6\" with shadowConnector","For UDP traffic, use the dedicated UDP connector (shadowUDPConnector / UDP listener path) instead","Validate the network parameter at config load time and fail fast with a clear message"],"exampleFix":"// before\nconn, err := connector.Connect(context.Background(), netConn, \"udp\", addr)\n// after\nconn, err := connector.Connect(context.Background(), netConn, \"tcp\", addr)","handlingStrategy":"validation","validationCode":"if strings.HasPrefix(network, \"udp\") {\n    return errors.New(\"shadowConnector requires a tcp network; use the UDP connector for udp\")\n}","typeGuard":"func isTCPNetwork(n string) bool {\n    switch n { case \"tcp\", \"tcp4\", \"tcp6\": return true }\n    return false\n}","tryCatchPattern":"conn, err := connector.Connect(ctx, netConn, network, addr)\nif err != nil && strings.HasSuffix(err.Error(), \"unsupported\") {\n    return fmt.Errorf(\"wrong connector for network %q: %w\", network, err)\n}","preventionTips":["Match connector type to network family (shadowConnector=tcp, shadowUDPConnector=udp)","Validate the network field in config before dialing","Never forward raw user input as the network argument"],"tags":["shadowsocks","udp","unsupported-network"],"backgroundTag":"unsupported-network-type","analyzedSha":"a33fdbf4c98034f4bfeeaea9868909822b9c526d","analyzedAt":"2026-09-02T22:15:54.506Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}