/// <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); }
/// <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 }); } }