shoko/Protocols/GeminiProtoHandler.cs

75 lines
1.9 KiB
C#

using System.Text;
using ImGuiNET;
namespace Shoko;
[Protocol("gemini")]
class GeminiProtoHandler : ProtoHandler
{
string txtQuery = "";
public GeminiProtoHandler(Uri url)
{
URL = url;
}
public override async Task Load()
{
var gemini = new Gemini(URL);
gemini.Connect();
var header = gemini.ReadHeader();
var meta = header.Split(" ", 2, StringSplitOptions.TrimEntries);
Status = meta[0];
MediaType = "text/plain";
if(Status.StartsWith('2'))
{
if(meta.Length > 1)
{
var dict = new Dictionary<string, string>();
var type = meta[1].Split(";", StringSplitOptions.TrimEntries).ToList();
MediaType = type[0];
foreach (var item in type)
{
var val = item.Split("=", 2);
dict[val[0]] = val.Length > 1 ? val[1] : "";
}
MediaTypeParams = dict;
}
Content = await Download(gemini.sslStream);
}
else
{
byte[] content = new byte[]{};
if(meta.Length > 1)
{
if(Status.StartsWith('3'))
{
meta[1] = "=> "+meta[1];
MediaType = "text/gemini";
}
content = Encoding.UTF8.GetBytes(meta[1]);
}
Content = new MemoryStream(content);
}
OnLoaded();
}
public override void Render()
{
if(Status.StartsWith('1'))
{
ImGui.InputText("##query", ref txtQuery, 1024);
Gui.Button("Submit", ()=>{
var uri = new UriBuilder(URL)
{
Query = txtQuery
};
CurrentTab.Load(uri.Uri.ToString());
});
}
}
}