Exemplo n.º 1
0
        /// <summary>
        /// Verarbeitung
        /// </summary>
        /// <param name="request">Die Anfrage</param>
        /// <returns>Die Antwort</returns>
        public override Response Process(Request request)
        {
            Response response;

            if (!TemporarilyMoved)
            {
                response = new ResponseRedirectPermanentlyMoved(Location);
            }
            else
            {
                response = new ResponseRedirectTemporarilyMoved(Location);
            }

            return(response);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Behandelt einen eingehenden Anforderung
        /// Wird nebenläufig ausgeführt
        /// </summary>
        /// <param name="client">Der Client</param>
        private void HandleClient(TcpClient client)
        {
            //lock (Context)
            {
                var stopwatch = Stopwatch.StartNew();

                Response response = new ResponseNotFound();
                var      request  = null as Request;
                var      ip       = client.Client.RemoteEndPoint;
                using var stream = client.GetStream();
                var reader        = new BinaryReader(stream);
                var writer        = new StreamWriter(stream);
                var moduleContext = null as IModuleContext;
                var uri           = null as IUri;

                if (!stream.DataAvailable)
                {
                    //Context.Log.Debug(message: this.I18N("httpserver.rejected"), args: ip);
                    //return;
                }

                Context.Log.Info(message: this.I18N("httpserver.connected"), args: ip);


                try
                {
                    request = Request.Create(reader, ip.ToString());
                }
                catch (Exception ex)
                {
                    Context.Log.Exception(ex);
                }

                if (request == null)
                {
                    response = new ResponseBadRequest();
                    var statusPage = CreateStatusPage(response.Status, request, moduleContext, uri);
                    if (statusPage != null)
                    {
                        statusPage.StatusMessage = "";
                        response.Content         = statusPage;
                    }
                    else
                    {
                        response.Content = $"<h4>{response.Status}</h4>Bad Request";
                    }

                    response.HeaderFields.ContentLength = response.Content != null?response.Content.ToString().Length : 0;
                }

                try
                {
                    Context.Log.Debug(message: this.I18N("httpserver.request"), args: new object[] { ip, $"{request?.Method} {request?.URL} {request?.Version}" });

                    var resource = ResourceManager.Find(request?.URL.TrimEnd('/'));
                    if (resource != null && resource.Type != null)
                    {
                        var type    = resource.Type;
                        var culture = Culture;
                        moduleContext = resource.ModuleContext;
                        uri           = new UriResource(resource.ModuleContext, request.URL, resource, culture);

                        try
                        {
                            culture = new CultureInfo(request.HeaderFields?.AcceptLanguage?.TrimStart().Substring(0, 2).ToLower());
                        }
                        catch
                        {
                        }

                        if (type?.Assembly.CreateInstance(type?.FullName) is IResource instance)
                        {
                            if (instance is II18N i18n)
                            {
                                i18n.Culture = culture;
                            }

                            if (instance is Resource res)
                            {
                                res.Request         = request;
                                res.Uri             = uri;
                                res.Context         = resource.ModuleContext;
                                res.ResourceContext = resource.ResourceContext;

                                foreach (var p in request.Param)
                                {
                                    res.AddParam(p.Value);
                                }

                                foreach (var v in resource.Variables)
                                {
                                    res.AddParam(v.Key, v.Value, ParameterScope.Url);
                                }
                            }

                            if (instance is IPage page)
                            {
                                page.Title = resource.Title;
                            }

                            instance.Initialization();
                            instance.PreProcess(request);
                            response = instance.Process(request);
                            response = instance.PostProcess(request, response);

                            if (instance is IPage)
                            {
                                response.Content += $"<!--{ stopwatch.ElapsedMilliseconds } ms -->";
                            }
                        }
                    }

                    if (response is ResponseNotFound)
                    {
                        var statusPage = CreateStatusPage(response.Status, request, moduleContext, uri);
                        if (statusPage != null)
                        {
                            response.Content = statusPage;
                        }
                        else
                        {
                            response.Content = $"<h4>{ response.Status }</h4>";
                        }

                        response.HeaderFields.ContentLength = response.Content != null?response.Content.ToString().Length : 0;
                    }
                }
                catch (RedirectException ex)
                {
                    if (ex.Permanet)
                    {
                        response = new ResponseRedirectPermanentlyMoved(ex.Url);
                    }
                    else
                    {
                        response = new ResponseRedirectTemporarilyMoved(ex.Url);
                    }
                }
                catch (Exception ex)
                {
                    Context.Log.Exception(ex);

                    response = new ResponseInternalServerError();
                    var statusPage = CreateStatusPage(response.Status, request, moduleContext, uri);
                    if (statusPage != null)
                    {
                        statusPage.StatusMessage = $"<h4>Message</h4>{ ex.Message }<br/><br/>" +
                                                   $"<h5>Source</h5>{ ex.Source }<br/><br/>" +
                                                   $"<h5>StackTrace</h5>{ ex.StackTrace.Replace("\n", "<br/>\n") }<br/><br/>" +
                                                   $"<h5>InnerException</h5>{ ex.InnerException?.ToString().Replace("\n", "<br/>\n") }";

                        response.Content = statusPage;
                    }
                    else
                    {
                        response.Content = $"<h4>{ response.Status }</h4> { ex }";
                    }

                    response.HeaderFields.ContentLength = response.Content != null?response.Content.ToString().Length : 0;
                }

                // Response an Client schicken
                try
                {
                    writer.Write(response.GetHeader());
                    writer.Flush();

                    if (response.Content is byte[] content)
                    {
                        using var bw = new BinaryWriter(writer.BaseStream);
                        bw.Write(content);
                    }
                    else
                    {
                        writer.Write(response.Content ?? "");
                    }

                    writer.Flush();
                }
                catch (Exception ex)
                {
                    Context.Log.Error(ip + ": " + ex.Message);
                }

                stopwatch.Stop();

                Context.Log.Info(message: this.I18N("httpserver.request.done"), args: new object[] { ip, stopwatch.ElapsedMilliseconds, response.Status });
            }
        }