// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
-using System.Collections.Generic;
+
+#if NET_2_0 && SECURITY_DEP
+
+using System.Collections;
using System.Threading;
//TODO: logging
namespace System.Net {
bool listening;
bool disposed;
- Dictionary<HttpListenerContext,HttpListenerContext> registry;
- List<HttpListenerContext> ctx_queue;
- List<ListenerAsyncResult> wait_queue;
+ Hashtable registry; // Dictionary<HttpListenerContext,HttpListenerContext>
+ ArrayList ctx_queue; // List<HttpListenerContext> ctx_queue;
+ ArrayList wait_queue; // List<ListenerAsyncResult> wait_queue;
public HttpListener ()
{
prefixes = new HttpListenerPrefixCollection (this);
- registry = new Dictionary<HttpListenerContext,HttpListenerContext> ();
- ctx_queue = new List<HttpListenerContext> ();
- wait_queue = new List<ListenerAsyncResult> ();
+ registry = new Hashtable ();
+ ctx_queue = new ArrayList ();
+ wait_queue = new ArrayList ();
auth_schemes = AuthenticationSchemes.Anonymous;
}
return;
if (!listening) {
- disposed = true;
return;
}
}
Close (false);
+ disposed = true;
}
void Close (bool force)
CheckDisposed ();
EndPointManager.RemoveListener (this);
Cleanup (force);
- disposed = true;
}
void Cleanup (bool close_existing)
throw new InvalidOperationException ("Please, call Start before using this method.");
ListenerAsyncResult ares = new ListenerAsyncResult (callback, state);
- lock (ctx_queue) {
- HttpListenerContext ctx = GetContextFromQueue ();
- if (ctx != null) {
- ares.Complete (ctx, true);
- return ares;
- }
- }
+ // lock wait_queue early to avoid race conditions
lock (wait_queue) {
+ lock (ctx_queue) {
+ HttpListenerContext ctx = GetContextFromQueue ();
+ if (ctx != null) {
+ ares.Complete (ctx, true);
+ return ares;
+ }
+ }
+
wait_queue.Add (ares);
}
wait_queue.RemoveAt (idx);
}
- return ares.GetContext (); // This will throw on error.
+ HttpListenerContext context = ares.GetContext ();
+ if (auth_schemes != AuthenticationSchemes.Anonymous) {
+ context.ParseAuthentication ();
+ }
+ return context; // This will throw on error.
}
public HttpListenerContext GetContext ()
if (disposed)
return;
- disposed = true;
Close (true); //TODO: Should we force here or not?
+ disposed = true;
}
internal void CheckDisposed ()
if (ctx_queue.Count == 0)
return null;
- HttpListenerContext context = ctx_queue [0];
+ HttpListenerContext context = (HttpListenerContext) ctx_queue [0];
ctx_queue.RemoveAt (0);
return context;
}
if (wait_queue.Count == 0) {
ctx_queue.Add (context);
} else {
- ListenerAsyncResult ares = wait_queue [0];
+ ListenerAsyncResult ares = (ListenerAsyncResult) wait_queue [0];
wait_queue.RemoveAt (0);
ares.Complete (context);
}