private void ProcessMessageThread(object state) { var context = (HttpListenerContext)state; var request = context.Request; var response = context.Response; try { UriTemplateMatch templateMatch; var route = Routes.Find(request, out templateMatch); if (route != null) { var auth = Authentication.TryAuthorize(context, route); if (auth.Principal != null) { var ctx = new HttpThreadContex(request, response, templateMatch); ThreadContext.Request = ctx; ThreadContext.Response = ctx; Thread.CurrentPrincipal = auth.Principal; using (var stream = route.Handle(templateMatch, context)) { if (stream.CanSeek) response.ContentLength64 = stream.Length; stream.CopyTo(response.OutputStream); } } 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 (WebFaultException<string> wfe) { ReturnError(response, (int)wfe.StatusCode, wfe.Detail); } catch (Exception ex) { ReturnError(response, 500, ex.Message); } }
private void ProcessMessageThread(object state) { var context = (HttpListenerContext)state; var request = context.Request; var response = context.Response; try { RouteMatch match; var route = Routes.Find(request, out match); if (route != null) { var auth = Authentication.TryAuthorize(context, route); if (auth.Principal != null) { var ctx = new HttpThreadContex(request, response, match); ThreadContext.Request = ctx; ThreadContext.Response = ctx; Thread.CurrentPrincipal = auth.Principal; using (var stream = route.Handle(match.BoundVars, context)) { var cms = stream as ChunkedMemoryStream; if (cms != null) { response.ContentLength64 = cms.Length; cms.CopyTo(response.OutputStream); } else { if (stream.CanSeek) response.ContentLength64 = stream.Length; stream.CopyTo(response.OutputStream); } } } 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) { Console.WriteLine(ex.Message); Logger.Error(ex.ToString()); ReturnError(response, 500, ex.Message); } finally { response.Close(); } }