Find() 개인적인 메소드

private Find ( string httpMethod, char buffer, int len, RouteHandler &handler ) : RouteMatch?
httpMethod string
buffer char
len int
handler RouteHandler
리턴 RouteMatch?
예제 #1
0
        private RouteMatch?ReadUrl(int rowEnd, out RouteHandler handler)
        {
            var httpLen1 = HttpMethod.Length + 1;
            var charBuf  = TmpCharBuf;
            var end      = rowEnd - 2 - HttpProtocolVersion.Length;

            for (int x = httpLen1; x < end; x++)
            {
                var tb = InputTemp[x];
                if (tb > 250)
                {
                    RawUrl = UTF8.GetString(InputTemp, httpLen1, end - httpLen1);
                    var askSign      = RawUrl.IndexOf('?');
                    var absolutePath = askSign == -1 ? RawUrl : RawUrl.Substring(0, askSign);
                    return(Routes.Find(HttpMethod, RawUrl, absolutePath, out handler));
                }
                charBuf[x - httpLen1] = (char)tb;
            }
            var match = Routes.Find(HttpMethod, charBuf, end - httpLen1, out handler);

            if (match == null)
            {
                RawUrl = new string(charBuf, 0, end - httpLen1);
            }
            else
            {
                RawUrl = match.Value.RawUrl;
            }
            return(match);
        }
예제 #2
0
        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);
            }
            finally
            {
                response.Close();
            }
        }
예제 #3
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();
            }
        }
예제 #4
0
        private void ProcessSocketThread(object state)
        {
            var socket = (Socket)state;

            socket.Blocking = true;
            IPrincipal previousPrincipal = null;
            var        ctx = Context.Value;

            ctx.Reset();
            try
            {
                while (ctx.Parse(socket))
                {
                    RouteMatch match;
                    var        route = Routes.Find(ctx.HttpMethod, ctx.RawUrl, ctx.AbsolutePath, out match);
                    if (route == null)
                    {
                        var unknownRoute = "Unknown route " + ctx.RawUrl + " on method " + ctx.HttpMethod;
                        ctx.ReturnError(socket, 404, unknownRoute, false);
                        break;
                    }
                    var auth = Authentication.TryAuthorize(ctx.GetRequestHeader("authorization"), ctx.RawUrl, route);
                    if (auth.Principal != null)
                    {
                        ctx.ForRouteWithAuth(match, auth.Principal);
                        ThreadContext.Request  = ctx;
                        ThreadContext.Response = ctx;
                        if (previousPrincipal != auth.Principal)
                        {
                            Thread.CurrentPrincipal = previousPrincipal = auth.Principal;
                        }
                        using (var stream = route.Handle(match.OrderedArgs, ctx.Stream))
                        {
                            var keepAlive = ctx.Return(stream, socket);
                            if (keepAlive)
                            {
                                if (ctx.Pipeline)
                                {
                                    continue;
                                }
                                else if (socket.Connected)
                                {
                                    Thread.Yield();
                                    if (socket.Poll(1000000, SelectMode.SelectRead))
                                    {
                                        continue;
                                    }
                                }
                            }
                            socket.Close();
                            break;
                        }
                    }
                    else if (auth.SendAuthenticate)
                    {
                        ctx.AddHeader("WWW-Authenticate", MissingBasicAuth);
                        ctx.ReturnError(socket, (int)auth.ResponseCode, auth.Error, true);
                        break;
                    }
                    else
                    {
                        ctx.ReturnError(socket, (int)auth.ResponseCode, auth.Error, true);
                        break;
                    }
                }
            }
            catch (SecurityException sex)
            {
                try { ctx.ReturnError(socket, (int)HttpStatusCode.Forbidden, sex.Message, true); }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex);
                }
            }
            catch (ActionNotSupportedException anse)
            {
                try { ctx.ReturnError(socket, 404, anse.Message, true); }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                TraceSource.TraceEvent(TraceEventType.Error, 5403, "{0}", ex);
                try { ctx.ReturnError(socket, 500, ex.Message, false); }
                catch (Exception ex2)
                {
                    Console.WriteLine(ex2.Message);
                    TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex2);
                }
            }
        }
예제 #5
0
 private void ProcessSocket(Socket socket, HttpSocketContext ctx, IPrincipal principal)
 {
     ctx.Reset();
     try
     {
         while (ctx.Parse(socket))
         {
             RouteMatch match;
             var        route = Routes.Find(ctx.HttpMethod, ctx.RawUrl, ctx.AbsolutePath, out match);
             if (route == null)
             {
                 var unknownRoute = "Unknown route " + ctx.RawUrl + " on method " + ctx.HttpMethod;
                 ctx.ReturnError(socket, 404, unknownRoute, false);
                 break;
             }
             var auth = Authentication.TryAuthorize(ctx.GetRequestHeader("authorization"), ctx.RawUrl, route);
             if (auth.Principal != null)
             {
                 ctx.ForRouteWithAuth(match, auth.Principal);
                 ThreadContext.Request  = ctx;
                 ThreadContext.Response = ctx;
                 if (principal != auth.Principal)
                 {
                     Thread.CurrentPrincipal = principal = auth.Principal;
                 }
                 using (var stream = route.Handle(match.OrderedArgs, ctx, ctx, ctx.InputStream, ctx.OutputStream))
                 {
                     var keepAlive = ctx.Return(stream, socket);
                     if (keepAlive)
                     {
                         if (ctx.Pipeline)
                         {
                             continue;
                         }
                         else if (socket.Connected)
                         {
                             if (Requests.TryAdd(new RequestInfo(socket, socket.Available > 0)))
                             {
                                 return;
                             }
                         }
                     }
                     socket.Close();
                     return;
                 }
             }
             else if (auth.SendAuthenticate)
             {
                 ctx.AddHeader("WWW-Authenticate", MissingBasicAuth);
                 ctx.ReturnError(socket, (int)auth.ResponseCode, auth.Error, true);
                 return;
             }
             else
             {
                 ctx.ReturnError(socket, (int)auth.ResponseCode, auth.Error, true);
                 return;
             }
         }
     }
     catch (SecurityException sex)
     {
         try { ctx.ReturnError(socket, (int)HttpStatusCode.Forbidden, sex.Message, true); }
         catch (Exception ex)
         {
             TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex);
         }
     }
     catch (ActionNotSupportedException anse)
     {
         try { ctx.ReturnError(socket, 404, anse.Message, true); }
         catch (Exception ex)
         {
             TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex);
         }
     }
     catch (Exception ex)
     {
         TraceSource.TraceEvent(TraceEventType.Error, 5403, "{0}", ex);
         try { ctx.ReturnError(socket, 500, ex.Message, false); }
         catch (Exception ex2)
         {
             TraceSource.TraceEvent(TraceEventType.Error, 5404, "{0}", ex2);
         }
     }
 }