Beispiel #1
0
        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            if (Interlocked.CompareExchange(ref isDisposed, 1, 0) == 0)
            {
                server.Dispose();
                if (LocalDomainServer == null)
                {
                    FileWatcher.Dispose();

                    Monitor.Enter(domainLock);
                    DomainSearchData domains = this.domains;
                    this.domains = DomainSearchData.Default;
                    Monitor.Exit(domainLock);
                    domains.Close();
                    //domains.Dispose();

                    Monitor.Enter(hostLock);
                    try
                    {
                        foreach (Http.Server httpServer in hosts.Values)
                        {
                            httpServer.Dispose();
                        }
                        hosts.Clear();
                    }
                    finally { Monitor.Exit(hostLock); }
                }
                else
                {
                    LocalDomainServer.Dispose();
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 添加域名服务信息
        /// </summary>
        /// <param name="domain"></param>
        /// <param name="server"></param>
        /// <param name="removeDomains">域名搜索</param>
        /// <returns></returns>
        internal DomainSearchData Add(byte[] domain, DomainServer server, out DomainSearchData removeDomains)
        {
            byte[][]       domains = this.domains;
            DomainServer[] servers = this.servers;
            if (domain.Length != 0)
            {
                fixed(byte *domainFixed = domain)
                {
                    byte *domainEnd = domainFixed + domain.Length;
                    int   index     = searcher.State != null?searcher.Search(domainFixed, domainEnd) : -1;

                    if (index < 0 || servers[index] == null)
                    {
                        int count = index = 0;
                        foreach (DomainServer nextServer in servers)
                        {
                            if (nextServer != null)
                            {
                                ++count;
                            }
                        }
                        byte[][] newDomains = new byte[++count][];
                        fixed(byte *reverseDomainFixed = (newDomains[0] = new byte[domain.Length]))
                        {
                            for (byte *start = domainFixed, write = reverseDomainFixed + domain.Length; start != domainEnd; *--write = *start++)
                            {
                                ;
                            }
                        }

                        DomainServer[] newServers = new DomainServer[count];
                        newServers[0] = server;
                        count         = 1;
                        foreach (DomainServer nextServer in servers)
                        {
                            if (nextServer != null)
                            {
                                newDomains[count] = domains[index];
                                newServers[count] = servers[index];
                                ++count;
                            }
                            ++index;
                        }
                        if (newServers.Length != count)
                        {
                            Array.Resize(ref newDomains, count);
                            Array.Resize(ref newServers, count);
                        }
                        DomainSearchData newSearchData = new DomainSearchData(newDomains, newServers);
                        removeDomains = this;
                        return(newSearchData);
                    }
                }
            }
            removeDomains = null;
            return(this);
        }
Beispiel #3
0
        /// <summary>
        /// 域名状态检测
        /// </summary>
        /// <param name="domain">域名信息</param>
        /// <param name="domainServer">域名服务</param>
        /// <returns>域名状态</returns>
        internal RegisterState CheckDomain(ref Domain domain, DomainServer domainServer)
        {
            byte[] domainData = domain.DomainData;
            if (domain.Host.Host == null)
            {
                if (domain.SslHost.Host == null)
                {
                    if (domainData.length() == 0)
                    {
                        return(RegisterState.DomainError);
                    }
                    int portIndex = AutoCSer.Memory.indexOfNotNull(domainData, (byte)':');
                    if (portIndex == -1)
                    {
                        domain.Host.Set(domainData.toStringNotNull(), 80);
                    }
                    else if (portIndex == 0)
                    {
                        return(RegisterState.DomainError);
                    }
                    else
                    {
                        if (!int.TryParse(domainData.toStringNotNull(portIndex + 1, domainData.Length - portIndex - 1), out domain.Host.Port))
                        {
                            return(RegisterState.DomainError);
                        }
                        domain.Host.Host = domainData.toStringNotNull(0, portIndex);
                    }
                    if (!domain.Host.HostToIPAddress())
                    {
                        return(RegisterState.DomainError);
                    }
                }
                else
                {
                    if (domain.SslHost.Port == 0)
                    {
                        domain.SslHost.Port = 443;
                    }
                    if (domainData.length() == 0)
                    {
                        if (domain.SslHost.Host.Length == 0)
                        {
                            return(RegisterState.HostError);
                        }
                        string host = domain.SslHost.Host;
                        if (domain.SslHost.Port != 443)
                        {
                            host += ":" + domain.SslHost.Port.toString();
                        }
                        domain.DomainData = domainData = host.getBytes();
                        server.Log.Add(AutoCSer.Log.LogType.Error, domain.SslHost.Host + " 缺少指定域名");
                    }
                    else if (domain.SslHost.Port != 443 && AutoCSer.Memory.indexOfNotNull(domainData, (byte)':') == -1)
                    {
                        domain.DomainData = domainData = (domainData.toStringNotNull() + ":" + domain.SslHost.Port.toString()).getBytes();
                    }
                    if (!domain.SslHost.HostToIPAddress())
                    {
                        return(RegisterState.HostError);
                    }
                }
            }
            else
            {
                if (domain.Host.Port == 0)
                {
                    domain.Host.Port = 80;
                }
                if (domain.SslHost.Host != null && domain.SslHost.Port == 0)
                {
                    domain.SslHost.Port = 443;
                }
                if (domainData.length() == 0)
                {
                    if (domain.Host.Host.Length == 0)
                    {
                        return(RegisterState.HostError);
                    }
                    string host = domain.Host.Host;
                    if (domain.Host.Port != 80)
                    {
                        host += ":" + domain.Host.Port.toString();
                    }
                    domain.DomainData = domainData = host.getBytes();
                    server.Log.Add(AutoCSer.Log.LogType.Error, domain.Host.Host + " 缺少指定域名");
                }
                else if (domain.SslHost.Host == null)
                {
                    if (domain.Host.Port != 80 && AutoCSer.Memory.indexOfNotNull(domainData, (byte)':') == -1)
                    {
                        domain.DomainData = domainData = (domainData.toStringNotNull() + ":" + domain.Host.Port.toString()).getBytes();
                    }
                }
                else
                {
                    if (!domain.SslHost.HostToIPAddress())
                    {
                        return(RegisterState.HostError);
                    }
                }
                if (!domain.Host.HostToIPAddress())
                {
                    return(RegisterState.HostError);
                }
            }
            if (domainData.Length > MaxDomainSize)
            {
                return(RegisterState.DomainError);
            }
            domainData.toLowerNotNull();
            DomainSearchData removeDomains = null;

            Monitor.Enter(domainLock);
            try
            {
                domains = domains.Add(domainData, domainServer, out removeDomains);
            }
            finally
            {
                Monitor.Exit(domainLock);
                //if (removeDomains != null) removeDomains.Dispose();
            }
            return(removeDomains == null ? RegisterState.DomainExists : RegisterState.Success);
        }