public override void handleGETRequest(HttpProcessor p) { Settings.data.RemoveAppPath(p); if (mvcMain.ProcessRequest(p, p.requestedPage)) { } else { #region www DirectoryInfo WWWDirectory = new DirectoryInfo(Settings.data.GetWWWDirectoryBase()); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + p.requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!p.requestedPage.Equals("service-worker.js", StringComparison.OrdinalIgnoreCase)) { if (webpackProxy != null) { // Handle hot module reload provided by webpack dev server. switch (fi.Extension.ToLower()) { case ".js": case ".map": case ".css": case ".json": webpackProxy.Proxy(p); return; } } } if (!fi.Exists || p.requestedPage.Equals("", StringComparison.OrdinalIgnoreCase) || p.requestedPage.Equals("default", StringComparison.OrdinalIgnoreCase) || p.requestedPage.Equals("default.html", StringComparison.OrdinalIgnoreCase)) { mvcMain.ProcessRequest(p, "Default"); return; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified"); return; } using (FileStream fs = fi.OpenRead()) { p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); fs.CopyTo(p.tcpStream); p.tcpStream.Flush(); } #endregion } }
/// <summary> /// Prepares the response. /// </summary> /// <param name="context">The context.</param> /// <param name="mode">The mode.</param> /// <param name="fileName">Name of the file.</param> /// <param name="lengthFile">The length file.</param> public static void PrepareResponse(this HttpContext context, SendMode mode, string fileName, long lengthFile) { PrepareResponse( context, mode, fileName, Mime.GetMimeType(fileName), lengthFile); }
internal static void Main(string[] args) { //Using static method get mime Type From the Resources var name = Mime.GetMimeType("ami"); Console.WriteLine("ami = " + name); IMime mimeType = new Mime(); var mimeType1 = mimeType.Get("3dml"); Console.WriteLine("3dml = " + mimeType1); var mimeType2 = mimeType["z3"]; Console.WriteLine("z3 = " + mimeType2); }
private void InstallCollections(ModuleInstallRequest request) { const string collection = "collections"; var collectionFilter = @"{name: /^content\/" + collection + "/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}"; foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(collectionFilter))) { var fileSourceId = item[CommonConst.CommonField.DISPLAY_ID].ToString(); var fileName = item[CommonConst.CommonField.NAME].ToString(); var fileSize = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString()); var contentType = Mime.GetMimeType(fileName); var fileData = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "content/wwwroot", request.Name, fileSize); var id = fileData[CommonConst.CommonField.DISPLAY_ID].ToString(); var collectionName = new FileInfo(fileName).Name.Replace(CommonConst.CONFIG_FILE_EXTENSION, ""); var parent = new FileInfo(fileName).Directory.Name; _logger.Debug($"InstallCollection File : {fileName}, Collection {collectionName}, Parent: { parent}"); foreach (JObject joData in JObjectHelper.GetJArrayFromString(CommonUtility.GetStringFromBase64(_keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId)))) { try { joData[CommonConst.CommonField.DISPLAY_ID] = CommonUtility.GetNewID(); joData[CommonConst.CommonField.CREATED_DATA_DATE_TIME] = DateTime.Now; joData[CommonConst.CommonField.MODULE_NAME] = request.Name; joData[CommonConst.CommonField.VERSION] = request.Version; joData[CommonConst.CommonField.ÌS_OVERRIDE] = false; joData[CommonConst.CommonField.OVERRIDE_BY] = CommonConst.CommonValue.NONE; var url = GetUIAppUrl(parent); if (string.IsNullOrEmpty(url)) { WriteToDB(joData, request.Name, collectionName, CommonConst.CommonField.DATA_KEY); } else { _logger.Debug($"Callling remote /ui/installcollection Flile : {fileName}, Collection {collectionName}, Parent: { parent}, url {url}"); joData[CommonConst.CommonValue.COLLECTION] = collectionName; _apiGateway.CallAsync(CommonConst.ActionMethods.POST, "/ui/installcollection", "", joData, null, url).GetAwaiter().GetResult(); } } catch (Exception ex) { _logger.Error($"Error InstallCollections collection:{joData}", ex); } } } }
private void InstallWWWRoot(ModuleInstallRequest request) { var wwwrootFilter = @"{name: /^content\/wwwroot/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}"; _dbService.OverrideData(new JObject() { [CommonConst.CommonField.MODULE_NAME] = request.Name }, request.Name, CommonConst.CommonField.MODULE_NAME, CommonConst.Collection.STATIC_CONTECT); foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(wwwrootFilter))) { var fileName = string.Empty; try { var fileSourceId = item[CommonConst.CommonField.DISPLAY_ID].ToString(); fileName = item[CommonConst.CommonField.NAME].ToString(); var fileSize = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString()); var contentType = Mime.GetMimeType(fileName); var fileData = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "content/wwwroot", request.Name, fileSize); fileData[CommonConst.CommonField.VERSION] = request.Version; var id = fileData[CommonConst.CommonField.DISPLAY_ID].ToString(); var appUIFolder = GetAppFromUIFolder(fileData[CommonConst.CommonField.FILE_PATH].ToString()); if (!string.IsNullOrEmpty(appUIFolder)) { fileData[CommonConst.CommonField.FILE_PATH] = fileData[CommonConst.CommonField.FILE_PATH].ToString().Replace($"/{appUIFolder}", ""); } var appUIFolderUrl = GetUIAppUrl(appUIFolder); if (string.IsNullOrEmpty(appUIFolderUrl)) { WriteToDB(fileData, request.Name, CommonConst.Collection.STATIC_CONTECT, CommonConst.CommonField.FILE_PATH); _keyValueStorage.Put <string>(CommonConst.Collection.STATIC_CONTECT, id, _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId), null, request.Name); } else { fileData[CommonConst.CommonField.DATA] = _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId); _apiGateway.CallAsync(CommonConst.ActionMethods.POST, "/ui/installpage", "", fileData, null, appUIFolderUrl).GetAwaiter().GetResult(); } } catch (Exception ex) { _logger.Error($"Error InstallWWWRoot file:{fileName}", ex); } } }
protected IWebFile ProvideFile(Uri fileUrl) { if (fileUrl.LocalPath == "/KnowledgeBase/Image.ashx") { var q = fileUrl.Query.Split(new char[] { '=' }); if (q.Length < 2) { return(null); } var fileID = Guid.Parse(q[1]); var file = KbContext.CurrentKb.ManagerFileInclude.GetByID(fileID); var data = KbContext.CurrentKb.ManagerFileInclude.GetData(fileID); return(new LoadedData(fileUrl, Mime.GetMimeType(file.FileName), data)); } else { AppCore.Log.Warn("Intresting URL " + fileUrl); return(null); } }
private void InstallDlls(ModuleInstallRequest request) { var dllFilter = @"{name: /^lib\/netstandard2.0/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}"; foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(dllFilter))) { var fileSourceId = item[CommonConst.CommonField.DISPLAY_ID].ToString(); var fileName = item[CommonConst.CommonField.NAME].ToString(); var fileSize = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString()); var contentType = Mime.GetMimeType(fileName); var fileData = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "lib/netstandard2.0/", request.Name, fileSize); fileData[CommonConst.CommonField.VERSION] = request.Version; var id = fileData[CommonConst.CommonField.DISPLAY_ID].ToString(); var data = _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId); var assembly = Assembly.Load(Convert.FromBase64String(data)); fileData[CommonConst.CommonField.NAME] = assembly.FullName; WriteToDB(fileData, request.Name, CommonConst.Collection.DLLS, CommonConst.CommonField.FILE_PATH); InstallRoutes(request, assembly); _keyValueStorage.Put <string>(CommonConst.Collection.DLLS, id, data); } }
public override void handleGETRequest(HttpProcessor p) { #if DEBUG DirectoryInfo WWWDirectory = new DirectoryInfo(Globals.WritableDirectoryBase + "../../www"); #else DirectoryInfo WWWDirectory = new DirectoryInfo(Globals.WritableDirectoryBase + "www"); #endif string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + p.requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!fi.Exists) { p.writeFailure(); return; } string mime = Mime.GetMimeType(fi.Extension); if (p.requestedPage.StartsWith(".well-known/acme-challenge/")) { mime = "text/plain"; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(mime, -1, "304 Not Modified"); return; } p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.rawOutputStream); } p.rawOutputStream.Flush(); }
public override void handleGETRequest(HttpProcessor p) { BasicEventTimer bet = new BasicEventTimer(); bet.Start("GET " + p.requestedPage); try { string pageLower = p.requestedPage.ToLower(); if (pageLower == "json") { p.writeFailure("405 Method Not Allowed", "json API requests must use the POST method"); } else if (pageLower == "broadlinkcommands.json") { if (File.Exists(ServiceWrapper.BroadLinkCommandsFile)) { byte[] content = File.ReadAllBytes(ServiceWrapper.BroadLinkCommandsFile); p.writeSuccess("application/json", content.Length); p.outputStream.Flush(); p.tcpStream.Write(content, 0, content.Length); } else { p.writeFailure(); } } else if (pageLower == "itachcommands.json") { if (File.Exists(ServiceWrapper.iTachCommandsFile)) { byte[] content = File.ReadAllBytes(ServiceWrapper.iTachCommandsFile); p.writeSuccess("application/json", content.Length); p.outputStream.Flush(); p.tcpStream.Write(content, 0, content.Length); } else { p.writeFailure(); } } else if (pageLower == "downloadconfiguration") { string filename = "HotkeyAutomationConfig_" + Environment.MachineName + "_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".zip"; List <KeyValuePair <string, string> > additionalHeaders = new List <KeyValuePair <string, string> >(); additionalHeaders.Add(new KeyValuePair <string, string>("Content-Disposition", "attachment; filename=\"" + filename + "\"")); p.writeSuccess("application/zip", additionalHeaders: additionalHeaders); p.outputStream.Flush(); ConfigurationIO.WriteToStream(p.tcpStream); } else { #region www DirectoryInfo WWWDirectory = new DirectoryInfo(ServiceWrapper.config.GetWWWDirectoryBase()); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = null; if (p.requestedPage == "") { fi = GetDefaultFile(wwwDirectoryBase); } else { try { fi = new FileInfo(wwwDirectoryBase + p.requestedPage); } catch { fi = GetDefaultFile(wwwDirectoryBase); } } string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (webpackProxy != null) { // Handle hot module reload provided by webpack dev server. switch (fi.Extension.ToLower()) { case ".js": case ".map": case ".css": case ".json": bet.Start("Proxy Start"); webpackProxy.Proxy(p); bet.Start("Proxy End"); return; } } if (!fi.Exists) { fi = GetDefaultFile(wwwDirectoryBase); if (!fi.Exists) { p.writeFailure(); return; } } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { bet.Start("Write HTML"); string html = File.ReadAllText(fi.FullName); try { html = html.Replace("%%SYSTEM_NAME%%", ServiceWrapper.config.systemName); html = html.Replace("%%APP_VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); html = html.Replace("%%APPPATH%%", "/"); } catch (Exception ex) { Logger.Debug(ex); } p.writeSuccess(Mime.GetMimeType(fi.Extension)); p.outputStream.Write(html); p.outputStream.Flush(); } else { bet.Start("Write Response"); if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified"); return; } using (FileStream fs = fi.OpenRead()) { p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); fs.CopyTo(p.tcpStream); p.tcpStream.Flush(); } } #endregion } } finally { bet.Stop(); //Logger.Info(bet.ToString("\r\n")); } }
public void MimeTypeTest1() { var name = Mime.GetMimeType("ami"); Assert.AreEqual(name, "application/vnd.amiga.ami"); }
public override void handleGETRequest(HttpProcessor p) { string pageLower = p.requestedPage.ToLower(); //if (pageLower == "manualfix") //{ // if (IsAdmin(p)) // { // p.writeSuccess("text/plain"); // try // { // Agent.RetroactiveFixData(); // } // catch (Exception ex) // { // p.outputStream.WriteLine(ex.ToString()); // } // } // else // p.writeFailure("403 Forbidden"); //} if (pageLower.StartsWith("api/")) { p.writeFailure("405 Method Not Allowed"); } else if (p.requestedPage == "IP") { p.writeSuccess("text/plain"); p.outputStream.Write(p.RemoteIPAddressStr); } else if (p.requestedPage == "HEADERS") { p.writeSuccess("text/plain"); p.outputStream.Write(string.Join(Environment.NewLine, p.httpHeadersRaw.Select(h => h.Key + ": " + h.Value))); } else if (p.requestedPage == "IP") { p.writeSuccess("text/plain"); p.outputStream.Write(p.RemoteIPAddressStr); } else if (p.requestedPage == "") { p.writeRedirect("default.html"); } else { string wwwPath = Globals.ApplicationDirectoryBase + "www/"; #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { wwwPath = Globals.ApplicationDirectoryBase + "../../../www/"; } #endif DirectoryInfo WWWDirectory = new DirectoryInfo(wwwPath); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + p.requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!fi.Exists) { return; } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { string html = File.ReadAllText(fi.FullName); html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); html = html.Replace("%%RND%%", rnd.ToString()); html = html.Replace("%%ADMIN%%", IsAdmin(p) ? "true" : "false"); byte[] data = Encoding.UTF8.GetBytes(html); p.writeSuccess(Mime.GetMimeType(fi.Extension), data.Length); p.outputStream.Flush(); p.tcpStream.Write(data, 0, data.Length); p.tcpStream.Flush(); } else { string mime = Mime.GetMimeType(fi.Extension); if (pageLower.StartsWith(".well-known/acme-challenge/")) { mime = "text/plain"; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(mime, -1, "304 Not Modified"); return; } p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.tcpStream); } p.tcpStream.Flush(); } } }
/// <summary> /// Initializes a new instance of the <see cref="LoadedData"/> class. /// </summary> /// <param name="url">The URL.</param> /// <param name="bytes">The bytes.</param> public LoadedData(Uri url, byte[] bytes) { _contentType = Mime.GetMimeType(Path.GetFileName(url.LocalPath)); _bytes = bytes; _url = url; }
public override void handleGETRequest(HttpProcessor p) { try { string requestedPage = Uri.UnescapeDataString(p.request_url.AbsolutePath.TrimStart('/')); if (requestedPage == "admin") { p.writeRedirect("admin/main"); return; } if (requestedPage == "login") { LogOutUser(p, null); return; } Session s = sm.GetSession(p.requestCookies.GetValue("cps"), p.requestCookies.GetValue("auth"), p.GetParam("rawauth")); if (s.sid != null && s.sid.Length == 16) { p.responseCookies.Add("cps", s.sid, TimeSpan.FromMinutes(s.sessionLengthMinutes)); } if (requestedPage == "logout") { LogOutUser(p, s); return; } if (requestedPage.StartsWith("admin/")) { string adminPage = requestedPage == "admin" ? "" : requestedPage.Substring("admin/".Length); if (string.IsNullOrWhiteSpace(adminPage)) { adminPage = "main"; } int idxQueryStringStart = adminPage.IndexOf('?'); if (idxQueryStringStart == -1) { idxQueryStringStart = adminPage.Length; } adminPage = adminPage.Substring(0, idxQueryStringStart); Pages.Admin.AdminPage.HandleRequest(adminPage, p, s); return; } else if (requestedPage.StartsWith("image/")) { requestedPage = requestedPage.Substring("image/".Length); #region image/ if (requestedPage.EndsWith(".jpg") || requestedPage.EndsWith(".jpeg") || requestedPage.EndsWith(".png") || requestedPage.EndsWith(".webp")) { int extensionLength = requestedPage[requestedPage.Length - 4] == '.' ? 4 : 5; string format = requestedPage.Substring(requestedPage.Length - (extensionLength - 1)); string cameraId = requestedPage.Substring(0, requestedPage.Length - extensionLength); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { LogOutUser(p, s); return; } int wait = p.GetIntParam("wait", 5000); IPCameraBase cam = cm.GetCamera(cameraId); byte[] latestImage = cm.GetLatestImage(cameraId, wait); int patience = p.GetIntParam("patience"); if (patience > 0) { if (patience > 5000) { patience = 5000; } int timeLeft = patience; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); while (s.DuplicateImageSendCheck(cameraId, latestImage) && cam != null && timeLeft > 0) { // The latest image was already sent to the user in a previous image request. // Wait for up to 5 seconds as desired by the user to get a "new" image. cam.newFrameWaitHandle.WaitOne(Math.Max(50, timeLeft)); // This EventWaitHandle nonsense isn't perfect, so this should prevent excessively long delays in the event of a timing error. latestImage = cm.GetLatestImage(cameraId); timeLeft = patience - (int)timer.ElapsedMilliseconds; } } if (latestImage.Length == 0) { p.writeFailure("502 Bad Gateway"); return; } ImageFormat imgFormat = ImageFormat.Jpeg; latestImage = ImageConverter.HandleRequestedConversionIfAny(latestImage, p, ref imgFormat, format); p.tcpClient.SendBufferSize = latestImage.Length + 256; p.writeSuccess(Util.GetMime(imgFormat), latestImage.Length); p.outputStream.Flush(); p.rawOutputStream.Write(latestImage, 0, latestImage.Length); } else if (requestedPage.EndsWith(".mjpg")) { string cameraId = requestedPage.Substring(0, requestedPage.Length - 5); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { LogOutUser(p, s); return; } if (cm.GetLatestImage(cameraId).Length == 0) { return; } // Increasing the send buffer size here does not help streaming fluidity. p.writeSuccess("multipart/x-mixed-replace;boundary=ipcamera"); byte[] newImage; byte[] lastImage = null; while (!this.stopRequested) { try { newImage = cm.GetLatestImage(cameraId); while (newImage == lastImage) { Thread.Sleep(1); newImage = cm.GetLatestImage(cameraId); if (this.stopRequested) { return; } } lastImage = newImage; ImageFormat imgFormat = ImageFormat.Jpeg; byte[] sendImage = ImageConverter.HandleRequestedConversionIfAny(newImage, p, ref imgFormat); p.outputStream.WriteLine("--ipcamera"); p.outputStream.WriteLine("Content-Type: " + Util.GetMime(imgFormat)); p.outputStream.WriteLine("Content-Length: " + sendImage.Length); p.outputStream.WriteLine(); p.outputStream.Flush(); p.rawOutputStream.Write(sendImage, 0, sendImage.Length); p.rawOutputStream.Flush(); p.outputStream.WriteLine(); } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } break; } } } else if (requestedPage.EndsWith(".ogg")) { string cameraId = requestedPage.Substring(0, requestedPage.Length - 4); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { LogOutUser(p, s); return; } IPCameraBase _cam = cm.GetCamera(cameraId); if (_cam is Html5VideoCamera) { Html5VideoCamera cam = (Html5VideoCamera)_cam; ConcurrentQueue <byte[]> myDataListener = new ConcurrentQueue <byte[]>(); try { cam.RegisterStreamListener(myDataListener); p.writeSuccess("application/octet-stream"); p.outputStream.Flush(); byte[] outputBuffer; int chunkCount = 0; while (!this.stopRequested) { try { chunkCount = myDataListener.Count; if (chunkCount > 100) { return; // This connection is falling too far behind. End it. } else if (chunkCount > 0) { Console.Write(chunkCount + " "); if (myDataListener.TryDequeue(out outputBuffer)) { p.rawOutputStream.Write(outputBuffer, 0, outputBuffer.Length); p.rawOutputStream.Flush(); } } else { Thread.Sleep(1); } } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } break; } } } finally { cam.UnregisterStreamListener(myDataListener); } } else { p.writeFailure("501 Not Implemented"); } } else if (requestedPage.EndsWith(".cam")) { string cameraId = requestedPage.Substring(0, requestedPage.Length - 4); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { LogOutUser(p, s); return; } IPCameraBase cam = cm.GetCamera(cameraId); if (cam != null && cam.cameraSpec.ptzType == MJpegCameraProxy.Configuration.PtzType.Dahua || cam.cameraSpec.ptzType == MJpegCameraProxy.Configuration.PtzType.Hikvision) { p.writeRedirect("../Camera.html?cam=" + cameraId); return; } string userAgent = p.GetHeaderValue("User-Agent", ""); bool isMobile = userAgent.Contains("iPad") || userAgent.Contains("iPhone") || userAgent.Contains("Android") || userAgent.Contains("BlackBerry"); bool isLanConnection = p == null ? false : p.IsLanConnection; int defaultRefresh = isLanConnection && !isMobile ? -1 : 250; string html = CamPage.GetHtml(cameraId, !isMobile, p.GetIntParam("refresh", defaultRefresh), p.GetBoolParam("override") ? -1 : 600000, p); if (string.IsNullOrEmpty(html) || html == "NO") { p.writeFailure(); return; } p.writeSuccess("text/html"); p.outputStream.Write(html); } else if (requestedPage == "PTZPRESETIMG") { string cameraId = p.GetParam("id"); cameraId = cameraId.ToLower(); IPCameraBase cam = cm.GetCamera(cameraId); if (cam != null) { int index = p.GetIntParam("index", -1); if (index > -1) { if (cam.cameraSpec.ptz_proxy) { string auth = (!string.IsNullOrEmpty(cam.cameraSpec.ptz_username) && !string.IsNullOrEmpty(cam.cameraSpec.ptz_password)) ? "rawauth=" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_username) + ":" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_password) + "&" : ""; byte[] data = SimpleProxy.GetData("http://" + cam.cameraSpec.ptz_hostName + "/PTZPRESETIMG?" + auth + "id=" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_proxy_cameraId) + "&index=" + index); if (data.Length > 0) { p.writeSuccess("image/jpg", data.Length); p.outputStream.Flush(); p.rawOutputStream.Write(data, 0, data.Length); return; } } else { string fileName = Globals.ThumbsDirectoryBase + cameraId + index + ".jpg"; int minPermission = cm.GetCameraMinPermission(cameraId); if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission) || minPermission == 101) { } else { if (File.Exists(fileName)) { byte[] bytes = File.ReadAllBytes(fileName); p.writeSuccess("image/jpg", bytes.Length); p.outputStream.Flush(); p.rawOutputStream.Write(bytes, 0, bytes.Length); return; } } } } } { // Failed to get image thumbnail byte[] bytes = File.ReadAllBytes(Globals.WWWPublicDirectoryBase + "Images/qmark.png"); p.writeSuccess("image/png", bytes.Length); p.outputStream.Flush(); p.rawOutputStream.Write(bytes, 0, bytes.Length); return; } } else if (requestedPage.EndsWith(".wanscamstream")) { string cameraId = requestedPage.Substring(0, requestedPage.Length - ".wanscamstream".Length); IPCameraBase cam = cm.GetCamera(cameraId); if (cam == null) { return; } if (!cam.cameraSpec.wanscamCompatibilityMode) { return; } if (p.RemoteIPAddress != "127.0.0.1") { return; } Uri url = new Uri(cam.cameraSpec.imageryUrl); string host = url.Host; int port = url.Port; string path = url.PathAndQuery; //string path = "/livestream.cgi?user=admin&pwd=nooilwell&streamid=0&audio=0&filename="; //string path = "/videostream.cgi?user=admin&pwd=nooilwell&resolution=8"; int total = 0; try { //Console.WriteLine("opening"); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(host, port); byte[] buffer = new byte[4096]; socket.Send(UTF8Encoding.UTF8.GetBytes("GET " + path + " HTTP/1.1\r\nHost: " + host + ":" + port + "\r\nConnection: close\r\n\r\n")); //Console.WriteLine("open"); int read = socket.Receive(buffer); p.writeSuccess("video/raw"); p.outputStream.Flush(); while (read > 0 && socket.Connected && p.tcpClient.Connected) { p.rawOutputStream.Write(buffer, 0, read); total += read; //Console.WriteLine(read); read = socket.Receive(buffer); } //Console.WriteLine("close"); } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } } } #endregion } else if (requestedPage.StartsWith("control/")) { requestedPage = requestedPage.Substring("control/".Length); #region control/ if (requestedPage == "keepalive") { string cameraId = p.GetParam("id"); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { p.writeFailure("403 Forbidden"); return; } cm.GetRTSPUrl(cameraId, p); p.writeSuccess("text/plain"); p.outputStream.Write("1"); } else if (requestedPage == "PTZ") { string cameraId = p.GetParam("id"); cameraId = cameraId.ToLower(); int minPermission = cm.GetCameraMinPermission(cameraId); if (minPermission == 101) { p.writeFailure(); return; } if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission)) { LogOutUser(p, s); return; } PTZ.RunCommand(cameraId, p.GetParam("cmd")); p.writeSuccess("text/plain"); } #endregion } else { #region www int permissionRequired; if (!Util.TryGetValue(requestedPage.ToLower(), MJpegWrapper.cfg.GetWwwFilesList(), out permissionRequired)) { permissionRequired = -1; } string wwwDirectory = permissionRequired == -1 ? Globals.WWWPublicDirectoryBase : Globals.WWWDirectoryBase; if (permissionRequired < 0) { permissionRequired = 0; } else if (permissionRequired > 100) { permissionRequired = 100; } if (permissionRequired > s.permission) { LogOutUser(p, s); return; } DirectoryInfo WWWDirectory = new DirectoryInfo(wwwDirectory); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!fi.Exists) { p.writeFailure(); return; } // && (fi.Extension == ".html" || fi.Extension == ".htm") if (fi.Name.ToLower() == "camera.html" && fi.Length < 256000) { p.writeSuccess(Mime.GetMimeType(fi.Extension)); string html = File.ReadAllText(fi.FullName); CamPage2 cp = new CamPage2(html, p); html = cp.Html; html = html.Replace("%ALLCAMS%", string.Join(",", MJpegServer.cm.GenerateAllCameraIdList())); html = html.Replace("%ALLCAMS_IDS_NAMES_JS_ARRAY%", MJpegServer.cm.GenerateAllCameraIdNameList(s == null ? 0 : s.permission)); try { html = html.Replace("%REMOTEIP%", p.RemoteIPAddress); } catch (Exception ex) { Logger.Debug(ex); } p.outputStream.Write(html); p.outputStream.Flush(); } else if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { p.writeSuccess(Mime.GetMimeType(fi.Extension)); string html = File.ReadAllText(fi.FullName); html = html.Replace("%ALLCAMS%", string.Join(",", MJpegServer.cm.GenerateAllCameraIdList())); html = html.Replace("%ALLCAMS_IDS_NAMES_JS_ARRAY%", MJpegServer.cm.GenerateAllCameraIdNameList(s == null ? 0 : s.permission)); try { html = html.Replace("%REMOTEIP%", p.RemoteIPAddress); } catch (Exception ex) { Logger.Debug(ex); } p.outputStream.Write(html); p.outputStream.Flush(); } else { List <KeyValuePair <string, string> > additionalHeaders = new List <KeyValuePair <string, string> >(); additionalHeaders.Add(new KeyValuePair <string, string>("Cache-Control", "max-age=3600, public")); p.writeSuccess(Mime.GetMimeType(fi.Extension), additionalHeaders: additionalHeaders); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.rawOutputStream); } p.rawOutputStream.Flush(); } #endregion } } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } } }
public override void handleGETRequest(HttpProcessor p) { BasicEventTimer bet = new BasicEventTimer(); bet.Start("GET " + p.requestedPage); try { p.tcpClient.NoDelay = true; string pageLower = p.requestedPage.ToLower(); if (pageLower == "json") { p.writeFailure("405 Method Not Allowed", "json API requests must use the POST method"); } else if (p.requestedPage.StartsWith("WebSocketClientProxy/")) { WebSocketProxy.HandleWebSocketClientProxyRequest(p); } else if (p.requestedPage.StartsWith("WebSocketHostProxy/")) { WebSocketProxy.HandleWebSocketHostProxyResponse(p); } //else if (p.requestedPage == "windowskeycodes") //{ // p.writeSuccess(); // p.outputStream.Write("<table><thead><tr><th>KeyCode</th><th>Name</th></tr></thead><tbody>"); // HashSet<int> addedKeyCodes = new HashSet<int>(); // foreach (int keyCode in ((IEnumerable<int>)Enum.GetValues(typeof(System.Windows.Forms.Keys)))) // { // p.outputStream.Write("<tr><td>" + keyCode + "</td><td>" + (System.Windows.Forms.Keys)keyCode + "</td></tr>"); // } // p.outputStream.Write("</tbody></table>"); //} else { #region www DirectoryInfo WWWDirectory = new DirectoryInfo(ServiceWrapper.settings.GetWWWDirectoryBase()); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = null; if (p.requestedPage == "") { fi = GetDefaultFile(wwwDirectoryBase); } else { try { fi = new FileInfo(wwwDirectoryBase + p.requestedPage); } catch { fi = GetDefaultFile(wwwDirectoryBase); } } string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (webpackProxy != null) { // Handle hot module reload provided by webpack dev server. switch (fi.Extension.ToLower()) { case ".js": case ".map": case ".css": case ".json": bet.Start("Proxy Start"); webpackProxy.Proxy(p); bet.Start("Proxy End"); return; } } if (!fi.Exists) { fi = GetDefaultFile(wwwDirectoryBase); if (!fi.Exists) { p.writeFailure(); return; } } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { bet.Start("Write HTML"); string html = File.ReadAllText(fi.FullName); try { //html = html.Replace("%%REMOTEIP%%", p.RemoteIPAddressStr); html = html.Replace("%%SYSTEM_NAME%%", "SHRD"); html = html.Replace("%%APP_VERSION%%", AppVersion.VersionNumber); html = html.Replace("%%APPPATH%%", "/"); } catch (Exception ex) { Logger.Debug(ex); } p.writeSuccess(Mime.GetMimeType(fi.Extension)); p.outputStream.Write(html); p.outputStream.Flush(); } else { bet.Start("Write Response"); if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified"); return; } using (FileStream fs = fi.OpenRead()) { p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); fs.CopyTo(p.tcpStream); p.tcpStream.Flush(); } } #endregion } } finally { bet.Stop(); //Logger.Info(bet.ToString("\r\n")); } }
public override void handleGETRequest(HttpProcessor p) { string pageLower = p.requestedPage.ToLower(); if (pageLower.StartsWith("api/")) { p.writeFailure("405 Method Not Allowed"); } else if (p.requestedPage == "") { p.writeRedirect("default.html"); } else if (p.requestedPage == "TEST") { StringBuilder sb = new StringBuilder(); p.writeSuccess("text/plain"); p.outputStream.Write(string.Join(", ", Process.GetProcessesByName("svchost").Select(i => ProcessHelper.GetUserWhichOwnsProcess(i.Id)))); } else { string wwwPath = Globals.ApplicationDirectoryBase + "www/"; #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { wwwPath = Globals.ApplicationDirectoryBase + "../../www/"; } #endif DirectoryInfo WWWDirectory = new DirectoryInfo(wwwPath); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + p.requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!fi.Exists) { return; } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { string html = File.ReadAllText(fi.FullName); html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); html = html.Replace("%%RND%%", rnd.ToString()); byte[] data = Encoding.UTF8.GetBytes(html); if (!p.GetBoolParam("nocompress")) { p.CompressResponseIfCompatible(); } p.writeSuccess(Mime.GetMimeType(fi.Extension)); p.outputStream.Flush(); p.tcpStream.Write(data, 0, data.Length); p.tcpStream.Flush(); } else { string mime = Mime.GetMimeType(fi.Extension); if (pageLower.StartsWith(".well-known/acme-challenge/")) { mime = "text/plain"; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(mime, -1, "304 Not Modified"); return; } if (!p.GetBoolParam("nocompress")) { p.CompressResponseIfCompatible(); } p.writeSuccess(mime, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.tcpStream); } p.tcpStream.Flush(); } } }
public override void handleGETRequest(HttpProcessor p) { string pageLower = p.requestedPage.ToLower(); if (p.requestedPage == "randomdata") { p.writeSuccess("application/x-binary"); p.outputStream.Flush(); int testSec = p.GetIntParam("testsec", 5); testSec = BPMath.Clamp(testSec, 1, 30); long endTime = sw.ElapsedMilliseconds + (long)TimeSpan.FromSeconds(testSec).TotalMilliseconds; byte[] randomData = StaticRandom.NextBytes(p.tcpClient.SendBufferSize); while (sw.ElapsedMilliseconds < endTime) { p.tcpStream.Write(randomData, 0, randomData.Length); } } else if (p.requestedPage == "nstws") { wss.AcceptIncomingConnection(p.tcpClient); } else if (p.requestedPage == "HEADERS") { p.writeSuccess("text/plain"); p.outputStream.Write(string.Join(Environment.NewLine, p.httpHeadersRaw.Select(h => h.Key + ": " + h.Value))); } else if (p.requestedPage == "IP") { p.writeSuccess("text/plain"); p.outputStream.Write(p.RemoteIPAddressStr); } else { if (p.requestedPage == "") { p.requestedPage = "default.html"; } string wwwPath = Globals.ApplicationDirectoryBase + "www/"; #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { wwwPath = Globals.ApplicationDirectoryBase + "../../www/"; } #endif DirectoryInfo WWWDirectory = new DirectoryInfo(wwwPath); string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; FileInfo fi = new FileInfo(wwwDirectoryBase + p.requestedPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { p.writeFailure("400 Bad Request"); return; } if (!fi.Exists) { return; } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { string html = File.ReadAllText(fi.FullName); html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); html = html.Replace("%%RND%%", rnd.ToString()); byte[] data = Encoding.UTF8.GetBytes(html); p.writeSuccess(Mime.GetMimeType(fi.Extension), data.Length); p.outputStream.Flush(); p.tcpStream.Write(data, 0, data.Length); p.tcpStream.Flush(); } else { string mime = Mime.GetMimeType(fi.Extension); if (pageLower.StartsWith(".well-known/acme-challenge/")) { mime = "text/plain"; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(mime, -1, "304 Not Modified"); return; } p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.tcpStream); } p.tcpStream.Flush(); } } }
public override void handleGETRequest(HttpProcessor p) { try { string requestedPageLower = p.requestedPage.ToLower(); if (p.requestedPage == "errors") { string errors = File.ReadAllText(Globals.ErrorFilePath); p.writeSuccess(); p.outputStream.Write(HttpUtility.HtmlEncode(errors).Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>")); return; } if (p.requestedPage == "error") { Logger.Debug("/error page loaded"); p.writeSuccess(); p.outputStream.Write("Error written to log"); return; } if (p.requestedPage == "admin") { p.writeRedirect("admin/main"); return; } if (p.requestedPage == "login") { LogOutUser(p, null); return; } if (p.requestedPage == "testip") { p.writeSuccess("text/plain; charset=utf-8"); p.outputStream.Write(p.RemoteIPAddressStr); return; } Session s = sm.GetSession(p.requestCookies.GetValue("tlsess"), p.requestCookies.GetValue("tlauth"), p.GetParam("rawauth")); if (s != null && s.sid != null && s.sid.Length == 16) { p.responseCookies.Add("tlsess", s.sid, TimeSpan.FromMinutes(s.sessionLengthMinutes)); } if (p.requestedPage == "logout") { LogOutUser(p, s); return; } if (p.requestedPage.StartsWith("admin/")) { string adminPage = p.requestedPage == "admin" ? "" : p.requestedPage.Substring("admin/".Length); if (string.IsNullOrWhiteSpace(adminPage)) { adminPage = "main"; } int idxQueryStringStart = adminPage.IndexOf('?'); if (idxQueryStringStart == -1) { idxQueryStringStart = adminPage.Length; } adminPage = adminPage.Substring(0, idxQueryStringStart); Pages.Admin.AdminPage.HandleRequest(adminPage, p, s); return; } else if (p.requestedPage == "Navigation" || p.requestedPage == "NavigationNextDay") { if (HandlePublicServiceDisabled(p)) { return; } CameraSpec cs = TimelapseWrapper.cfg.GetCameraSpec(p.GetParam("cam")); if (cs == null || cs.type != CameraType.FTP) { p.writeFailure("400 Bad Request"); } else if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist)) { p.writeFailure("403 Forbidden"); } else { string path = p.GetParam("path"); p.writeSuccess(); try { if (p.requestedPage == "Navigation") { p.outputStream.Write(Navigation.GetNavHtml(cs, path)); } else { p.outputStream.Write(Navigation.GetNavHtmlForNextDay(cs, path)); } } catch (NavigationException) { p.outputStream.Write("Server busy. Please reload this page later."); } } } else if (p.requestedPage == "TimeZoneList") { if (HandlePublicServiceDisabled(p)) { return; } p.writeSuccess(); p.outputStream.Write(Pages.TimeZoneList.GetHtml()); } else if (requestedPageLower.StartsWith(TimelapseGlobals.ImageArchiveFolderNameLower + "/")) { p.writeFailure(); } else if (p.requestedPage == "GetFileListUrls") { if (HandlePublicServiceDisabled(p)) { return; } CameraSpec cs = TimelapseWrapper.cfg.GetCameraSpec(p.GetParam("cam")); if (cs == null || cs.type != CameraType.FTP) { p.writeFailure("400 Bad Request"); } else if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist)) { p.writeFailure("403 Forbidden"); } else { string path = p.GetParam("path"); try { string response = Navigation.GetFileListUrls(cs, path); p.writeSuccess("text/plain"); p.outputStream.Write(response); } catch (NavigationException) { p.writeFailure("503 Service Unavailable"); p.outputStream.Write(""); } catch (Exception ex) { Logger.Debug(ex); p.writeFailure("500 Internal Server Error"); } } } else { if (p.requestedPage.StartsWith("TimelapseAPI/", StringComparison.OrdinalIgnoreCase)) { mvcApi.ProcessRequest(p, p.requestedPage.Substring("TimelapseAPI/".Length)); return; } CameraSpec cs = null; if (p.request_url.Segments.Length > 1) { cs = TimelapseWrapper.cfg.GetCameraSpec(p.request_url.Segments[1].Trim('/')); } if (cs != null) { if (HandlePublicServiceDisabled(p)) { return; } if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist)) { p.writeFailure("403 Forbidden"); } else { // This page is something involving a camera we have configured if (p.request_url.Segments.Length == 2) { if (cs.type == CameraType.ThirdPartyHosted) { p.writeFailure("400 Bad Request"); } else { p.writeRedirect("Camera.html?cam=" + cs.id); // Redirect to the camera page for this camera } } else if (p.request_url.Segments.Length >= 3) { if (p.request_url.Segments.Length == 3 && p.request_url.Segments[2] == "latest.jpg") { if (cs.type == CameraType.ThirdPartyHosted) { if (!string.IsNullOrWhiteSpace(cs.path_3rdpartyimgzippedURL)) { WebServerUtil.Handle3rdPartyZippedImage(p, cs); return; } else { p.writeFailure("400 Bad Request"); return; } } if (!CameraMaintenance.MaintainCamera(cs)) { p.writeFailure("500 Internal Server Error"); return; } string latestImgTime; DateTime dateTime; string latestImagePathPart; try { latestImagePathPart = Navigation.GetLatestImagePath(cs, out latestImgTime, out dateTime); } catch (NavigationException) { p.writeFailure("503 Service Unavailable"); return; } string path = cs.id + "/" + latestImagePathPart; List <KeyValuePair <string, string> > headers = WebServerUtil.GetCacheEtagHeaders(TimeSpan.Zero, path); FileInfo imgFile = new FileInfo(TimelapseGlobals.ImageArchiveDirectoryBase + path); headers.Add(new KeyValuePair <string, string>("Content-Disposition", "inline; filename=\"" + cs.name + " " + imgFile.Name.Substring(0, imgFile.Name.Length - imgFile.Extension.Length) + ".jpg\"")); if (path == p.GetHeaderValue("if-none-match")) { p.writeSuccess("image/jpeg", -1, "304 Not Modified"); return; } byte[] data = WebServerUtil.GetImageData(path); p.writeSuccess("image/jpeg", data.Length, additionalHeaders: headers); p.outputStream.Flush(); p.tcpStream.Write(data, 0, data.Length); } else { if (cs.type != CameraType.FTP) { p.writeFailure("400 Bad Request"); return; } List <KeyValuePair <string, string> > headers = WebServerUtil.GetCacheEtagHeaders(TimeSpan.FromDays(365), p.requestedPage); FileInfo imgFile = new FileInfo(TimelapseGlobals.ImageArchiveDirectoryBase + p.requestedPage); headers.Add(new KeyValuePair <string, string>("Content-Disposition", "inline; filename=\"" + cs.name + " " + imgFile.Name.Substring(0, imgFile.Name.Length - imgFile.Extension.Length) + ".jpg\"")); if (p.requestedPage == p.GetHeaderValue("if-none-match")) { p.writeSuccess("image/jpeg", -1, "304 Not Modified"); return; } byte[] data = WebServerUtil.GetImageData(p.requestedPage); p.writeSuccess("image/jpeg", data.Length, additionalHeaders: headers); p.outputStream.Flush(); p.tcpStream.Write(data, 0, data.Length); } } else { p.writeFailure(); } } } else { #region www DirectoryInfo WWWDirectory = new DirectoryInfo(TimelapseGlobals.WWWDirectoryBase); DirectoryInfo debugWWW = GetDebugWWW(); if (debugWWW != null) { WWWDirectory = debugWWW; } string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/'; string reqPage = p.requestedPage; //if (reqPage == "") // reqPage = "Default.html"; FileInfo fi = new FileInfo(wwwDirectoryBase + reqPage); string targetFilePath = fi.FullName.Replace('\\', '/'); if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../")) { if (WebServerUtil.HandleAdminConfiguredRedirect(p)) { return; } p.writeFailure("400 Bad Request"); return; } //if (webpackProxy != null) //{ // // Handle hot module reload provided by webpack dev server. // switch (fi.Extension.ToLower()) // { // case ".js": // case ".map": // case ".css": // case ".json": // webpackProxy.Proxy(p); // return; // } //} if (!fi.Exists) { if (WebServerUtil.HandleAdminConfiguredRedirect(p)) { return; } //fi = new FileInfo(wwwDirectoryBase + "Default.html"); //if (!fi.Exists) //{ p.writeFailure("404 Not Found"); return; //} } if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000) { string html = File.ReadAllText(fi.FullName); if (fi.Name.ToLower() == "camera.html") { // camera.html triggers special behavior if (HandlePublicServiceDisabled(p)) { return; } string camId = p.GetParam("cam"); cs = TimelapseWrapper.cfg.GetCameraSpec(camId); if (cs == null || cs.type == CameraType.ThirdPartyHosted || !CameraMaintenance.MaintainCamera(cs)) { p.writeFailure("400 Bad Request"); return; } if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist)) { p.writeFailure("403 Forbidden"); return; } string latestImgTime = ""; DateTime dateTime = DateTime.MinValue; string navMenu; string latestImagePathPart; try { navMenu = Navigation.GetNavHtml(cs, Navigation.GetLatestPath(cs, out latestImgTime, out dateTime)); latestImagePathPart = Navigation.GetLatestImagePath(cs, out latestImgTime, out dateTime); } catch (NavigationException) { navMenu = "Server busy. Please reload this page later."; latestImagePathPart = "latest"; } html = html.Replace("%NAVMENU%", navMenu); html = html.Replace("%TOPMENU%", cs.topMenuHtml); html = html.Replace("%CAMID%", cs.id); html = html.Replace("%CAMNAME%", cs.name); html = html.Replace("%CSS%", WebServerUtil.GetCameraPageStyleCSS(cs)); html = html.Replace("%CAMFRAME_GRADIENT%", cs.imgBackgroundGradient ? "true" : "false"); html = html.Replace("%CAMNAME_HTML%", WebServerUtil.GetCameraNameHtml(cs)); string latestImagePath = cs.id + "/" + latestImagePathPart + ".jpg"; html = html.Replace("%LATEST_IMAGE%", latestImagePath); html = html.Replace("%LATEST_IMAGE_TIME%", HttpUtility.JavaScriptStringEncode(latestImgTime)); } else if (fi.Name.ToLower() == "all.html") { // all.html triggers special macro strings html = html.Replace("%ALL_CAMERAS_JS_ARRAY%", WebServerUtil.GetAllCamerasJavascriptArray(p.RemoteIPAddressStr)); html = html.Replace("%ALL_PAGE_HEADER%", TimelapseWrapper.cfg.options.allPageHeading); } try { html = html.Replace("%REMOTEIP%", p.RemoteIPAddressStr); html = html.Replace("%SYSTEM_NAME%", TimelapseWrapper.cfg.options.systemName); html = html.Replace("%APP_VERSION%", TimelapseGlobals.Version); } catch (Exception ex) { Logger.Debug(ex); } p.writeSuccess(Mime.GetMimeType(fi.Extension)); p.outputStream.Write(html); p.outputStream.Flush(); } else { string mime = Mime.GetMimeType(fi.Extension); if (p.requestedPage.StartsWith(".well-known/acme-challenge/")) { mime = "text/plain"; } if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since")) { p.writeSuccess(mime, -1, "304 Not Modified"); return; } p.writeSuccess(mime, fi.Length, additionalHeaders: WebServerUtil.GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc)); p.outputStream.Flush(); using (FileStream fs = fi.OpenRead()) { fs.CopyTo(p.tcpStream); } p.tcpStream.Flush(); } #endregion } } } catch (Exception ex) { if (!HttpProcessor.IsOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } } }