Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
mattkol committed Feb 26, 2021
1 parent ba81080 commit 9bc7dd7
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using CefSharp;
using Chromely.Core.Configuration;
using Chromely.Core.Logging;
using Chromely.Core;
using Chromely.Core.Network;
using Microsoft.Extensions.Logging;

namespace Chromely.CefSharp.Browser
{
Expand All @@ -26,13 +23,17 @@ public class DefaultAssemblyResourceSchemeHandler : ResourceHandler
private const string STATUSTEXT_BADREQUEST = "Resource loading error.";

protected readonly IChromelyRequestSchemeHandlerProvider _requestSchemeHandlerProvider;
protected IChromelyResource _chromelyResource;
protected readonly IChromelyErrorHandler _chromelyErrorHandler;
protected FileInfo _fileInfo;
protected Regex _regex = new Regex("[/]");
protected Stream _stream;
protected string _mimeType;

public DefaultAssemblyResourceSchemeHandler(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider)
public DefaultAssemblyResourceSchemeHandler(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider, IChromelyErrorHandler chromelyErrorHandler)
{
_requestSchemeHandlerProvider = requestSchemeHandlerProvider;
_chromelyResource = new ChromelyResource();
_chromelyErrorHandler = chromelyErrorHandler;
_fileInfo = null;
}

/// <summary>
Expand All @@ -53,31 +54,27 @@ public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback c
var fileAbsolutePath = u.AbsolutePath;
var file = u.Authority + fileAbsolutePath;

var fileInfo = new FileInfo(file);
_fileInfo = new FileInfo(file);
// Check if file exists
if (!fileInfo.Exists)
if (!_fileInfo.Exists)
{
SetResponseInfoOnFailure((int)HttpStatusCode.NotFound, STATUSTEXT_FILENOTFOUND);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo);
callback.Continue();

Logger.Instance.Log.LogWarning($"File: {file}: {StatusText}");
}
// Check if file exists but empty
else if (fileInfo.Length == 0)
else if (_fileInfo.Length == 0)
{
SetResponseInfoOnFailure((int)HttpStatusCode.BadRequest, STATUSTEXT_ZEROFILESIZE);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo);
callback.Continue();

Logger.Instance.Log.LogWarning($"File: {file}: {StatusText}");
}
else
{
Task.Run(() =>
{
using (callback)
{
_stream = null;
_mimeType = "text/html";
_chromelyResource.Content = null;
_chromelyResource.MimeType = "text/html";

try
{
Expand All @@ -88,11 +85,10 @@ public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback c
}
catch (Exception exception)
{
SetResponseInfoOnFailure((int)HttpStatusCode.BadRequest, STATUSTEXT_BADREQUEST);
Logger.Instance.Log.LogError(exception, exception.Message);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo, exception);
}

if (_stream == null)
if (_chromelyResource.Content == null)
{
callback.Cancel();
}
Expand All @@ -116,10 +112,10 @@ private bool ProcessLocalFile(string file)
if ((fileInfo.Exists) && fileInfo.Length > 0)
{
byte[] fileBytes = File.ReadAllBytes(file);
_stream = new MemoryStream(fileBytes);
_chromelyResource.Content = new MemoryStream(fileBytes);

string extension = Path.GetExtension(file);
_mimeType = MimeMapper.GetMimeType(extension);
_chromelyResource.MimeType = MimeMapper.GetMimeType(extension);
}

return false;
Expand All @@ -138,11 +134,12 @@ private bool ProcessAssmblyEmbeddedFile(string url, string file, string fileAbso

var option = scheme.AssemblyOptions;
var manifestName = string.Join(".", option.DefaultNamespace, option.RootFolder, _regex.Replace(fileAbsolutePath, ".")).Replace("..", ".").Replace("..", ".");
_stream = option.TargetAssembly.GetManifestResourceStream(manifestName);
if (_stream != null && _stream.Length > 0)
var stream = option.TargetAssembly.GetManifestResourceStream(manifestName);
if (stream != null && stream.Length > 0)
{
stream.CopyTo(_chromelyResource.Content);
string extension = Path.GetExtension(file);
_mimeType = MimeMapper.GetMimeType(extension);
_chromelyResource.MimeType = MimeMapper.GetMimeType(extension);
return true;
}

Expand All @@ -152,20 +149,13 @@ private bool ProcessAssmblyEmbeddedFile(string url, string file, string fileAbso
protected void SetResponseInfoOnSuccess()
{
//Reset the stream position to 0 so the stream can be copied into the underlying unmanaged buffer
_stream.Position = 0;
_chromelyResource.Content.Position = 0;
//Populate the response values - No longer need to implement GetResponseHeaders (unless you need to perform a redirect)
ResponseLength = _stream.Length;
MimeType = _mimeType;
ResponseLength = _chromelyResource.Content.Length;
MimeType = _chromelyResource.MimeType;
StatusCode = (int)HttpStatusCode.OK;
StatusText = STATUSTEXT_OK;
Stream = _stream;
}

protected void SetResponseInfoOnFailure(int status, string statusText)
{
_stream = GetMemoryStream(statusText, Encoding.UTF8);
StatusCode = status;
StatusText = statusText;
Stream = _chromelyResource.Content;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Use of this source code is governed by Chromely MIT licensed and CefSharp BSD-style license that can be found in the LICENSE file.

using CefSharp;
using Chromely.Core;

namespace Chromely.CefSharp.Browser
{
Expand All @@ -11,10 +12,12 @@ namespace Chromely.CefSharp.Browser
public class DefaultAssemblyResourceSchemeHandlerFactory : ISchemeHandlerFactory
{
protected readonly IChromelyRequestSchemeHandlerProvider _requestSchemeHandlerProvider;
protected readonly IChromelyErrorHandler _chromelyErrorHandler;

public DefaultAssemblyResourceSchemeHandlerFactory(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider)
public DefaultAssemblyResourceSchemeHandlerFactory(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider, IChromelyErrorHandler chromelyErrorHandler)
{
_requestSchemeHandlerProvider = requestSchemeHandlerProvider;
_chromelyErrorHandler = chromelyErrorHandler;
}

/// <summary>
Expand All @@ -37,7 +40,7 @@ public DefaultAssemblyResourceSchemeHandlerFactory(IChromelyRequestSchemeHandler
/// </returns>
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
return new DefaultAssemblyResourceSchemeHandler(_requestSchemeHandlerProvider);
return new DefaultAssemblyResourceSchemeHandler(_requestSchemeHandlerProvider, _chromelyErrorHandler);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public DefaultRequestSchemeHandler(IChromelyRouteProvider routeProvider,
public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
{
var scheme = _requestSchemeHandlerProvider?.GetScheme(request.Url);
if (scheme != null && scheme.UrlSchemeType == UrlSchemeType.LocalRquest)
if (scheme != null && scheme.UrlSchemeType == UrlSchemeType.LocalRequest)
{
_stream = null;
var uri = new Uri(request.Url);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
using System.Text;
using System.Threading.Tasks;
using CefSharp;
using Chromely.Core.Logging;
using Chromely.Core;
using Chromely.Core.Network;
using Microsoft.Extensions.Logging;

namespace Chromely.CefSharp.Browser
{
Expand All @@ -19,12 +18,17 @@ namespace Chromely.CefSharp.Browser
public class DefaultResourceSchemeHandler : ResourceHandler
{
private const string STATUSTEXT_OK = "OK";
private const string STATUSTEXT_ZEROFILESIZE = "Resource loading error: file size is zero.";
private const string STATUSTEXT_FILENOTFOUND = "File not found.";
private const string STATUSTEXT_BADREQUEST = "Resource loading error.";

protected Stream _stream;
protected string _mimeType;
protected IChromelyResource _chromelyResource;
protected IChromelyErrorHandler _chromelyErrorHandler;
protected FileInfo _fileInfo;

public DefaultResourceSchemeHandler(IChromelyErrorHandler chromelyErrorHandler)
{
_chromelyResource = new ChromelyResource();
_chromelyErrorHandler = chromelyErrorHandler;
_fileInfo = null;
}

/// <summary>
/// The process request async.
Expand All @@ -46,47 +50,42 @@ public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback c
var u = new Uri(request.Url);
var file = u.Authority + u.AbsolutePath;

var fileInfo = new FileInfo(file);
_fileInfo = new FileInfo(file);
// Check if file exists
if (!fileInfo.Exists)
if (!_fileInfo.Exists)
{
SetResponseInfoOnFailure((int)HttpStatusCode.NotFound, STATUSTEXT_FILENOTFOUND);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo);
callback.Continue();

Logger.Instance.Log.LogWarning($"File: {file}: {StatusText}");
}
// Check if file exists but empty
else if (fileInfo.Length == 0)
else if (_fileInfo.Length == 0)
{
SetResponseInfoOnFailure((int)HttpStatusCode.BadRequest, STATUSTEXT_ZEROFILESIZE);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo);
callback.Continue();

Logger.Instance.Log.LogWarning($"File: {file}: {StatusText}");
}
else
{
Task.Run(() =>
{
using (callback)
{
_stream = null;
_mimeType = "text/html";
_chromelyResource.Content = null;
_chromelyResource.MimeType = "text/html";

try
{
byte[] fileBytes = File.ReadAllBytes(file);
_stream = new MemoryStream(fileBytes);
_chromelyResource.Content = new MemoryStream(fileBytes);

string extension = Path.GetExtension(file);
_mimeType = MimeMapper.GetMimeType(extension);
_chromelyResource.MimeType = MimeMapper.GetMimeType(extension);
}
catch (Exception exception)
{
SetResponseInfoOnFailure((int)HttpStatusCode.BadRequest, STATUSTEXT_BADREQUEST);
Logger.Instance.Log.LogError(exception, exception.Message);
_chromelyResource = _chromelyErrorHandler.HandleError(_fileInfo, exception);
}

if (_stream == null)
if (_chromelyResource.Content == null)
{
callback.Cancel();
}
Expand All @@ -105,20 +104,13 @@ public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback c
protected virtual void SetResponseInfoOnSuccess()
{
//Reset the stream position to 0 so the stream can be copied into the underlying unmanaged buffer
_stream.Position = 0;
_chromelyResource.Content.Position = 0;
//Populate the response values - No longer need to implement GetResponseHeaders (unless you need to perform a redirect)
ResponseLength = _stream.Length;
MimeType = _mimeType;
ResponseLength = _chromelyResource.Content.Length;
MimeType = _chromelyResource.MimeType;
StatusCode = (int)HttpStatusCode.OK;
StatusText = STATUSTEXT_OK;
Stream = _stream;
}

protected void SetResponseInfoOnFailure(int status, string statusText)
{
_stream = GetMemoryStream(statusText, Encoding.UTF8);
StatusCode = status;
StatusText = statusText;
Stream = _chromelyResource.Content;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Use of this source code is governed by Chromely MIT licensed and CefSharp BSD-style license that can be found in the LICENSE file.

using CefSharp;
using Chromely.Core;

namespace Chromely.CefSharp.Browser
{
Expand All @@ -10,6 +11,13 @@ namespace Chromely.CefSharp.Browser
/// </summary>
public class DefaultResourceSchemeHandlerFactory : ISchemeHandlerFactory, IDefaultCustomHandler
{
protected readonly IChromelyErrorHandler _chromelyErrorHandler;

public DefaultResourceSchemeHandlerFactory(IChromelyErrorHandler chromelyErrorHandler)
{
_chromelyErrorHandler = chromelyErrorHandler;
}

/// <summary>
/// The create.
/// </summary>
Expand All @@ -30,7 +38,7 @@ public class DefaultResourceSchemeHandlerFactory : ISchemeHandlerFactory, IDefau
/// </returns>
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
return new DefaultResourceSchemeHandler();
return new DefaultResourceSchemeHandler(_chromelyErrorHandler);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,14 @@ public ChromelyBoundObjectHandler(IChromelyRouteProvider routeProvider,
*/
internal sealed class ChromelyResourceSchemeHandlerFactory : DefaultResourceSchemeHandlerFactory, IDefaultResourceCustomHandler
{
public ChromelyResourceSchemeHandlerFactory(IChromelyErrorHandler chromelyErrorHandler) : base(chromelyErrorHandler)
{
}
}

internal sealed class ChromelyAssemblyResourceSchemeHandlerFactory : DefaultAssemblyResourceSchemeHandlerFactory, IDefaultAssemblyResourceCustomHandler
{
public ChromelyAssemblyResourceSchemeHandlerFactory(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider) : base(requestSchemeHandlerProvider)
public ChromelyAssemblyResourceSchemeHandlerFactory(IChromelyRequestSchemeHandlerProvider requestSchemeHandlerProvider, IChromelyErrorHandler chromelyErrorHandler) : base(requestSchemeHandlerProvider, chromelyErrorHandler)
{
}
}
Expand Down
7 changes: 6 additions & 1 deletion src/Chromely.CefSharp/Chromely.CefSharp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@

<ItemGroup>
<PackageReference Include="CefSharp.Common" Version="86.0.241" />
<PackageReference Include="Chromely.Core" Version="5.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.5" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.5" />
<PackageReference Include="Microsoft.CSharp" Version="4.6.0" />
Expand All @@ -56,4 +55,10 @@
<None Include="chromely.png" Pack="true" PackagePath="" />
</ItemGroup>

<ItemGroup>
<Reference Include="Chromely.Core">
<HintPath>..\Chromely.Core\Chromely.Core.dll</HintPath>
</Reference>
</ItemGroup>

</Project>
2 changes: 1 addition & 1 deletion src/Chromely.CefSharp/WindowController.Services.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ protected virtual void RegisterDefaultSchemeHandlers()
}

urlTypesMapper = new Dictionary<UrlSchemeType, Type>();
urlTypesMapper.Add(UrlSchemeType.LocalRquest, typeof(IDefaultRequestCustomHandler));
urlTypesMapper.Add(UrlSchemeType.LocalRequest, typeof(IDefaultRequestCustomHandler));
urlTypesMapper.Add(UrlSchemeType.ExternalRequest, typeof(IDefaultExernalRequestCustomHandler));

foreach (var urlType in urlTypesMapper)
Expand Down
Binary file modified src/Chromely.Core/Chromely.Core.dll
Binary file not shown.
2 changes: 1 addition & 1 deletion src/Chromely.Core/Chromely.Core.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 9bc7dd7

Please sign in to comment.