internal void HandleRequest(HttpRequest request) { if (!request.IsResponseSent) { HttpRequest.SetCurrentRequest(request); Logger.LogMessage(DiagnosticsLevels.TRACE, "Attempting to process connection request."); if (request.URL.AbsolutePath == "/jquery.js") { request.ResponseStatus = HttpStatusCodes.OK; request.ResponseHeaders.ContentType = "text/javascript"; request.ResponseWriter.Write(Utility.ReadEmbeddedResource("Org.Reddragonit.EmbeddedWebServer.resources.jquery.min.js")); request.SendResponse(); } else if (request.URL.AbsolutePath == "/json.js") { request.ResponseStatus = HttpStatusCodes.OK; request.ResponseHeaders.ContentType = "text/javascript"; request.ResponseWriter.Write(Utility.ReadEmbeddedResource("Org.Reddragonit.EmbeddedWebServer.resources.json2.min.js")); request.SendResponse(); } else { DateTime start = DateTime.Now; Site site = null; if (_sites.Count > 1) { foreach (Site s in _sites) { if ((s.ServerName != null) && (s.ServerName == request.URL.Host)) { site = s; break; } } if (site==null) { foreach (Site s in _sites) { if (s.Aliases != null) { foreach (string str in s.Aliases) { if (str == request.URL.Host) { site = s; break; } } } } } if (site==null) { foreach (Site s in _sites) { foreach (sIPPortPair ipp in s.ListenOn) { if ((ipp.Address != IPAddress.Any) && (request.Connection.LocalEndPoint == new IPEndPoint(ipp.Address, ipp.Port))) { site = s; break; } } } } } if (site == null) site = _defaultSite; Logger.LogMessage(DiagnosticsLevels.DEBUG, "Total time to find site: " + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "ms"); if ((!site.AllowGET && request.Method.ToUpper() == "GET") || (!site.AllowPOST && request.Method.ToUpper() == "POST")) { request.ResponseStatus = HttpStatusCodes.Method_Not_Allowed; request.SendResponse(); } else { request.SetTimeout(site); try { if (request.URL.AbsolutePath == "/") request.UseDefaultPath(site); site.ProcessRequest(request); } catch (ThreadAbortException tae) { if (!request.IsResponseSent) { request.ResponseStatus = HttpStatusCodes.Request_Timeout; request.ClearResponse(); request.ResponseWriter.WriteLine("The server timed out processing the request."); request.SendResponse(); } } catch (Exception e) { Logger.LogError(e); if (!request.IsResponseSent) { request.ResponseStatus = HttpStatusCodes.Internal_Server_Error; request.ClearResponse(); request.ResponseWriter.Write(e.Message); request.SendResponse(); } } Logger.LogMessage(DiagnosticsLevels.DEBUG, "Total time to process request to URL " + request.URL.AbsolutePath + " = " + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "ms"); } } } else Logger.LogMessage(DiagnosticsLevels.TRACE, "Response sent prior to processing, error in request."); }
public void ProcessRequest(HttpRequest request, Org.Reddragonit.EmbeddedWebServer.Interfaces.Site site) { request.SetTimeout(20 * 60 * 1000); if (request.Parameters["FileType"] == "Backup") { string fileName = DateTime.Now.ToString("yyyy_MM_dd_HH_mm") + "_"; switch (request.Parameters["Level"]) { case "Database": fileName += "database"; break; case "Voicemail": fileName += "voicemail"; break; case "Recordings": fileName += "recordings"; break; case "Sounds": fileName += "sounds"; break; case "Script": fileName += "scripts"; break; default: fileName += "complete"; break; } request.ResponseHeaders.ContentType = "application/octet-stream"; request.ResponseHeaders["content-disposition"] = "attachment; filename=" + fileName + ".fscbak"; ZipFile zf = new ZipFile(fileName); DirectoryInfo di; byte[] tmp; if ((request.Parameters["Level"] == "Database") || (request.Parameters["Level"] == "Complete")) { Stream ms = new MemoryStream(); Org.Reddragonit.Dbpro.Backup.BackupManager.BackupDataToStream(Org.Reddragonit.Dbpro.Connections.ConnectionPoolManager.GetPool(typeof(Org.Reddragonit.FreeSwitchConfig.DataCore.DB.Phones.Extension)), ref ms); zf.AddFile("database.rdpbk", ((MemoryStream)ms).ToArray()); } //backup voicemail if ((request.Parameters["Level"] == "Voicemail") || (request.Parameters["Level"] == "Complete")) { di = new DirectoryInfo(Settings.Current[Constants.BASE_PATH_NAME].ToString() + Path.DirectorySeparatorChar + Constants.DEFAULT_VOICEMAIL_PATH); ImportZipDirectory("voicemail", zf, di); Log.Trace("Issueing voicemail backup command..."); StringBuilder sb = new StringBuilder(); sb.AppendLine("DELETE FROM voicemail_msgs;"); foreach (Dictionary<string, string> row in Utility.SelectFromFreeswitchDB(VM_DB, VM_SELECT_QUERY)) { sb.Append("INSERT INTO voicemail_msgs VALUES("); sb.Append("'" + row["created_epoch"] + "',"); sb.Append("'" + row["read_epoch"] + "',"); sb.Append("'" + row["username"] + "',"); sb.Append("'" + row["domain"] + "',"); sb.Append("'" + row["uuid"] + "',"); sb.Append("'" + row["cid_name"] + "',"); sb.Append("'" + row["cid_number"] + "',"); sb.Append("'" + row["in_folder"] + "',"); sb.Append("'" + row["file_path"] + "',"); sb.Append("'" + row["message_len"] + "',"); sb.Append("'" + row["flags"] + "',"); if (row.ContainsKey("read_flags") && row["read_flags"] != null) sb.Append("'" + row["read_flags"] + "',"); else sb.Append("null,"); if (row.ContainsKey("forwarded_by") && row["forwarded_by"] != null) sb.Append("'" + row["forwarded_by"] + "'"); else sb.Append("null"); sb.AppendLine(");"); } zf.AddFile("voicemail_restore.sql", ASCIIEncoding.ASCII.GetBytes(sb.ToString())); } //backup scripts if ((request.Parameters["Level"] == "Script") || (request.Parameters["Level"] == "Complete")) { di = new DirectoryInfo(Settings.Current[Constants.BASE_PATH_NAME].ToString() + Path.DirectorySeparatorChar + Constants.DEFAULT_SCRIPTS_DIRECTORY); ImportZipDirectory("scripts", zf, di); } //backup sounds if ((request.Parameters["Level"] == "Sounds") || (request.Parameters["Level"] == "Complete")) { di = new DirectoryInfo(Settings.Current[Constants.BASE_PATH_NAME].ToString() + Path.DirectorySeparatorChar + Constants.DEFAULT_SOUNDS_DIRECTORY); ImportZipDirectory("sounds", zf, di); } //backup recordings if ((request.Parameters["Level"] == "Recordings") || (request.Parameters["Level"] == "Complete")) { di = new DirectoryInfo(Settings.Current[Constants.BASE_PATH_NAME].ToString() + Path.DirectorySeparatorChar+ Constants.DEFAULT_RECORDINGS_DIRECTORY); ImportZipDirectory("recordings", zf, di); } //flush and close the final zip stream request.UseResponseStream(zf.ToStream()); } else if (request.Parameters["clazz"] != null) { Type t = Org.Reddragonit.FreeSwitchConfig.DataCore.Utility.LocateType(request.Parameters["clazz"]); if (t != null) { System.Reflection.MethodInfo mi = null; foreach (System.Reflection.MethodInfo m in t.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static)) { if (m.Name == request.Parameters["MethodName"] && m.GetParameters().Length == 0) { mi = m; break; } } if (mi == null) { request.ResponseStatus = HttpStatusCodes.Not_Found; request.ResponseWriter.Write("Unable to locate static public method " + request.Parameters["MethodName"] + " in class type " + request.Parameters["clazz"]); } else { mi.Invoke(null, new object[0]); } } else { request.ResponseStatus = HttpStatusCodes.Not_Found; request.ResponseWriter.Write("Unable to locate clazz type " + request.Parameters["clazz"]); } } else { request.ResponseStatus = HttpStatusCodes.Not_Found; } }