/// <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(); } } }
/// <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); }
/// <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); }