{"record":{"id":"b74daa304287dac4","repo":"shadowsocks/shadowsocks-rust","slug":"missing-manager-port","errorCode":null,"errorMessage":"missing `manager_port`","messagePattern":"missing `manager_port`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/shadowsocks-service/src/config.rs","lineNumber":2476,"sourceCode":"        }\n\n        // Manager Address\n        if let Some(ma) = config.manager_address {\n            let manager = match config.manager_port {\n                Some(port) => {\n                    match ma.parse::<IpAddr>() {\n                        Ok(ip) => ManagerAddr::from(SocketAddr::new(ip, port)),\n                        Err(..) => {\n                            // treated as domain\n                            ManagerAddr::from((ma, port))\n                        }\n                    }\n                }\n                #[cfg(unix)]\n                None => ManagerAddr::from(PathBuf::from(ma)),\n                #[cfg(not(unix))]\n                None => {\n                    let e = Error::new(ErrorKind::MissingField, \"missing `manager_port`\", None);\n                    return Err(e);\n                }\n            };\n\n            let mut manager_config = ManagerConfig::new(manager);\n            manager_config.mode = global_mode;\n\n            if let Some(ref m) = config.method {\n                match m.parse::<CipherKind>() {\n                    Ok(method) => manager_config.method = Some(method),\n                    Err(..) => {\n                        let err = Error::new(\n                            ErrorKind::Invalid,\n                            \"unsupported method\",\n                            Some(format!(\"`{m}` is not a supported method\")),\n                        );\n                        return Err(err);\n                    }","sourceCodeStart":2458,"sourceCodeEnd":2494,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/crates/shadowsocks-service/src/config.rs#L2458-L2494","documentation":"When the config is a manager-server config and no unix-domain-socket address is available (non-unix builds or absent socket path), the code requires an explicit TCP manager_port. If the address matches a host-only form and the port portion is missing on a non-unix platform, it returns ErrorKind::MissingField with 'missing `manager_port`'.","triggerScenarios":"Loading a manager config whose manager address parses to a bare host without a port, on a non-unix target (no PathBuf fallback), so no usable ManagerAddr can be constructed.","commonSituations":"Writing `\"manager_addr\": \"127.0.0.1\"` without `\"manager_port\"` in the JSON config on Windows/macOS-less non-unix builds; copying a unix config that relies on a socket path onto a non-unix host.","solutions":["Add a `manager_port` field to the config","Include the port in the manager address, e.g. `127.0.0.1:8787`","Run on unix and use a unix domain socket path for manager_addr instead"],"exampleFix":"// before\n{\"manager_addr\": \"127.0.0.1\"}\n// after\n{\"manager_addr\": \"127.0.0.1\", \"manager_port\": 8787}","handlingStrategy":"validation","validationCode":"fn validate_manager_cfg(cfg: &serde_json::Value) -> Result<(), String> {\n    let addr = cfg[\"manager_addr\"].as_str().unwrap_or(\"\");\n    let has_port = addr.rsplit(':').next().map_or(false, |p| p.parse::<u16>().is_ok());\n    if !has_port && cfg.get(\"manager_port\").is_none() {\n        return Err(\"manager config requires manager_port on non-unix\".into());\n    }\n    Ok(())\n}","typeGuard":"fn has_manager_port(cfg: &serde_json::Value) -> bool {\n    cfg.get(\"manager_port\").and_then(|v| v.as_u64()).map_or(false, |p| p > 0 && p <= 65535)\n}","tryCatchPattern":"match load_manager_config() {\n    Ok(c) => run(c),\n    Err(e) if e.to_string().contains(\"missing `manager_port`\") => {\n        eprintln!(\"add manager_port to config: {e}\");\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Always pair manager_addr with manager_port in portable configs","Include host:port in the manager address itself","Don't rely on unix-socket fallback when configs must run cross-platform"],"tags":["config","manager","shadowsocks","missing-field"],"backgroundTag":"missing-required-config-field","analyzedSha":"8eb0f0a65b1d976ab6bed5787327ef86529b0435","analyzedAt":"2026-09-09T12:20:43.168Z","contentChangedAt":"2026-09-09T12:20:43.168Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}