private void ProcessMessageThread(object state) { var context = (HttpListenerContext)state; var request = context.Request; var response = context.Response; try { RouteHandler route; var routeMatch = Routes.Find(request.HttpMethod, request.RawUrl, request.Url.AbsolutePath, out route); if (routeMatch != null) { var match = routeMatch.Value; var auth = Authentication.TryAuthorize(context.Request.Headers["Authorization"], context.Request.RawUrl, route); if (auth.Principal != null) { var ctx = new HttpListenerContex(request, response, match, auth.Principal); ThreadContext.Request = ctx; ThreadContext.Response = ctx; Thread.CurrentPrincipal = auth.Principal; using (var stream = route.Handle(match.OrderedArgs, ctx, ctx, context.Request.InputStream, LocalStream.Value)) { var cms = stream as ChunkedMemoryStream; if (cms != null) { response.ContentLength64 = cms.Length; cms.CopyTo(response.OutputStream); } else if (stream != null) { if (stream.CanSeek) response.ContentLength64 = stream.Length; stream.CopyTo(response.OutputStream); } else { response.ContentType = null; response.ContentLength64 = 0; } } } else if (auth.SendAuthenticate) { context.Response.AddHeader("WWW-Authenticate", MissingBasicAuth); ReturnError(response, (int)auth.ResponseCode, auth.Error); } else ReturnError(response, (int)auth.ResponseCode, auth.Error); } else { var unknownRoute = "Unknown route " + request.RawUrl + " on method " + request.HttpMethod; ReturnError(response, 404, unknownRoute); } } catch (SecurityException sex) { ReturnError(response, (int)HttpStatusCode.Forbidden, sex.Message); } catch (ActionNotSupportedException anse) { ReturnError(response, 404, anse.Message); } catch (Exception ex) { TraceSource.TraceEvent(TraceEventType.Error, 5403, "{0}", ex); ReturnError(response, 500, ex.Message); } finally { response.Close(); } }
private void ProcessMessageThread(object state) { var context = (HttpListenerContext)state; var request = context.Request; var response = context.Response; try { RouteHandler route; var routeMatch = Routes.Find(request.HttpMethod, request.RawUrl, request.Url.AbsolutePath, out route); if (routeMatch != null) { var match = routeMatch.Value; var auth = Authentication.TryAuthorize(context.Request.Headers["Authorization"], context.Request.RawUrl, route); if (auth.Principal != null) { var ctx = new HttpListenerContex(request, response, match, auth.Principal); ThreadContext.Request = ctx; ThreadContext.Response = ctx; Thread.CurrentPrincipal = auth.Principal; using (var stream = route.Handle(match.OrderedArgs, ctx, ctx, context.Request.InputStream, LocalStream.Value)) { var cms = stream as ChunkedMemoryStream; if (cms != null) { response.ContentLength64 = cms.Length; cms.CopyTo(response.OutputStream); } else if (stream != null) { if (stream.CanSeek) { response.ContentLength64 = stream.Length; } stream.CopyTo(response.OutputStream); } else { response.ContentType = null; response.ContentLength64 = 0; } } } else if (auth.SendAuthenticate) { context.Response.AddHeader("WWW-Authenticate", MissingBasicAuth); ReturnError(response, (int)auth.ResponseCode, auth.Error); } else { ReturnError(response, (int)auth.ResponseCode, auth.Error); } } else { var unknownRoute = "Unknown route " + request.RawUrl + " on method " + request.HttpMethod; ReturnError(response, 404, unknownRoute); } } catch (SecurityException sex) { ReturnError(response, (int)HttpStatusCode.Forbidden, sex.Message); } catch (ActionNotSupportedException anse) { ReturnError(response, 404, anse.Message); } catch (Exception ex) { TraceSource.TraceEvent(TraceEventType.Error, 5403, "{0}", ex); ReturnError(response, 500, ex.Message); } finally { response.Close(); } }