internal void RegisterContext(HttpListenerContext context) { try { Monitor.Enter(registry); registry [context] = context; Monitor.Enter(wait_queue); Monitor.Enter(ctx_queue); if (wait_queue.Count == 0) { ctx_queue.Add(context); } else { ListenerAsyncResult ares = (ListenerAsyncResult)wait_queue [0]; wait_queue.RemoveAt(0); ares.Complete(context); } } finally { Monitor.Exit(ctx_queue); Monitor.Exit(wait_queue); Monitor.Exit(registry); } }
public HttpListenerContext EndGetContext(IAsyncResult asyncResult) { CheckDisposed(); if (asyncResult == null) { throw new ArgumentNullException("asyncResult"); } ListenerAsyncResult ares = asyncResult as ListenerAsyncResult; if (ares == null) { throw new ArgumentException("Wrong IAsyncResult.", "asyncResult"); } if (!ares.IsCompleted) { ares.AsyncWaitHandle.WaitOne(); } lock (wait_queue) { int idx = wait_queue.IndexOf(ares); if (idx >= 0) { wait_queue.RemoveAt(idx); } } HttpListenerContext context = ares.GetContext(); if (auth_schemes != AuthenticationSchemes.Anonymous) { context.ParseAuthentication(); } return(context); // This will throw on error. }
static void InvokeCallback(object o) { ListenerAsyncResult ares = (ListenerAsyncResult)o; ares.cb(ares); }