60 lines
1.5 KiB
C#
60 lines
1.5 KiB
C#
using System.Text;
|
|
using System.Web;
|
|
using HeyRed.Mime;
|
|
using Microsoft.Win32.SafeHandles;
|
|
|
|
namespace Shoko;
|
|
|
|
[Protocol("file")]
|
|
class FileProtoHandler : ProtoHandler
|
|
{
|
|
public FileProtoHandler(Uri url)
|
|
{
|
|
URL = url;
|
|
}
|
|
long _totalBytes = -1;
|
|
public override long TotalBytes => _totalBytes;
|
|
|
|
public override async Task Load()
|
|
{
|
|
var file = HttpUtility.UrlDecode(URL.AbsolutePath);
|
|
|
|
if(URL.Host.Length > 0)
|
|
file = "//" + URL.Host + file;
|
|
|
|
MediaType = "text/plain";
|
|
Status = "OK";
|
|
|
|
if(File.Exists(file))
|
|
{
|
|
var fi = new FileInfo(file);
|
|
_totalBytes = fi.Length;
|
|
var stream = fi.OpenRead();
|
|
Content = await Download(stream);
|
|
MediaType = MimeGuesser.GuessMimeType(Content);
|
|
}
|
|
else if(Directory.Exists(file))
|
|
{
|
|
MediaType = "text/gemini";
|
|
var str = "# "+file+"\r\n";
|
|
var entries = Directory.EnumerateFileSystemEntries(file);
|
|
|
|
foreach(var entry in entries)
|
|
{
|
|
var path = Path.GetFileName(entry);
|
|
str += string.Format("=>{0}/{1} {2}\r\n", URL.ToString(), HttpUtility.UrlEncode(path), path);
|
|
}
|
|
|
|
Content = new MemoryStream(Encoding.UTF8.GetBytes(str));
|
|
}
|
|
else
|
|
{
|
|
Content = new MemoryStream(Encoding.UTF8.GetBytes("file not found"));
|
|
Status = "not found";
|
|
}
|
|
OnLoaded();
|
|
}
|
|
public override void Render()
|
|
{
|
|
}
|
|
} |