Пример #1
0
        /// <summary>
        /// 解析UI字符串至 ConnectionRoute 对象
        /// 字符串格式:
        ///   server : IPx or IPx-name_x
        ///   proxy  : [empty] or IP1-name_1;IP2;IP3-name_3;......
        /// 解析规则:
        ///   IPn-name_n 解析为两个 RouteNode, 按顺序分别为 IPn 和 IPn-name_n
        ///   IPn 解析为一个 RouteNode, 其 Name 为 ""
        ///   server 若为挂在反向代理的server, 则代理列表最后一级为反向代理服务器IP
        /// 解析规则保证 ProxyRoute[0].Name == "" (若存在), 即一定不是反向代理
        /// </summary>
        /// <param name="server_string"></param>
        /// <param name="proxy_string"></param>
        /// <returns></returns>
        public static ConnectionRoute FromString(string server_string, string proxy_string, int default_server_port = 12138, int default_proxy_port = 12139)
        {
            ConnectionRoute cr = new ConnectionRoute();

            if (server_string.Contains("-"))
            {
                string[] strs = server_string.Split('-');
                if (!strs[0].Contains(':'))
                {
                    strs[0] += ":" + default_server_port.ToString();
                }
                cr.ServerAddress = new RouteNode(strs[0], strs[1]);
                cr.ProxyRoute.Add(new RouteNode(strs[0]));
            }
            else
            {
                if (!server_string.Contains(':'))
                {
                    server_string += ":" + default_server_port.ToString();
                }
                cr.ServerAddress = new RouteNode(TCPAddress.FromString(server_string));
            }
            if (!string.IsNullOrEmpty(proxy_string))
            {
                string[] proxies = proxy_string.Split(';');
                int      idx     = 0;
                foreach (string proxy0 in proxies)
                {
                    if (proxy0.Contains("-"))
                    {
                        string[] proxy0_split = proxy0.Split('-');
                        if (!proxy0_split[0].Contains(':'))
                        {
                            proxy0_split[0] += ":" + default_proxy_port.ToString();
                        }
                        cr.ProxyRoute.Insert(idx, new RouteNode(proxy0_split[0]));
                        idx++;
                        cr.ProxyRoute.Insert(idx, new RouteNode(proxy0_split[0], proxy0_split[1]));
                        idx++;
                    }
                    else
                    {
                        string proxy_str = proxy0;
                        if (!proxy_str.Contains(':'))
                        {
                            proxy_str += ":" + default_proxy_port.ToString();
                        }
                        cr.ProxyRoute.Insert(idx, new RouteNode(proxy0));
                        idx++;
                    }
                }
            }
            return(cr);
        }