public void AddPrefix(ListenerPrefix prefix, HttpListener listener) { if (prefix.Host == "*") { List <ListenerPrefix> list; List <ListenerPrefix> list2; do { list = this._unhandled; list2 = ((list == null) ? new List <ListenerPrefix>() : new List <ListenerPrefix>(list)); prefix.Listener = listener; EndPointListener.addSpecial(list2, prefix); }while (Interlocked.CompareExchange <List <ListenerPrefix> >(ref this._unhandled, list2, list) != list); return; } if (prefix.Host == "+") { List <ListenerPrefix> list; List <ListenerPrefix> list2; do { list = this._all; list2 = ((list == null) ? new List <ListenerPrefix>() : new List <ListenerPrefix>(list)); prefix.Listener = listener; EndPointListener.addSpecial(list2, prefix); }while (Interlocked.CompareExchange <List <ListenerPrefix> >(ref this._all, list2, list) != list); return; } Dictionary <ListenerPrefix, HttpListener> prefixes; for (;;) { prefixes = this._prefixes; if (prefixes.ContainsKey(prefix)) { break; } Dictionary <ListenerPrefix, HttpListener> dictionary = new Dictionary <ListenerPrefix, HttpListener>(prefixes); dictionary[prefix] = listener; if (Interlocked.CompareExchange <Dictionary <ListenerPrefix, HttpListener> >(ref this._prefixes, dictionary, prefixes) == prefixes) { return; } } HttpListener httpListener = prefixes[prefix]; if (httpListener != listener) { throw new HttpListenerException(400, "There's another listener for " + prefix); } return; }
public void AddPrefix(HttpListenerPrefix prefix, WebSocketSharp.Net.HttpListener listener) { List <HttpListenerPrefix> httpListenerPrefixes; List <HttpListenerPrefix> httpListenerPrefixes1; Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes2; Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes3; if (prefix.Host == "*") { do { httpListenerPrefixes = this._unhandled; httpListenerPrefixes1 = (httpListenerPrefixes != null ? new List <HttpListenerPrefix>(httpListenerPrefixes) : new List <HttpListenerPrefix>()); prefix.Listener = listener; EndPointListener.addSpecial(httpListenerPrefixes1, prefix); }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._unhandled, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes); } else if (prefix.Host != "+") { do { httpListenerPrefixes2 = this._prefixes; if (!httpListenerPrefixes2.ContainsKey(prefix)) { httpListenerPrefixes3 = new Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener>(httpListenerPrefixes2); httpListenerPrefixes3[prefix] = listener; } else { if (httpListenerPrefixes2[prefix] != listener) { throw new WebSocketSharp.Net.HttpListenerException(87, string.Format("There's another listener for {0}.", prefix)); } break; } }while (Interlocked.CompareExchange <Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> >(ref this._prefixes, httpListenerPrefixes3, httpListenerPrefixes2) != httpListenerPrefixes2); } else { do { httpListenerPrefixes = this._all; httpListenerPrefixes1 = (httpListenerPrefixes != null ? new List <HttpListenerPrefix>(httpListenerPrefixes) : new List <HttpListenerPrefix>()); prefix.Listener = listener; EndPointListener.addSpecial(httpListenerPrefixes1, prefix); }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._all, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes); } }