Inheritance: IRequestContext, IResponseContext
Ejemplo n.º 1
0
 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();
     }
 }
Ejemplo n.º 2
0
        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();
            }
        }