1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-04-29 11:34:13 +02:00
TweetDuck/Plugins/PluginSchemeFactory.cs

48 lines
1.8 KiB
C#

using System.IO;
using System.Net;
using System.Text;
using CefSharp;
using TweetLib.Core.Browser;
using TweetLib.Core.Features.Plugins;
namespace TweetDuck.Plugins{
sealed class PluginSchemeFactory : ISchemeHandlerFactory{
public const string Name = PluginSchemeHandler<IResourceHandler>.Name;
private readonly PluginSchemeHandler<IResourceHandler> handler = new PluginSchemeHandler<IResourceHandler>(new ResourceProvider());
internal void Setup(PluginManager plugins){
handler.Setup(plugins);
}
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request){
return handler.Process(request.Url);
}
private sealed class ResourceProvider : IResourceProvider<IResourceHandler>{
private static ResourceHandler CreateHandler(byte[] bytes){
var handler = ResourceHandler.FromStream(new MemoryStream(bytes), autoDisposeStream: true);
handler.Headers.Set("Access-Control-Allow-Origin", "*");
return handler;
}
public IResourceHandler Status(HttpStatusCode code, string message){
var handler = CreateHandler(Encoding.UTF8.GetBytes(message));
handler.StatusCode = (int)code;
return handler;
}
public IResourceHandler File(byte[] bytes, string extension){
if (bytes.Length == 0){
return Status(HttpStatusCode.NoContent, "File is empty."); // FromByteArray crashes CEF internals with no contents
}
else{
var handler = CreateHandler(bytes);
handler.MimeType = Cef.GetMimeType(extension);
return handler;
}
}
}
}
}