using System.Net.Sockets; using System.Text; using System.Web; namespace Shoko; [Protocol("gopher")] class GopherProtoHandler : ProtoHandler { public GopherProtoHandler(Uri url) { URL = url; } public override async Task Load() { var type = "0"; var file = URL.PathAndQuery; var paths = file.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(); if(paths.Count > 0) { if(paths[0].Length == 1) { type = paths[0]; paths.RemoveAt(0); } else { type = paths[0][0].ToString(); paths[0] = paths[0][1..]; } } else type = "1"; switch(type) { case "0": MediaType = "text/plain"; break; case "1": // menu case "3": case "7": MediaType = "text/gopher-menu"; break; case "g": MediaType = "image/gif"; break; case "p": MediaType = "image/png"; break; case "I": case ":": MediaType = "image/*"; break; case "h": MediaType = "text/html"; break; default: MediaType = "application/octet-stream"; // TODO: mimeguesser? break; } var uri = Encoding.UTF8.GetBytes(HttpUtility.UrlDecode(string.Join("/", paths))+"\r\n"); var tcp = new TcpClient(URL.Host, URL.Port < 0 ? 70 : URL.Port); var stream = tcp.GetStream(); stream.Write(uri); Content = await Download(stream); OnLoaded(); } public override void Render() { } }