public ProcessingResult Process(RequestContext context) { IRequest request = context.Request; IResponse response = context.Response; // only handle GET if (!context.Request.Method.StartsWith("GET", StringComparison.OrdinalIgnoreCase)) { return(ProcessingResult.Continue); } string output; // serve a directory if (TryGenerateDirectoryPage(context, out output)) { response.ContentType = new ContentTypeHeader("text/html"); response.ContentLength.Value = output.Length; ResponseWriter generator = new ResponseWriter(); generator.SendHeaders(context.HttpContext, response); generator.Send(context.HttpContext, output, Encoding.UTF8); return(ProcessingResult.Abort); } return(ProcessingResult.Continue); }
private void SendErrorPage(Exception exception) { var httpException = exception as HttpException; var response = HttpContext.Current.Response; response.Status = httpException != null ? httpException.Code : HttpStatusCode.InternalServerError; response.Reason = exception.Message; response.Body.SetLength(0); var args = new ErrorPageEventArgs(HttpContext.Current) { Exception = exception }; ErrorPageRequested(this, args); try { var generator = new ResponseWriter(); if (args.IsHandled) { generator.Send(HttpContext.Current, response); } else { generator.SendErrorPage(HttpContext.Current, response, exception); } } catch (Exception err) { _logger.Error("Failed to display error page", err); } }
/// <summary> /// An error have occurred and we need to send a result pack to the client /// </summary> /// <param name="context">The context.</param> /// <param name="exception">The exception.</param> /// <remarks> /// Invoke base class (<see cref="Server"/>) to send the contents /// of <see cref="IHttpContext.Response"/>. /// </remarks> protected virtual void DisplayErrorPage(IHttpContext context, Exception exception) { var httpException = exception as HttpException; if (httpException != null) { context.Response.Reason = httpException.Code.ToString(); context.Response.Status = httpException.Code; } else { context.Response.Reason = "Internal Server Error"; context.Response.Status = HttpStatusCode.InternalServerError; } var args = new ErrorPageEventArgs(context) { Exception = exception }; ErrorPageRequested(this, args); ResponseWriter writer = HttpFactory.Current.Get <ResponseWriter>(); if (args.IsHandled) { writer.Send(context, context.Response); } else { writer.SendErrorPage(context, context.Response, exception); args.IsHandled = true; } }
private void ErrorPage(IRequest request, IResponse response, HttpException exception) { response.Status = exception.Code; response.Reason = exception.Message; response.Body.SetLength(0); var args = new ErrorPageEventArgs(HttpContext.Current, request, response); args.Exception = exception; ErrorPageRequested(this, args); // Add default error body. if (!args.IsHandled) { string htmlTemplate = "<html><head><title>{1}</title></head><body>Error {0}: {1}</body></html>"; byte[] body = Encoding.UTF8.GetBytes(string.Format(htmlTemplate, (int)response.Status, response.Reason)); response.Body.Write(body, 0, body.Length); } try { var generator = new ResponseWriter(); generator.Send(HttpContext.Current, response); } catch (Exception err) { #if DEBUG if (ExceptionThrown.GetInvocationList().Length == 1) { throw; } #endif ExceptionThrown(this, new ExceptionEventArgs(err)); } }
public ProcessingResult Process(RequestContext context) { IRequest request = context.Request; IResponse response = context.Response; var header = request.Headers["FWCID"].HeaderValue; var IsFWCHandy = header != null; bool IsAuthed = false; if (IsFWCHandy) { IsAuthed = (dbConn.Find <users>(x => x.mobile_id == header)).mobile_id == header; } string output = ""; string R = System.IO.Path.GetFileName(request.Uri.LocalPath); if (R == "register") { var xUsr = new users { mobile_id = header, Nachname = request.Parameters["lname"], Vorname = request.Parameters["fname"], rights = "" }; System.Net.WebClient WC = new System.Net.WebClient(); WC.DownloadString("https://www.feuerwehrcloud.de/deiva/regalert.php?fname=" + request.Parameters["fname"] + "&lname=" + request.Parameters["lname"] + "&id=" + header + "&fwid=" + System.Environment.MachineName); dbConn.Insert(xUsr); } else if (R == "alarms" && IsAuthed) { System.Collections.Generic.Dictionary <string, string> Data = new System.Collections.Generic.Dictionary <string, string>(); foreach (var item in System.IO.Directory.GetFiles("public/alarms/", "*.txt")) { //var F = new System.Collections.Generic.Dictionary<string, string>(); Data.Add(item, System.IO.File.ReadAllText(item.Replace(".txt", ".xml"))); } output = JsonConvert.SerializeObject(Data, Formatting.Indented); } else if (R == "mydata" && IsAuthed) { } else { return(ProcessingResult.Continue); } // Set default content type response.ContentType = new ContentTypeHeader("text/html"); //ProcessHeaders(response, CgiFeuerwehrCloud.Helper.ParseCgiHeaders(ref output)); response.ContentLength.Value = output.Length; ResponseWriter generator = new ResponseWriter(); generator.SendHeaders(context.HttpContext, response); generator.Send(context.HttpContext, output, System.Text.Encoding.UTF8); return(ProcessingResult.Abort); }
private void SendInternalServerError(HttpContext context, Exception exception) { var generator = new ResponseWriter(); var response = HttpFactory.Current.Get <IResponse>(); byte[] body = Encoding.ASCII.GetBytes("Internal server error " + exception); response.Body.Write(body, 0, body.Length); response.Status = HttpStatusCode.InternalServerError; response.Reason = exception.Message; generator.Send(context, response); }
/// <summary> /// Returns pure string content. /// </summary> /// <param name="context"></param> /// <param name="action"></param> /// <returns></returns> private ProcessingResult ProcessStringContent(RequestContext context, IActionResult action) { var content = (StringContent)action; context.Response.ContentLength.Value = context.Response.Encoding.GetByteCount(content.Body); if (content.ContentType != null) { context.Response.ContentType.Value = content.ContentType; } var writer = new ResponseWriter(); writer.SendHeaders(context.HttpContext, context.Response); writer.Send(context.HttpContext, content.Body, context.Response.Encoding); context.HttpContext.Stream.Flush(); return(ProcessingResult.Abort); }
/// <exception cref="Exception">Throwing exception if in debug mode and not exception handler have been specified.</exception> private void OnRequest(object sender, RequestEventArgs e) { var context = (HttpContext)sender; HttpFactory.Current = Factory; HttpContext.Current = context; try { var args = new RequestEventArgs(context, e.Request, e.Response); RequestReceived(this, args); if (!args.IsHandled) { // need to respond to the context. var generator = new ResponseWriter(); generator.Send(context, args.Response); } // Disconnect when done. if (e.Response.HttpVersion == "HTTP/1.0" || e.Response.Connection.Type == ConnectionType.Close) { context.Disconnect(); } } catch (Exception err) { if (err is HttpException) { var exception = (HttpException)err; ErrorPage(e.Request, e.Response, exception); } else { _logger.Debug("Request failed.", err); #if DEBUG if (ExceptionThrown.GetInvocationList().Length == 1) { throw; } #endif ExceptionThrown(this, new ExceptionEventArgs(err)); SendInternalServerError(context, err); } } }
/// <summary> /// 响应上下文中接收请求消息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnContextRequest(object sender, RequestEventArgs e) { var context = (HttpContext)sender; HttpFactory.Current = Factory; HttpContext.Current = context; try { var args = new RequestEventArgs(context, e.Request, e.Response); // 触发请求收到事件通知 RequestReceived(this, args); // 判断外部程序是否已处理该请求 if (!args.IsHandled) { // 如果外部程序未处理该请求,则发送请求的响应消息 var generator = new ResponseWriter(); generator.Send(context, args.Response); } // 请求被处理后断开连接 if (e.Response.HttpVersion == "HTTP/1.0" || e.Response.Connection.Type == ConnectionType.Close) { context.Disconnect(); } } catch (Exception err) { if (err is HttpException) { var exception = (HttpException)err; SendErrorPage(exception); } else { Logger.Debug("Request failed."); ExceptionHandler.Handle(err); SendErrorPage(err); } e.IsHandled = true; } }
/// <exception cref="Exception">Throwing exception if in debug mode and not exception handler have been specified.</exception> private void OnRequest(object sender, RequestEventArgs e) { var context = (HttpContext)sender; HttpFactory.Current = Factory; HttpContext.Current = context; try { var args = new RequestEventArgs(context, e.Request, e.Response); RequestReceived(this, args); if (!args.IsHandled) { // need to respond to the context. var generator = new ResponseWriter(); generator.Send(context, args.Response); } // Disconnect when done. if (e.Response.HttpVersion == "HTTP/1.0" || e.Response.Connection.Type == ConnectionType.Close) { context.Disconnect(); } } catch (Exception err) { if (err is HttpException) { var exception = (HttpException)err; SendErrorPage(exception); } else { _logger.Debug("Request failed.", err); SendErrorPage(err); } e.IsHandled = true; } }
/// <summary> /// Process a request. /// </summary> /// <param name="context">Request information</param> /// <returns>What to do next.</returns> /// <exception cref="InternalServerException">Failed to find file extension</exception> /// <exception cref="ForbiddenException">Forbidden file type.</exception> public ProcessingResult Process(RequestContext context) { var scriptName = CgiHelper.GetScriptName(context.Request.Uri, _cgiService.Extension); var filePath = scriptName.Replace("/", @"\").TrimStart('\\'); var path = Path.Combine(_homeDirectory, filePath); if (String.IsNullOrEmpty(path)) { return(ProcessingResult.Continue); } IRequest request = context.Request; IResponse response = context.Response; try { string ext = Path.GetExtension(scriptName).TrimStart('.'); if (!ext.Equals(_cgiService.Extension, StringComparison.OrdinalIgnoreCase)) { return(ProcessingResult.Continue); } // TODO: is this a good place to lock? lock (_readLock) { int code = _cgiService.Execute(context.HttpContext, path, scriptName); string output = String.Empty; // Check StandardError stream if (_cgiService.HasError) { output = _cgiService.StandardError; } else { output = System.Text.Encoding.Default.GetString(System.Text.Encoding.UTF8.GetBytes(_cgiService.StandardOutput)); //System.Text.Encoding.de } // Set default content type response.ContentType = new ContentTypeHeader("text/html"); ProcessHeaders(response, CgiHelper.ParseCgiHeaders(ref output)); response.ContentLength.Value = output.Length; ResponseWriter generator = new ResponseWriter(); generator.SendHeaders(context.HttpContext, response); generator.Send(context.HttpContext, output, CgiHelper.Encoding); } return(ProcessingResult.Abort); } catch (FileNotFoundException err) { throw new InternalServerException("Failed to process file '" + request.Uri + "'.", err); } catch (Exception err) { throw new InternalServerException("Failed to process file '" + request.Uri + "'.", err); } }
/// <summary> /// Process a request. /// </summary> /// <param name="context">Request information</param> /// <returns>What to do next.</returns> /// <exception cref="InternalServerException">Failed to find file extension</exception> /// <exception cref="ForbiddenException">Forbidden file type.</exception> public ProcessingResult Process(RequestContext context) { IRequest request = context.Request; IResponse response = context.Response; IFileService _fileService = new DiskFileService("/", _homeDirectory); var fileContext = new FileContext(context.Request, System.DateTime.Now); _fileService.GetFile(fileContext); var scriptName = fileContext.Filename; if (!fileContext.IsFound) { response.Status = HttpStatusCode.NotFound; return(ProcessingResult.SendResponse); } try { string ext = Path.GetExtension(scriptName).TrimStart('.'); if (!ext.Equals("fritz", StringComparison.OrdinalIgnoreCase)) { return(ProcessingResult.Continue); } // TODO: is this a good place to lock? lock (_readLock) { string fileContent = System.IO.File.ReadAllText(scriptName); string[] XInfo = fileContent.Split(new [] { "{%" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < XInfo.Length; i++) { if (XInfo[i].Contains("%}")) { XInfo[i] = XInfo[i].Substring(0, XInfo[i].IndexOf("%}")); } } XInfo = XInfo.RemoveAt(0); // Wanpppconn1 service = new Wanpppconn1("https://192.168.178.1"); // service.SoapHttpClientProtocol.Credentials = new NetworkCredential("dslf-config", "Viking2011"); // string ip; // service.GetExternalIPAddress(out ip); //service.AddPortMapping //service.DeletePortMapping //service.ForceTermination //service.SetUserName //service.SetPassword //service.SetAutoDisconnectTimeSpan //service.SetConnectionType //service.SetConnectionTrigger //service.SetIdleDisconnectTime //service.GetUserName (out ip); //service.GetConnectionTypeInfo (out ip, out ip2); //service.SetUserName ("ar15636672741"); //service.SetPassword ("internet"); // /* Anrufbeantworter */ // Tam service2 = new Tam("https://l7dmkoihvym5jghm.myfritz.net:499"); // service2.SoapHttpClientProtocol.Credentials = new NetworkCredential("dslf-config", "Viking2011"); // string url; // service2.GetMessageList(0, out url); // Get Tam message List // //service2.SetEnable // //service2.DeleteMessage // //service2.MarkMessage // FritzTR064.Generated.Voip service4; // //service4.AddVoIPAccount // //service4.DelVoIPAccount // //service4.DialSetConfig // FritzTR064.Generated.Voip f; // System.Net.WebClient Anrufbeantworter = new WebClient (); // Anrufbeantworter.Credentials = service2.SoapHttpClientProtocol.Credentials; // string AB = Anrufbeantworter.DownloadString (url); //Deviceconfig service3 = new Deviceconfig("https://fritz.box"); //service3. /* Telefonbuch */ //Contact service = new Contact("https://fritz.box"); //service.AddPhonebook("ExtraID", "Name"); // Create a new Phonebook //string callListUrl; //service.GetCallList(out callListUrl); ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; System.Xml.XmlDocument CallList = new System.Xml.XmlDocument(); CallList.Load("dyndata/calllist.xml"); System.Xml.XmlDocument TamsList = new System.Xml.XmlDocument(); TamsList.Load("dyndata/tam1.xml"); System.Collections.Generic.Dictionary <string, string> DSL = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/wandsl.info"); System.Collections.Generic.Dictionary <string, string> WLAN = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/wlan.info"); System.Collections.Generic.Dictionary <string, string> TAM = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/tam.info"); System.Collections.Generic.Dictionary <string, string> DEVI = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/Deviceinfo.info"); System.Collections.Generic.Dictionary <string, string> WAN = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/wanppp.info"); System.Collections.Generic.Dictionary <string, string> TEL = FeuerwehrCloud.Helper.AppSettings.Load("dyndata/phone.info"); foreach (var XP in XInfo) { switch (XP) { case "INCLUDE_HEADER": fileContent = fileContent.Replace("{%" + XP + "%}", System.IO.File.ReadAllText("web/header.html")); break; case "INCLUDE_FOOTER": fileContent = fileContent.Replace("{%" + XP + "%}", System.IO.File.ReadAllText("web/footer.html")); break; case "FAX_ENABLED": fileContent = fileContent.Replace("{%" + XP + "%}", "Alarmfax-System aktiviert"); break; case "INFO_LED_TYPE": fileContent = fileContent.Replace("{%" + XP + "%}", "blinkt bei neuen Nachrichten/Anrufen"); break; // case "TAM_DATA": int iTamz = 0; string CLL2 = ""; foreach (System.Xml.XmlElement item in TamsList["Root"].SelectNodes("//Message")) { //if(item.Name =="Call") { CLL2 += "<tr><td>" + item["Date"].InnerText + "<td>" + item ["Number"].InnerText + "</td></tr>"; iTamz++; //} if (iTamz > 8) { break; } } fileContent = fileContent.Replace("{%" + XP + "%}", CLL2); break; case "TAM_COUNT": fileContent = fileContent.Replace("{%" + XP + "%}", (TamsList["Root"].SelectNodes("//Message").Count).ToString()); break; case "CALL_COUNT": fileContent = fileContent.Replace("{%" + XP + "%}", (CallList["root"].SelectNodes("//Call").Count).ToString()); break; case "CALL_LIST": int iCallZ = 0; string CLL = ""; foreach (System.Xml.XmlElement item in CallList["root"].SelectNodes("//Call")) { //if(item.Name =="Call") { CLL += "<tr><td" + (item ["Type"].InnerText == "2"?" style='color:red'":(item ["Type"].InnerText == "3"?" style='color:#00AA00'":" style='color:#0000CC'")) + ">" + item["Date"].InnerText + "<td" + (item ["Type"].InnerText == "2"?" style='color:red'":(item ["Type"].InnerText == "3"?" style='color:#00AA00'":" style='color:#0000CC'")) + ">" + (item ["Name"].InnerText != ""?item ["Name"].InnerText + " (" + item ["Called"].InnerText + ")" : item ["Called"].InnerText) + "</td></tr>"; iCallZ++; //} if (iCallZ > 8) { break; } } fileContent = fileContent.Replace("{%" + XP + "%}", CLL); break; case "DSL_CONNECTED": fileContent = fileContent.Replace("{%" + XP + "%}", (bool.Parse(DSL["wandslIFEnable"]) == true?"bereit, " + (int.Parse(DSL["DownstreamCurrRate"]) / 1024) + " Mbit/s (down), " + (int.Parse(DSL["UpstreamCurrRate"])) + " kbit/s (up)":"getrennt")); break; case "NETWORK_DEVICE_COUNT": string[] result1 = System.IO.File.ReadAllLines(System.IO.Path.Combine(System.Environment.CurrentDirectory, "network.csv")); int iDeviceCount = 0; for (int i = 0; i < result1.Length; i++) { string[] Columns = result1[i].Split(new [] { ";" }, StringSplitOptions.None); if (Columns[2] == "up") { iDeviceCount++; } } fileContent = fileContent.Replace("{%" + XP + "%}", (iDeviceCount.ToString())); break; case "NETWORK_DEVICE_LIST": string[] result2 = System.IO.File.ReadAllLines(System.IO.Path.Combine(System.Environment.CurrentDirectory, "network.csv")); string HTMLTable = ""; int idev = 0; for (int i = 0; i < result2.Length; i++) { string[] Columns = result2[i].Split(new [] { ";" }, StringSplitOptions.None); if (Columns[2] == "up") { HTMLTable += "<tr><td>" + (Columns[4] == ""?"PC-" + Columns[0].Replace(".", "-"):Columns[4]).Replace(".fritz.box", "") + "</td><td>LAN</td></tr>"; idev++; if (idev == 9) { break; } } } string dHTM = ""; for (int i = 0; i < result2.Length; i++) { string[] Columns = result2[i].Split(new [] { ";" }, StringSplitOptions.None); if (Columns[2] == "up") { dHTM += "<tr><td><a href='http://" + Columns[0] + "' target='_blank'>" + (Columns[4] == ""?"PC-" + Columns[0].Replace(".", "-"):Columns[4]).Replace(".fritz.box", "") + "</a></td><td>" + Columns[0] + "</td><td>" + Columns[5] + "</td><td>" + Columns[6] + "</td></tr>"; } } System.IO.File.WriteAllText("web/devices_online.htm", dHTM); dHTM = ""; for (int i = 0; i < result2.Length; i++) { string[] Columns = result2[i].Split(new [] { ";" }, StringSplitOptions.None); if (Columns[2] == "down") { dHTM += "<tr><td>" + (Columns[4] == ""?"PC-" + Columns[0].Replace(".", "-"):Columns[4]).Replace(".fritz.box", "") + "</td><td>" + Columns[0] + "</td><td>" + Columns[5] + "</td><td>" + Columns[6] + "</td></tr>"; } } System.IO.File.WriteAllText("web/devices_offline.htm", dHTM); fileContent = fileContent.Replace("{%" + XP + "%}", HTMLTable); break; case "WLAN_CONNECTED": fileContent = fileContent.Replace("{%" + XP + "%}", (bool.Parse(WLAN["Enable"])?"An, " + WLAN["Status"]:"Deaktiviert")); break; case "DECT_CONNECTED": fileContent = fileContent.Replace("{%" + XP + "%}", "Deaktiviert"); break; case "USB_CONNECTED": fileContent = fileContent.Replace("{%" + XP + "%}", ((int.Parse(FeuerwehrCloud.Helper.AppSettings.Load("dyndata/usb.info")["Count"])) - 5) + " Geräte angeschlossen"); break; case "I2C_CONNECTED": fileContent = fileContent.Replace("{%" + XP + "%}", ((int.Parse(FeuerwehrCloud.Helper.AppSettings.Load("dyndata/i2c.info")["Count"]))) + " Module angeschlossen"); break; case "CONNECTED_SINCE4": if (WAN["ConnectionStatus"] == "Connected") { fileContent = fileContent.Replace("{%" + XP + "%}", "verbunden seit " + WAN["Uptime"]); } else { fileContent = fileContent.Replace("{%" + XP + "%}", "nicht verbunden"); } break; case "CONNECTED_IP4": fileContent = fileContent.Replace("{%" + XP + "%}", WAN["ExternalIPAddress"]); break; case "CONNECTED_SINCE6": fileContent = fileContent.Replace("{%" + XP + "%}", ""); break; case "CONNECTED_IP6": fileContent = fileContent.Replace("{%" + XP + "%}", ""); break; case "PHONE_LINES_STRING": fileContent = fileContent.Replace("{%" + XP + "%}", TEL["NumberList"]); break; case "PHONE_LINE_COUNT": fileContent = fileContent.Replace("{%" + XP + "%}", TEL["NumberOfNumbers"]); break; default: fileContent = fileContent.Replace("{%" + XP + "%}", ""); break; } } //fileContent = fileContent.Replace("%") string output = fileContent; // Set default content type response.ContentType = new ContentTypeHeader("text/html"); //ProcessHeaders(response, CgiFeuerwehrCloud.Helper.ParseCgiHeaders(ref output)); response.ContentLength.Value = output.Length; ResponseWriter generator = new ResponseWriter(); generator.SendHeaders(context.HttpContext, response); generator.Send(context.HttpContext, output, System.Text.Encoding.UTF8); } return(ProcessingResult.Abort); } catch (FileNotFoundException err) { throw new InternalServerException("Failed to process file '" + request.Uri + "'.", err); } catch (Exception err) { throw new InternalServerException("Failed to process file '" + request.Uri + "'.", err); } }