public TinyWebModule(Assembly assembly)
        {
            foreach (string resourceName in assembly.GetManifestResourceNames())
            {
                if (!resourceName.ToLower().Contains(".content."))
                    continue;

                string fileName = resourceName.Substring(resourceName.ToLower().IndexOf(".content.") + 9);

                content["/" + fileName] = new EmbeddedContent
                {
                    ResourceName = resourceName,
                    ContentTypeHeader = new ContentTypeHeader(GuessContentHeader(fileName)),
                    Assembly = assembly
                };

            }

            // json

            foreach (var type in assembly.GetTypes())
            {
                if (typeof(JsonService).IsAssignableFrom(type))
                {
                    foreach (var method in type.GetMethods())
                    {
                        var routes = method.GetCustomAttributes(typeof(RouteAttribute), false);
                        foreach (RouteAttribute route in routes)
                        {
                            content[route.Path] = new ActionRunner { Type = type, Action = method };
                        }
                    }
                }
            }
        }
        public TinyWebModule(Assembly assembly)
        {
            foreach (string resourceName in assembly.GetManifestResourceNames())
            {
                if (!resourceName.ToLower().Contains(".content."))
                {
                    continue;
                }

                string fileName = resourceName.Substring(resourceName.ToLower().IndexOf(".content.") + 9);

                content["/" + fileName] = new EmbeddedContent
                {
                    ResourceName      = resourceName,
                    ContentTypeHeader = new ContentTypeHeader(GuessContentHeader(fileName)),
                    Assembly          = assembly
                };
            }

            // json

            foreach (var type in assembly.GetTypes())
            {
                if (typeof(JsonService).IsAssignableFrom(type))
                {
                    foreach (var method in type.GetMethods())
                    {
                        var routes = method.GetCustomAttributes(typeof(RouteAttribute), false);
                        foreach (RouteAttribute route in routes)
                        {
                            content[route.Path] = new ActionRunner {
                                Type = type, Action = method
                            };
                        }
                    }
                }
            }
        }
        public ProcessingResult Process(RequestContext context)
        {
            IServableContent hit = null;

            content.TryGetValue(context.Request.Uri.AbsolutePath, out hit);
            var runner = hit as ActionRunner;

            if (runner != null)
            {
                var    service = (JsonService)runner.Type.GetConstructor(Type.EmptyTypes).Invoke(null);
                string result  = null;
                try
                {
                    result = runner.Invoke(service, context.Request);
                }
                catch (Exception e)
                {
                    Logger.ReportException("Failed to execute action in MBWeb: " + context.Request.Uri.AbsolutePath, e);
                    throw;
                }

                var body  = new MemoryStream();
                var bytes = Encoding.UTF8.GetBytes(result);
                body.Write(bytes, 0, bytes.Length);

                context.Response.ContentLength.Value = body.Length;

                context.Response.Add(new ContentTypeHeader("application/json"));

                var generator = new ResponseWriter();
                generator.SendHeaders(context.HttpContext, context.Response);
                generator.SendBody(context.HttpContext, body);

                return(ProcessingResult.Abort);
            }

            EmbeddedContent embeddedContent = hit as EmbeddedContent;

            if (embeddedContent != null)
            {
                var actual = new MemoryStream();

                using (var body = embeddedContent.Stream)
                {
                    StreamReader reader = new StreamReader(body);
                    var          read   = reader.ReadToEnd();
                    var          bytes  = Encoding.UTF8.GetBytes(read);

                    actual.Write(bytes, 0, bytes.Length);
                    context.Response.ContentLength.Value = bytes.Length;
                    actual.Seek(0, SeekOrigin.Begin);
                }

                context.Response.Add(embeddedContent.ContentTypeHeader);
                var generator = new ResponseWriter();
                generator.SendHeaders(context.HttpContext, context.Response);
                generator.SendBody(context.HttpContext, actual);

                return(ProcessingResult.Abort);
            }


            // fake 404 for now
            var badRequest = new MemoryStream(Encoding.UTF8.GetBytes("Not Found : " + context.Request.Uri.AbsolutePath));
            var rw         = new ResponseWriter();

            context.Response.ContentLength.Value = badRequest.Length;
            rw.SendHeaders(context.HttpContext, context.Response);
            rw.SendBody(context.HttpContext, badRequest);
            return(ProcessingResult.Abort);
        }