Files
BrightSharp.Toolkit/BrightSharp.Toolkit.Extra/LocalSchemeHandlerFactory.cs

73 lines
2.8 KiB
C#
Raw Permalink Normal View History

2017-02-18 00:15:59 +03:00
using CefSharp;
using System;
using System.IO;
using System.Net;
namespace BrightSharp.Toolkit.Extra
{
public class FolderSchemeHandlerFactory : ISchemeHandlerFactory
{
private string rootFolder;
private string defaultPage;
private string schemeName;
private string hostName;
public FolderSchemeHandlerFactory(string rootFolder, string schemeName = null, string hostName = null, string defaultPage = "index.html")
{
this.rootFolder = Path.GetFullPath(rootFolder);
this.defaultPage = defaultPage;
this.schemeName = schemeName;
this.hostName = hostName;
if (!Directory.Exists(this.rootFolder))
{
throw new DirectoryNotFoundException(this.rootFolder);
}
}
IResourceHandler ISchemeHandlerFactory.Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
if (this.schemeName != null && !schemeName.Equals(this.schemeName, StringComparison.OrdinalIgnoreCase))
{
var invalidSchemeName = ResourceHandler.FromString(string.Format("SchemeName {0} does not match the expected SchemeName of {1}.", schemeName, this.schemeName));
invalidSchemeName.StatusCode = (int)HttpStatusCode.NotFound;
return invalidSchemeName;
}
var uri = new Uri(request.Url);
if (hostName != null && !uri.Host.Equals(hostName, StringComparison.OrdinalIgnoreCase))
{
var invalidHostName = ResourceHandler.FromString(string.Format("HostName {0} does not match the expected HostName of {1}.", uri.Host, hostName));
invalidHostName.StatusCode = (int)HttpStatusCode.NotFound;
return invalidHostName;
}
//Get the absolute path and remove the leading slash
var asbolutePath = uri.Host + uri.AbsolutePath;
if (string.IsNullOrEmpty(asbolutePath))
{
asbolutePath = defaultPage;
}
var filePath = Path.GetFullPath(Path.Combine(rootFolder, asbolutePath));
//Check the file requested is within the specified path and that the file exists
if (filePath.StartsWith(rootFolder, StringComparison.OrdinalIgnoreCase) && File.Exists(filePath))
{
var fileExtension = Path.GetExtension(filePath);
var mimeType = ResourceHandler.GetMimeType(fileExtension);
return ResourceHandler.FromFilePath(filePath, mimeType);
}
var fileNotFoundResourceHandler = ResourceHandler.FromString("File Not Found - " + filePath);
fileNotFoundResourceHandler.StatusCode = (int)HttpStatusCode.NotFound;
return fileNotFoundResourceHandler;
}
}
}