From e7e4e98d29a9140984ecb57557aab57135962ddb Mon Sep 17 00:00:00 2001 From: Ethan O'Brien Date: Fri, 29 Jul 2022 11:52:48 -0500 Subject: [PATCH] More work --- Server.cs | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++ build.bat | 4 +- dev.bat | 3 + in.cs | 234 +------------------------------------------- server.exe | Bin 212992 -> 212992 bytes 5 files changed, 285 insertions(+), 233 deletions(-) create mode 100644 Server.cs create mode 100644 dev.bat diff --git a/Server.cs b/Server.cs new file mode 100644 index 0000000..5d4be09 --- /dev/null +++ b/Server.cs @@ -0,0 +1,277 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.IO; +using System.Drawing; +using System.Windows.Forms; +using System.Text; +using System.Threading; +using System.Web.UI; + +public class Server { + private int readChunkSize = 1024*1024*8; + private int writeChunkSize = 1024; + private Socket listener; + private Thread mainThread; + private struct SET { + public int port; + public string mainPath; + public bool allowDelete; + public bool allowPut; + public SET(int port, string mainPath, bool allowPut, bool allowDelete) { + this.port = port; + this.mainPath = mainPath; + this.allowPut = allowPut; + this.allowDelete = allowDelete; + } + } + private SET Settings; + public Server() { + this.Settings = new SET(8080, "C:", false, false); + this.mainThread = new Thread(ServerMain); + this.mainThread.Start(); + } + + + public Server(string path, int port) { + this.Settings = new SET(port, path, false, false); + this.mainThread = new Thread(ServerMain); + this.mainThread.Start(); + } + public Server(string path, int port, bool allowPut, bool allowDelete) { + this.Settings = new SET(port, path, allowPut, allowDelete); + this.mainThread = new Thread(ServerMain); + this.mainThread.Start(); + } + private void ServerMain() { + IPHostEntry host = Dns.GetHostEntry("localhost"); + IPAddress ipAddress = host.AddressList[0]; + IPEndPoint localEndPoint = new IPEndPoint(ipAddress, this.Settings.port); + try { + this.listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + this.listener.Bind(localEndPoint); + this.listener.Listen(100); //connection limit + Console.WriteLine("Listening on http://localhost:{0}", this.Settings.port); + while (true) { + Socket handler = this.listener.Accept(); + Thread t = new Thread(onRequest); + t.Start(handler); + //onRequest(handler); + } + //handler.Shutdown(SocketShutdown.Both); + //handler.Close(); + } catch (Exception e) { + Console.WriteLine(e.ToString()); + } + + Console.WriteLine("\n Press any key to continue..."); + Console.ReadKey(); + } + private void onRequest(Object obj) { + Socket handler = (Socket) obj; + try { + while (true) { + bool consumed = false; + string data = ""; + while (!consumed) { + byte[] bytes = new byte[1]; + int bytesRec = handler.Receive(bytes); + data += Encoding.UTF8.GetString(bytes, 0, bytesRec); + consumed = (data.IndexOf("\r\n\r\n") != -1); + } + //Console.WriteLine("Text received : {0}", data); + string url = Uri.UnescapeDataString(data.Split(' ')[1].Split('?')[0]); + string method = data.Split(' ')[0]; + string path = this.Settings.mainPath+url; + Console.WriteLine("Request {0} {1}", method, url); + if (method.Equals("HEAD")||method.Equals("GET")) { + GetHead(handler, method, url, path, data); + } else if (method.Equals("PUT") && this.Settings.allowPut) { + put(handler, path, data); + } else if (method.Equals("DELETE") && this.Settings.allowDelete) { + del(handler, path); + } else { + byte[] msg = Encoding.UTF8.GetBytes("405 - Method not allowed"); + string extraHeader = "Allow: GET, HEAD"; + if (this.Settings.allowPut) extraHeader+=", PUT"; + if (this.Settings.allowDelete) extraHeader+=", DELETE"; + writeHeader(handler, 405, "Method Not Allowed", (long)msg.Length, "", extraHeader+"\r\n"); + handler.Send(msg); + } + //System.Windows.Forms.MessageBox.Show(url); + } + } catch (Exception e) { + error(handler); + Console.WriteLine("Error: {0}", e.ToString()); + } + handler.Shutdown(SocketShutdown.Both); + handler.Close(); + } + private void writeHeader(Socket handler, int httpCode, string code, long cl, string ct, string extra) { + string header = "HTTP/1.1 "+httpCode+" "+code+"\r\nAccept-Ranges: bytes\r\nConnection: keep-alive\r\n"; + if (ct.Length > 0) { + header += "Content-type: "+ct+"\r\n"; + } + if (extra.Length > 0) { + header += extra; + } + header += "Content-Length: "+cl+"\r\n\r\n"; + byte[] msg = Encoding.UTF8.GetBytes(header); + handler.Send(msg); + } + private string getMime(string fileName) { + string[] w = fileName.Split('.'); + string ext = w[w.Length-1]; + string delim = ","+ext+":"; + int i = mimetypes.IndexOf(delim); + if (i != -1) { + return mimetypes.Substring(i+delim.Length).Split(',')[0]; + } + return ""; + } + private void error(Socket handler) { + try { + byte[] msg = Encoding.UTF8.GetBytes("500 - Internal Server Error"); + writeHeader(handler, 500, "INTERNAL SERVER ERROR", (long)msg.Length, "", ""); + handler.Send(msg); + } catch (Exception e) { + Console.WriteLine("Error2: {0}", e.ToString()); + } + } + private void GetHead(Socket handler, string method, string url, string path, string data) { + try { + if (Directory.Exists(path)) { + string[] Files = System.IO.Directory.GetFileSystemEntries(path); + string resp = directoryListingTemplate+""; + if (!url.Equals("/")) { + resp += ""; + } + foreach (string sFile in Files) { + string[] s = sFile.Split('/', '\\'); + string fileName = s[s.Length-1]; + resp += "\n"; + } + byte[] msg = Encoding.UTF8.GetBytes(resp); + writeHeader(handler, 200, "OK", (long)msg.Length, "text/html; charset=utf-8", ""); + if (method.Equals("HEAD")) { + return; + } + handler.Send(msg); + } else if (File.Exists(path)) { + string range = ""; + string d = data.ToLower(); + string delim = "\r\nrange: "; + int i = d.IndexOf(delim); + if (i != -1) { + range = data.Substring(i+delim.Length).Split('\r')[0]; + } + var file = new FileInfo(path); + + string rheader = ""; + long fileOffset=0, fileEndOffset=file.Length, len=file.Length+1; + long cl = file.Length; + int code = 200; + if (range.Length > 0) { + string ran = range.Split('=')[1]; + string[] rparts = ran.Split('-'); + if (rparts[1].Length == 0) { + fileOffset = Int32.Parse(rparts[0]); + fileEndOffset = file.Length; + cl = len-fileOffset-1; + rheader = "Content-Range: bytes "+fileOffset+"-"+(len-2)+"/"+(len-1)+"\r\n"; + code = (fileOffset == 0) ? 200 : 206; + } else { + fileOffset = Int32.Parse(rparts[0]); + fileEndOffset = Int32.Parse(rparts[1]); + cl = fileEndOffset-fileOffset+1; + rheader = "Content-Range: bytes "+fileOffset+"-"+(fileEndOffset)+"/"+(len-1)+"\r\n"; + code = 206; + } + } + writeHeader(handler, code, "OK", cl, getMime(path), rheader); + if (method.Equals("HEAD")) { + return; + } + FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); + BinaryReader reader = new BinaryReader(stream); + reader.BaseStream.Position = fileOffset; + long readLen = 0; + while (readLen <= cl) { + int a = this.readChunkSize; + if (cl-readLen < this.readChunkSize) { + a = (int)(cl-readLen); + } + if (a==0) break; + readLen+=a; + byte[] res = reader.ReadBytes(a); + try { + handler.Send(res); + } catch (Exception e) { + //Console.WriteLine("Errorr: {0}", e.ToString()); + reader.Close(); + stream.Close(); + return; + } + } + reader.Close(); + stream.Close(); + } else { + byte[] msg = Encoding.UTF8.GetBytes("404"); + writeHeader(handler, 404, "NOT FOUND", (long)msg.Length, "", ""); + handler.Send(msg); + } + } catch (Exception e) { + error(handler); + Console.WriteLine("Error: {0}", e.ToString()); + } + } + private void put(Socket handler, string path, string data) { + try { + long cl = 0; + string d = data.ToLower(); + string delim = "\r\ncontent-length: "; + int i = d.IndexOf(delim); + if (i == -1) { + byte[] msg = Encoding.UTF8.GetBytes("400 - Bad Request"); + writeHeader(handler, 400, "Bad Request", (long)msg.Length, "", ""); + handler.Send(msg); + return; + } + cl = Int64.Parse(data.Substring(i+delim.Length).Split('\r')[0]); + if (File.Exists(path) || Directory.Exists(path)) { + byte[] msg = Encoding.UTF8.GetBytes("400 - Bad Request"); + writeHeader(handler, 400, "Bad Request", (long)msg.Length, "", ""); + handler.Send(msg); + return; + } + FileStream fs = File.Create(path); + long written = 0; + while (written < cl) { + int a = this.writeChunkSize; + if ((int)(cl-written) < this.writeChunkSize) { + a = (int)(cl-written); + } + written += (long)a; + byte[] bytes = new byte[a]; + handler.Receive(bytes); + fs.Write(bytes, 0, a); + } + fs.Close(); + writeHeader(handler, 201, "Created", 0, "", ""); + } catch (Exception e) { + error(handler); + Console.WriteLine("Error: {0}", e.ToString()); + } + } + private void del(Socket handler, string path) { + try { + File.Delete(path); + writeHeader(handler, 204, "No Content", 0, "", ""); + } catch (Exception e) { + error(handler); + Console.WriteLine("Error: {0}", e.ToString()); + } + } + private const string mimetypes = ",123:application/vnd.lotus-1-2-3,3dml:text/vnd.in3d.3dml,3ds:image/x-3ds,3g2:video/3gpp2,3gp:video/3gpp,7z:application/x-7z-compressed,aab:application/x-authorware-bin,aac:audio/x-aac,aam:application/x-authorware-map,aas:application/x-authorware-seg,abw:application/x-abiword,ac:application/pkix-attr-cert,acc:application/vnd.americandynamics.acc,ace:application/x-ace-compressed,acu:application/vnd.acucobol,acutc:application/vnd.acucorp,adp:audio/adpcm,aep:application/vnd.audiograph,afm:application/x-font-type1,afp:application/vnd.ibm.modcap,ahead:application/vnd.ahead.space,ai:application/postscript,aif:audio/x-aiff,aifc:audio/x-aiff,aiff:audio/x-aiff,air:application/vnd.adobe.air-application-installer-package+zip,ait:application/vnd.dvb.ait,ami:application/vnd.amiga.ami,apk:application/vnd.android.package-archive,appcache:text/cache-manifest,application:application/x-ms-application,apr:application/vnd.lotus-approach,arc:application/x-freearc,asc:application/pgp-signature,asf:video/x-ms-asf,asm:text/x-asm,aso:application/vnd.accpac.simply.aso,asx:video/x-ms-asf,atc:application/vnd.acucorp,atom:application/atom+xml,atomcat:application/atomcat+xml,atomsvc:application/atomsvc+xml,atx:application/vnd.antix.game-component,au:audio/basic,avi:video/x-msvideo,aw:application/applixware,azf:application/vnd.airzip.filesecure.azf,azs:application/vnd.airzip.filesecure.azs,azw:application/vnd.amazon.ebook,bat:application/x-msdownload,bcpio:application/x-bcpio,bdf:application/x-font-bdf,bdm:application/vnd.syncml.dm+wbxml,bed:application/vnd.realvnc.bed,bh2:application/vnd.fujitsu.oasysprs,bin:application/octet-stream,blb:application/x-blorb,blorb:application/x-blorb,bmi:application/vnd.bmi,bmp:image/bmp,book:application/vnd.framemaker,box:application/vnd.previewsystems.box,boz:application/x-bzip2,bpk:application/octet-stream,btif:image/prs.btif,bz:application/x-bzip,bz2:application/x-bzip2,c:text/x-c,c11amc:application/vnd.cluetrust.cartomobile-config,c11amz:application/vnd.cluetrust.cartomobile-config-pkg,c4d:application/vnd.clonk.c4group,c4f:application/vnd.clonk.c4group,c4g:application/vnd.clonk.c4group,c4p:application/vnd.clonk.c4group,c4u:application/vnd.clonk.c4group,cab:application/vnd.ms-cab-compressed,caf:audio/x-caf,cap:application/vnd.tcpdump.pcap,car:application/vnd.curl.car,cat:application/vnd.ms-pki.seccat,cb7:application/x-cbr,cba:application/x-cbr,cbr:application/x-cbr,cbt:application/x-cbr,cbz:application/x-cbr,cc:text/x-c,cct:application/x-director,ccxml:application/ccxml+xml,cdbcmsg:application/vnd.contact.cmsg,cdf:application/x-netcdf,cdkey:application/vnd.mediastation.cdkey,cdmia:application/cdmi-capability,cdmic:application/cdmi-container,cdmid:application/cdmi-domain,cdmio:application/cdmi-object,cdmiq:application/cdmi-queue,cdx:chemical/x-cdx,cdxml:application/vnd.chemdraw+xml,cdy:application/vnd.cinderella,cer:application/pkix-cert,cfs:application/x-cfs-compressed,cgm:image/cgm,chat:application/x-chat,chm:application/vnd.ms-htmlhelp,chrt:application/vnd.kde.kchart,cif:chemical/x-cif,cii:application/vnd.anser-web-certificate-issue-initiation,cil:application/vnd.ms-artgalry,cla:application/vnd.claymore,class:application/java-vm,clkk:application/vnd.crick.clicker.keyboard,clkp:application/vnd.crick.clicker.palette,clkt:application/vnd.crick.clicker.template,clkw:application/vnd.crick.clicker.wordbank,clkx:application/vnd.crick.clicker,clp:application/x-msclip,cmc:application/vnd.cosmocaller,cmdf:chemical/x-cmdf,cml:chemical/x-cml,cmp:application/vnd.yellowriver-custom-menu,cmx:image/x-cmx,cod:application/vnd.rim.cod,com:application/x-msdownload,conf:text/plain; charset=utf-8,cpio:application/x-cpio,cpp:text/x-c,cpt:application/mac-compactpro,crd:application/x-mscardfile,crl:application/pkix-crl,crt:application/x-x509-ca-cert,cryptonote:application/vnd.rig.cryptonote,csh:application/x-csh,csml:chemical/x-csml,csp:application/vnd.commonspace,css:text/css,cst:application/x-director,csv:text/csv,cu:application/cu-seeme,curl:text/vnd.curl,cww:application/prs.cww,cxt:application/x-director,cxx:text/x-c,dae:model/vnd.collada+xml,daf:application/vnd.mobius.daf,dart:application/vnd.dart,dataless:application/vnd.fdsn.seed,davmount:application/davmount+xml,dbk:application/docbook+xml,dcr:application/x-director,dcurl:text/vnd.curl.dcurl,dd2:application/vnd.oma.dd2+xml,ddd:application/vnd.fujixerox.ddd,deb:application/x-debian-package,def:text/plain; charset=utf-8,deploy:application/octet-stream,der:application/x-x509-ca-cert,dfac:application/vnd.dreamfactory,dgc:application/x-dgc-compressed,dic:text/x-c,dir:application/x-director,dis:application/vnd.mobius.dis,dist:application/octet-stream,distz:application/octet-stream,djv:image/vnd.djvu,djvu:image/vnd.djvu,dll:application/x-msdownload,dmg:application/x-apple-diskimage,dmp:application/vnd.tcpdump.pcap,dms:application/octet-stream,dna:application/vnd.dna,doc:application/msword,docm:application/vnd.ms-word.document.macroenabled.12,docx:application/vnd.openxmlformats-officedocument.wordprocessingml.document,dot:application/msword,dotm:application/vnd.ms-word.template.macroenabled.12,dotx:application/vnd.openxmlformats-officedocument.wordprocessingml.template,dp:application/vnd.osgi.dp,dpg:application/vnd.dpgraph,dra:audio/vnd.dra,dsc:text/prs.lines.tag,dssc:application/dssc+der,dtb:application/x-dtbook+xml,dtd:application/xml-dtd,dts:audio/vnd.dts,dtshd:audio/vnd.dts.hd,dump:application/octet-stream,dvb:video/vnd.dvb.file,dvi:application/x-dvi,dwf:model/vnd.dwf,dwg:image/vnd.dwg,dxf:image/vnd.dxf,dxp:application/vnd.spotfire.dxp,dxr:application/x-director,ecelp4800:audio/vnd.nuera.ecelp4800,ecelp7470:audio/vnd.nuera.ecelp7470,ecelp9600:audio/vnd.nuera.ecelp9600,ecma:application/ecmascript,edm:application/vnd.novadigm.edm,edx:application/vnd.novadigm.edx,efif:application/vnd.picsel,ei6:application/vnd.pg.osasli,elc:application/octet-stream,emf:application/x-msmetafile,eml:message/rfc822,emma:application/emma+xml,emz:application/x-msmetafile,eol:audio/vnd.digital-winds,eot:application/vnd.ms-fontobject,eps:application/postscript,epub:application/epub+zip,es3:application/vnd.eszigno3+xml,esa:application/vnd.osgi.subsystem,esf:application/vnd.epson.esf,et3:application/vnd.eszigno3+xml,etx:text/x-setext,eva:application/x-eva,evy:application/x-envoy,exe:application/x-msdownload,exi:application/exi,ext:application/vnd.novadigm.ext,ez:application/andrew-inset,ez2:application/vnd.ezpix-album,ez3:application/vnd.ezpix-package,f:text/x-fortran,f4v:video/x-f4v,f77:text/x-fortran,f90:text/x-fortran,fbs:image/vnd.fastbidsheet,fcdt:application/vnd.adobe.formscentral.fcdt,fcs:application/vnd.isac.fcs,fdf:application/vnd.fdf,fe_launch:application/vnd.denovo.fcselayout-link,fg5:application/vnd.fujitsu.oasysgp,fgd:application/x-director,fh:image/x-freehand,fh4:image/x-freehand,fh5:image/x-freehand,fh7:image/x-freehand,fhc:image/x-freehand,fig:application/x-xfig,flac:audio/x-flac,fli:video/x-fli,flo:application/vnd.micrografx.flo,flv:video/x-flv,flw:application/vnd.kde.kivio,flx:text/vnd.fmi.flexstor,fly:text/vnd.fly,fm:application/vnd.framemaker,fnc:application/vnd.frogans.fnc,for:text/x-fortran,fpx:image/vnd.fpx,frame:application/vnd.framemaker,fsc:application/vnd.fsc.weblaunch,fst:image/vnd.fst,ftc:application/vnd.fluxtime.clip,fti:application/vnd.anser-web-funds-transfer-initiation,fvt:video/vnd.fvt,fxp:application/vnd.adobe.fxp,fxpl:application/vnd.adobe.fxp,fzs:application/vnd.fuzzysheet,g2w:application/vnd.geoplan,g3:image/g3fax,g3w:application/vnd.geospace,gac:application/vnd.groove-account,gam:application/x-tads,gbr:application/rpki-ghostbusters,gca:application/x-gca-compressed,gdl:model/vnd.gdl,geo:application/vnd.dynageo,gex:application/vnd.geometry-explorer,ggb:application/vnd.geogebra.file,ggt:application/vnd.geogebra.tool,ghf:application/vnd.groove-help,gif:image/gif,gim:application/vnd.groove-identity-message,gml:application/gml+xml,gmx:application/vnd.gmx,gnumeric:application/x-gnumeric,gph:application/vnd.flographit,gpx:application/gpx+xml,gqf:application/vnd.grafeq,gqs:application/vnd.grafeq,gram:application/srgs,gramps:application/x-gramps-xml,gre:application/vnd.geometry-explorer,grv:application/vnd.groove-injector,grxml:application/srgs+xml,gsf:application/x-font-ghostscript,gtar:application/x-gtar,gtm:application/vnd.groove-tool-message,gtw:model/vnd.gtw,gv:text/vnd.graphviz,gxf:application/gxf,gxt:application/vnd.geonext,gz:application/gzip,h:text/x-c,h261:video/h261,h263:video/h263,h264:video/h264,hal:application/vnd.hal+xml,hbci:application/vnd.hbci,hdf:application/x-hdf,hh:text/x-c,hlp:application/winhlp,hpgl:application/vnd.hp-hpgl,hpid:application/vnd.hp-hpid,hps:application/vnd.hp-hps,hqx:application/mac-binhex40,htke:application/vnd.kenameaapp,htm:text/html; charset=utf-8,html:text/html; charset=utf-8,hvd:application/vnd.yamaha.hv-dic,hvp:application/vnd.yamaha.hv-voice,hvs:application/vnd.yamaha.hv-script,i2g:application/vnd.intergeo,icc:application/vnd.iccprofile,ice:x-conference/x-cooltalk,icm:application/vnd.iccprofile,ico:image/x-icon,ics:text/calendar,ief:image/ief,ifb:text/calendar,ifm:application/vnd.shana.informed.formdata,iges:model/iges,igl:application/vnd.igloader,igm:application/vnd.insors.igm,igs:model/iges,igx:application/vnd.micrografx.igx,iif:application/vnd.shana.informed.interchange,imp:application/vnd.accpac.simply.imp,ims:application/vnd.ms-ims,in:text/plain; charset=utf-8,ink:application/inkml+xml,inkml:application/inkml+xml,install:application/x-install-instructions,iota:application/vnd.astraea-software.iota,ipfix:application/ipfix,ipk:application/vnd.shana.informed.package,irm:application/vnd.ibm.rights-management,irp:application/vnd.irepository.package+xml,iso:application/x-iso9660-image,itp:application/vnd.shana.informed.formtemplate,ivp:application/vnd.immervision-ivp,ivu:application/vnd.immervision-ivu,jad:text/vnd.sun.j2me.app-descriptor,jam:application/vnd.jam,jar:application/java-archive,java:text/x-java-source,jisp:application/vnd.jisp,jlt:application/vnd.hp-jlyt,jnlp:application/x-java-jnlp-file,joda:application/vnd.joost.joda-archive,jpe:image/jpeg,jpeg:image/jpeg,jpg:image/jpeg,jpgm:video/jpm,jpgv:video/jpeg,jpm:video/jpm,js:application/javascript; charset=utf-8,json:application/json,jsonml:application/jsonml+json,kar:audio/midi,karbon:application/vnd.kde.karbon,kfo:application/vnd.kde.kformula,kia:application/vnd.kidspiration,kml:application/vnd.google-earth.kml+xml,kmz:application/vnd.google-earth.kmz,kne:application/vnd.kinar,knp:application/vnd.kinar,kon:application/vnd.kde.kontour,kpr:application/vnd.kde.kpresenter,kpt:application/vnd.kde.kpresenter,kpxx:application/vnd.ds-keypoint,ksp:application/vnd.kde.kspread,ktr:application/vnd.kahootz,ktx:image/ktx,ktz:application/vnd.kahootz,kwd:application/vnd.kde.kword,kwt:application/vnd.kde.kword,lasxml:application/vnd.las.las+xml,latex:application/x-latex,lbd:application/vnd.llamagraphics.life-balance.desktop,lbe:application/vnd.llamagraphics.life-balance.exchange+xml,les:application/vnd.hhe.lesson-player,lha:application/x-lzh-compressed,link66:application/vnd.route66.link66+xml,list:text/plain; charset=utf-8,list3820:application/vnd.ibm.modcap,listafp:application/vnd.ibm.modcap,lnk:application/x-ms-shortcut,log:text/plain; charset=utf-8,lostxml:application/lost+xml,lrf:application/octet-stream,lrm:application/vnd.ms-lrm,ltf:application/vnd.frogans.ltf,lvp:audio/vnd.lucent.voice,lwp:application/vnd.lotus-wordpro,lzh:application/x-lzh-compressed,m13:application/x-msmediaview,m14:application/x-msmediaview,m1v:video/mpeg,m21:application/mp21,m2a:audio/mpeg,m2v:video/mpeg,m3a:audio/mpeg,m3u:audio/x-mpegurl,m3u8:application/vnd.apple.mpegurl,m4u:video/vnd.mpegurl,m4v:video/x-m4v,ma:application/mathematica,mads:application/mads+xml,mag:application/vnd.ecowin.chart,maker:application/vnd.framemaker,man:text/troff,mar:application/octet-stream,mathml:application/mathml+xml,mb:application/mathematica,mbk:application/vnd.mobius.mbk,mbox:application/mbox,mc1:application/vnd.medcalcdata,mcd:application/vnd.mcd,mcurl:text/vnd.curl.mcurl,mdb:application/x-msaccess,mdi:image/vnd.ms-modi,me:text/troff,mesh:model/mesh,meta4:application/metalink4+xml,metalink:application/metalink+xml,mets:application/mets+xml,mfm:application/vnd.mfmp,mft:application/rpki-manifest,mgp:application/vnd.osgeo.mapguide.package,mgz:application/vnd.proteus.magazine,mid:audio/midi,midi:audio/midi,mie:application/x-mie,mif:application/vnd.mif,mime:message/rfc822,mj2:video/mj2,mjp2:video/mj2,mjs:application/javascript; charset=utf-8,mk3d:video/x-matroska,mka:audio/x-matroska,mks:video/x-matroska,mkv:video/x-matroska,mlp:application/vnd.dolby.mlp,mmd:application/vnd.chipnuts.karaoke-mmd,mmf:application/vnd.smaf,mmr:image/vnd.fujixerox.edmics-mmr,mng:video/x-mng,mny:application/x-msmoney,mobi:application/x-mobipocket-ebook,mods:application/mods+xml,mov:video/quicktime,movie:video/x-sgi-movie,mp2:audio/mpeg,mp21:application/mp21,mp2a:audio/mpeg,mp3:audio/mpeg,mp4:video/mp4,mp4a:audio/mp4,mp4s:application/mp4,mp4v:video/mp4,mpc:application/vnd.mophun.certificate,mpe:video/mpeg,mpeg:video/mpeg,mpg:video/mpeg,mpg4:video/mp4,mpga:audio/mpeg,mpkg:application/vnd.apple.installer+xml,mpm:application/vnd.blueice.multipass,mpn:application/vnd.mophun.application,mpp:application/vnd.ms-project,mpt:application/vnd.ms-project,mpy:application/vnd.ibm.minipay,mqy:application/vnd.mobius.mqy,mrc:application/marc,mrcx:application/marcxml+xml,ms:text/troff,mscml:application/mediaservercontrol+xml,mseed:application/vnd.fdsn.mseed,mseq:application/vnd.mseq,msf:application/vnd.epson.msf,msh:model/mesh,msi:application/x-msdownload,msl:application/vnd.mobius.msl,msty:application/vnd.muvee.style,mts:model/vnd.mts,mus:application/vnd.musician,musicxml:application/vnd.recordare.musicxml+xml,mvb:application/x-msmediaview,mwf:application/vnd.mfer,mxf:application/mxf,mxl:application/vnd.recordare.musicxml,mxml:application/xv+xml,mxs:application/vnd.triscape.mxs,mxu:video/vnd.mpegurl,n-gage:application/vnd.nokia.n-gage.symbian.install,n3:text/n3,nb:application/mathematica,nbp:application/vnd.wolfram.player,nc:application/x-netcdf,ncx:application/x-dtbncx+xml,nfo:text/x-nfo,ngdat:application/vnd.nokia.n-gage.data,nitf:application/vnd.nitf,nlu:application/vnd.neurolanguage.nlu,nml:application/vnd.enliven,nnd:application/vnd.noblenet-directory,nns:application/vnd.noblenet-sealer,nnw:application/vnd.noblenet-web,npx:image/vnd.net-fpx,nsc:application/x-conference,nsf:application/vnd.lotus-notes,ntf:application/vnd.nitf,nzb:application/x-nzb,oa2:application/vnd.fujitsu.oasys2,oa3:application/vnd.fujitsu.oasys3,oas:application/vnd.fujitsu.oasys,obd:application/x-msbinder,obj:application/x-tgif,oda:application/oda,odb:application/vnd.oasis.opendocument.database,odc:application/vnd.oasis.opendocument.chart,odf:application/vnd.oasis.opendocument.formula,odft:application/vnd.oasis.opendocument.formula-template,odg:application/vnd.oasis.opendocument.graphics,odi:application/vnd.oasis.opendocument.image,odm:application/vnd.oasis.opendocument.text-master,odp:application/vnd.oasis.opendocument.presentation,ods:application/vnd.oasis.opendocument.spreadsheet,odt:application/vnd.oasis.opendocument.text,oga:audio/ogg,ogg:audio/ogg,ogv:video/ogg,ogx:application/ogg,omdoc:application/omdoc+xml,onepkg:application/onenote,onetmp:application/onenote,onetoc:application/onenote,onetoc2:application/onenote,opf:application/oebps-package+xml,opml:text/x-opml,oprc:application/vnd.palm,org:application/vnd.lotus-organizer,osf:application/vnd.yamaha.openscoreformat,osfpvg:application/vnd.yamaha.openscoreformat.osfpvg+xml,otc:application/vnd.oasis.opendocument.chart-template,otf:application/x-font-otf,otg:application/vnd.oasis.opendocument.graphics-template,oth:application/vnd.oasis.opendocument.text-web,oti:application/vnd.oasis.opendocument.image-template,otp:application/vnd.oasis.opendocument.presentation-template,ots:application/vnd.oasis.opendocument.spreadsheet-template,ott:application/vnd.oasis.opendocument.text-template,oxps:application/oxps,oxt:application/vnd.openofficeorg.extension,p:text/x-pascal,p10:application/pkcs10,p12:application/x-pkcs12,p7b:application/x-pkcs7-certificates,p7c:application/pkcs7-mime,p7m:application/pkcs7-mime,p7r:application/x-pkcs7-certreqresp,p7s:application/pkcs7-signature,p8:application/pkcs8,pas:text/x-pascal,paw:application/vnd.pawaafile,pbd:application/vnd.powerbuilder6,pbm:image/x-portable-bitmap,pcap:application/vnd.tcpdump.pcap,pcf:application/x-font-pcf,pcl:application/vnd.hp-pcl,pclxl:application/vnd.hp-pclxl,pct:image/x-pict,pcurl:application/vnd.curl.pcurl,pcx:image/x-pcx,pdb:application/vnd.palm,pdf:application/pdf,pfa:application/x-font-type1,pfb:application/x-font-type1,pfm:application/x-font-type1,pfr:application/font-tdpfr,pfx:application/x-pkcs12,pgm:image/x-portable-graymap,pgn:application/x-chess-pgn,pgp:application/pgp-encrypted,pic:image/x-pict,pkg:application/octet-stream,pki:application/pkixcmp,pkipath:application/pkix-pkipath,plb:application/vnd.3gpp.pic-bw-large,plc:application/vnd.mobius.plc,plf:application/vnd.pocketlearn,pls:application/pls+xml,pmd:application/x-pmd,pml:application/vnd.ctc-posml,png:image/png,pnm:image/x-portable-anymap,portpkg:application/vnd.macports.portpkg,pot:application/vnd.ms-powerpoint,potm:application/vnd.ms-powerpoint.template.macroenabled.12,potx:application/vnd.openxmlformats-officedocument.presentationml.template,ppam:application/vnd.ms-powerpoint.addin.macroenabled.12,ppd:application/vnd.cups-ppd,ppm:image/x-portable-pixmap,pps:application/vnd.ms-powerpoint,ppsm:application/vnd.ms-powerpoint.slideshow.macroenabled.12,ppsx:application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppt:application/vnd.ms-powerpoint,pptm:application/vnd.ms-powerpoint.presentation.macroenabled.12,pptx:application/vnd.openxmlformats-officedocument.presentationml.presentation,pqa:application/vnd.palm,prc:application/x-mobipocket-ebook,pre:application/vnd.lotus-freelance,prf:application/pics-rules,ps:application/postscript,psb:application/vnd.3gpp.pic-bw-small,psd:image/vnd.adobe.photoshop,psf:application/x-font-linux-psf,pskcxml:application/pskc+xml,ptid:application/vnd.pvi.ptid1,pub:application/x-mspublisher,pvb:application/vnd.3gpp.pic-bw-var,pwn:application/vnd.3m.post-it-notes,pya:audio/vnd.ms-playready.media.pya,pyv:video/vnd.ms-playready.media.pyv,qam:application/vnd.epson.quickanime,qbo:application/vnd.intu.qbo,qfx:application/vnd.intu.qfx,qps:application/vnd.publishare-delta-tree,qt:video/quicktime,qwd:application/vnd.quark.quarkxpress,qwt:application/vnd.quark.quarkxpress,qxb:application/vnd.quark.quarkxpress,qxd:application/vnd.quark.quarkxpress,qxl:application/vnd.quark.quarkxpress,qxt:application/vnd.quark.quarkxpress,ra:audio/x-pn-realaudio,ram:audio/x-pn-realaudio,rar:application/x-rar-compressed,ras:image/x-cmu-raster,rcprofile:application/vnd.ipunplugged.rcprofile,rdf:application/rdf+xml,rdz:application/vnd.data-vision.rdz,rep:application/vnd.businessobjects,res:application/x-dtbresource+xml,rgb:image/x-rgb,rif:application/reginfo+xml,rip:audio/vnd.rip,ris:application/x-research-info-systems,rl:application/resource-lists+xml,rlc:image/vnd.fujixerox.edmics-rlc,rld:application/resource-lists-diff+xml,rm:application/vnd.rn-realmedia,rmi:audio/midi,rmp:audio/x-pn-realaudio-plugin,rms:application/vnd.jcp.javame.midlet-rms,rmvb:application/vnd.rn-realmedia-vbr,rnc:application/relax-ng-compact-syntax,roa:application/rpki-roa,roff:text/troff,rp9:application/vnd.cloanto.rp9,rpss:application/vnd.nokia.radio-presets,rpst:application/vnd.nokia.radio-preset,rq:application/sparql-query,rs:application/rls-services+xml,rsd:application/rsd+xml,rss:application/rss+xml; charset=utf-8,rtf:application/rtf,rtx:text/richtext,s:text/x-asm,s3m:audio/s3m,saf:application/vnd.yamaha.smaf-audio,sbml:application/sbml+xml,sc:application/vnd.ibm.secure-container,scd:application/x-msschedule,scm:application/vnd.lotus-screencam,scq:application/scvp-cv-request,scs:application/scvp-cv-response,scurl:text/vnd.curl.scurl,sda:application/vnd.stardivision.draw,sdc:application/vnd.stardivision.calc,sdd:application/vnd.stardivision.impress,sdkd:application/vnd.solent.sdkm+xml,sdkm:application/vnd.solent.sdkm+xml,sdp:application/sdp,sdw:application/vnd.stardivision.writer,see:application/vnd.seemail,seed:application/vnd.fdsn.seed,sema:application/vnd.sema,semd:application/vnd.semd,semf:application/vnd.semf,ser:application/java-serialized-object,setpay:application/set-payment-initiation,setreg:application/set-registration-initiation,sfd-hdstx:application/vnd.hydrostatix.sof-data,sfs:application/vnd.spotfire.sfs,sfv:text/x-sfv,sgi:image/sgi,sgl:application/vnd.stardivision.writer-global,sgm:text/sgml,sgml:text/sgml,sh:application/x-sh,shar:application/x-shar,shf:application/shf+xml,sid:image/x-mrsid-image,sig:application/pgp-signature,sil:audio/silk,silo:model/mesh,sis:application/vnd.symbian.install,sisx:application/vnd.symbian.install,sit:application/x-stuffit,sitx:application/x-stuffitx,skd:application/vnd.koan,skm:application/vnd.koan,skp:application/vnd.koan,skt:application/vnd.koan,sldm:application/vnd.ms-powerpoint.slide.macroenabled.12,sldx:application/vnd.openxmlformats-officedocument.presentationml.slide,slt:application/vnd.epson.salt,sm:application/vnd.stepmania.stepchart,smf:application/vnd.stardivision.math,smi:application/smil+xml,smil:application/smil+xml,smv:video/x-smv,smzip:application/vnd.stepmania.package,snd:audio/basic,snf:application/x-font-snf,so:application/octet-stream,spc:application/x-pkcs7-certificates,spf:application/vnd.yamaha.smaf-phrase,spl:application/x-futuresplash,spot:text/vnd.in3d.spot,spp:application/scvp-vp-response,spq:application/scvp-vp-request,spx:audio/ogg,sql:application/x-sql,src:application/x-wais-source,srt:application/x-subrip,sru:application/sru+xml,srx:application/sparql-results+xml,ssdl:application/ssdl+xml,sse:application/vnd.kodak-descriptor,ssf:application/vnd.epson.ssf,ssml:application/ssml+xml,st:application/vnd.sailingtracker.track,stc:application/vnd.sun.xml.calc.template,std:application/vnd.sun.xml.draw.template,stf:application/vnd.wt.stf,sti:application/vnd.sun.xml.impress.template,stk:application/hyperstudio,stl:application/vnd.ms-pki.stl,str:application/vnd.pg.format,stw:application/vnd.sun.xml.writer.template,sub:text/vnd.dvb.subtitle,sus:application/vnd.sus-calendar,susp:application/vnd.sus-calendar,sv4cpio:application/x-sv4cpio,sv4crc:application/x-sv4crc,svc:application/vnd.dvb.service,svd:application/vnd.svd,svg:image/svg+xml,svgz:image/svg+xml,swa:application/x-director,swf:application/x-shockwave-flash,swi:application/vnd.aristanetworks.swi,sxc:application/vnd.sun.xml.calc,sxd:application/vnd.sun.xml.draw,sxg:application/vnd.sun.xml.writer.global,sxi:application/vnd.sun.xml.impress,sxm:application/vnd.sun.xml.math,sxw:application/vnd.sun.xml.writer,t:text/troff,t3:application/x-t3vm-image,taglet:application/vnd.mynfc,tao:application/vnd.tao.intent-module-archive,tar:application/x-tar,tcap:application/vnd.3gpp2.tcap,tcl:application/x-tcl,teacher:application/vnd.smart.teacher,tei:application/tei+xml,teicorpus:application/tei+xml,tex:application/x-tex,texi:application/x-texinfo,texinfo:application/x-texinfo,text:text/plain; charset=utf-8,tfi:application/thraud+xml,tfm:application/x-tex-tfm,tga:image/x-tga,thmx:application/vnd.ms-officetheme,tif:image/tiff,tiff:image/tiff,tmo:application/vnd.tmobile-livetv,torrent:application/x-bittorrent,tpl:application/vnd.groove-tool-template,tpt:application/vnd.trid.tpt,tr:text/troff,tra:application/vnd.trueapp,trm:application/x-msterminal,tsd:application/timestamped-data,tsv:text/tab-separated-values,ttc:application/x-font-ttf,ttf:application/x-font-ttf,ttl:text/turtle,twd:application/vnd.simtech-mindmapper,twds:application/vnd.simtech-mindmapper,txd:application/vnd.genomatix.tuxedo,txf:application/vnd.mobius.txf,txt:text/plain; charset=utf-8,u32:application/x-authorware-bin,udeb:application/x-debian-package,ufd:application/vnd.ufdl,ufdl:application/vnd.ufdl,ulx:application/x-glulx,umj:application/vnd.umajin,unityweb:application/vnd.unity,uoml:application/vnd.uoml+xml,uri:text/uri-list,uris:text/uri-list,urls:text/uri-list,ustar:application/x-ustar,utz:application/vnd.uiq.theme,uu:text/x-uuencode,uva:audio/vnd.dece.audio,uvd:application/vnd.dece.data,uvf:application/vnd.dece.data,uvg:image/vnd.dece.graphic,uvh:video/vnd.dece.hd,uvi:image/vnd.dece.graphic,uvm:video/vnd.dece.mobile,uvp:video/vnd.dece.pd,uvs:video/vnd.dece.sd,uvt:application/vnd.dece.ttml+xml,uvu:video/vnd.uvvu.mp4,uvv:video/vnd.dece.video,uvva:audio/vnd.dece.audio,uvvd:application/vnd.dece.data,uvvf:application/vnd.dece.data,uvvg:image/vnd.dece.graphic,uvvh:video/vnd.dece.hd,uvvi:image/vnd.dece.graphic,uvvm:video/vnd.dece.mobile,uvvp:video/vnd.dece.pd,uvvs:video/vnd.dece.sd,uvvt:application/vnd.dece.ttml+xml,uvvu:video/vnd.uvvu.mp4,uvvv:video/vnd.dece.video,uvvx:application/vnd.dece.unspecified,uvvz:application/vnd.dece.zip,uvx:application/vnd.dece.unspecified,uvz:application/vnd.dece.zip,vcard:text/vcard,vcd:application/x-cdlink,vcf:text/x-vcard,vcg:application/vnd.groove-vcard,vcs:text/x-vcalendar,vcx:application/vnd.vcx,vis:application/vnd.visionary,viv:video/vnd.vivo,vmd:application/vocaltec-media-desc,vob:video/x-ms-vob,vor:application/vnd.stardivision.writer,vox:application/x-authorware-bin,vrml:model/vrml,vsd:application/vnd.visio,vsf:application/vnd.vsf,vss:application/vnd.visio,vst:application/vnd.visio,vsw:application/vnd.visio,vtu:model/vnd.vtu,vtt:text/vtt,vxml:application/voicexml+xml,w3d:application/x-director,wad:application/x-doom,wasm:application/wasm,wav:audio/x-wav,wax:audio/x-ms-wax,wbmp:image/vnd.wap.wbmp,wbs:application/vnd.criticaltools.wbs+xml,wbxml:application/vnd.wap.wbxml,wcm:application/vnd.ms-works,wdb:application/vnd.ms-works,wdp:image/vnd.ms-photo,weba:audio/webm,webm:video/webm,webp:image/webp,wg:application/vnd.pmi.widget,wgt:application/widget,wks:application/vnd.ms-works,wm:video/x-ms-wm,wma:audio/x-ms-wma,wmd:application/x-ms-wmd,wmf:application/x-msmetafile,wml:text/vnd.wap.wml; charset=utf-8,wmlc:application/vnd.wap.wmlc,wmls:text/vnd.wap.wmlscript,wmlsc:application/vnd.wap.wmlscriptc,wmv:video/x-ms-wmv,wmx:video/x-ms-wmx,wmz:application/x-msmetafile,woff:application/x-font-woff,wpd:application/vnd.wordperfect,wpl:application/vnd.ms-wpl,wps:application/vnd.ms-works,wqd:application/vnd.wqd,wri:application/x-mswrite,wrl:model/vrml,wsdl:application/wsdl+xml,wspolicy:application/wspolicy+xml,wtb:application/vnd.webturbo,wvx:video/x-ms-wvx,x32:application/x-authorware-bin,x3d:model/x3d+xml,x3db:model/x3d+binary,x3dbz:model/x3d+binary,x3dv:model/x3d+vrml,x3dvz:model/x3d+vrml,x3dz:model/x3d+xml,xaml:application/xaml+xml,xap:application/x-silverlight-app,xar:application/vnd.xara,xbap:application/x-ms-xbap,xbd:application/vnd.fujixerox.docuworks.binder,xbm:image/x-xbitmap,xdf:application/xcap-diff+xml,xdm:application/vnd.syncml.dm+xml,xdp:application/vnd.adobe.xdp+xml,xdssc:application/dssc+xml,xdw:application/vnd.fujixerox.docuworks,xenc:application/xenc+xml,xer:application/patch-ops-error+xml,xfdf:application/vnd.adobe.xfdf,xfdl:application/vnd.xfdl,xht:application/xhtml+xml,xhtml:application/xhtml+xml,xhvml:application/xv+xml,xif:image/vnd.xiff,xla:application/vnd.ms-excel,xlam:application/vnd.ms-excel.addin.macroenabled.12,xlc:application/vnd.ms-excel,xlf:application/x-xliff+xml,xlm:application/vnd.ms-excel,xls:application/vnd.ms-excel,xlsb:application/vnd.ms-excel.sheet.binary.macroenabled.12,xlsm:application/vnd.ms-excel.sheet.macroenabled.12,xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlt:application/vnd.ms-excel,xltm:application/vnd.ms-excel.template.macroenabled.12,xltx:application/vnd.openxmlformats-officedocument.spreadsheetml.template,xlw:application/vnd.ms-excel,xm:audio/xm,xml:application/xml,xo:application/vnd.olpc-sugar,xop:application/xop+xml,xpi:application/x-xpinstall,xpl:application/xproc+xml,xpm:image/x-xpixmap,xpr:application/vnd.is-xpr,xps:application/vnd.ms-xpsdocument,xpw:application/vnd.intercon.formnet,xpx:application/vnd.intercon.formnet,xsl:application/xml,xslt:application/xslt+xml,xsm:application/vnd.syncml+xml,xspf:application/xspf+xml,xul:application/vnd.mozilla.xul+xml,xvm:application/xv+xml,xvml:application/xv+xml,xwd:image/x-xwindowdump,xyz:chemical/x-xyz,xz:application/x-xz,yang:application/yang,yin:application/yin+xml,z1:application/x-zmachine,z2:application/x-zmachine,z3:application/x-zmachine,z4:application/x-zmachine,z5:application/x-zmachine,z6:application/x-zmachine,z7:application/x-zmachine,z8:application/x-zmachine,zaz:application/vnd.zzazz.deck+xml,zip:application/zip,zir:application/vnd.zul,zirz:application/vnd.zul,zmm:application/vnd.handheld-entertainment+xml"; + private const string directoryListingTemplate = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Oh, no! This server is sending data Google Chrome can't understand. Please report a bug, and include the raw listing.
\n\n

Index of LOCATION

\n\n
\n \n [parent directory]\n \n
\n\n\n \n \n \n \n \n \n \n \n \n
Name\n Size\n \n Date Modified\n
\n\n\n\n\n\n"; +} diff --git a/build.bat b/build.bat index ac15ada..541b37f 100644 --- a/build.bat +++ b/build.bat @@ -1 +1,3 @@ -c:\windows\Microsoft.NET\Framework\v3.5\csc.exe /t:exe /out:server.exe in.cs +@echo off + +c:\windows\Microsoft.NET\Framework\v3.5\csc.exe /t:exe /out:server.exe *.cs diff --git a/dev.bat b/dev.bat new file mode 100644 index 0000000..42dcb76 --- /dev/null +++ b/dev.bat @@ -0,0 +1,3 @@ +@echo off + +c:\windows\Microsoft.NET\Framework\v3.5\csc.exe /t:exe /out:server.exe *.cs && server diff --git a/in.cs b/in.cs index 31bcae6..52ee467 100644 --- a/in.cs +++ b/in.cs @@ -1,238 +1,8 @@ using System; -using System.Net; -using System.Net.Sockets; -using System.IO; -using System.Drawing; -using System.Windows.Forms; -using System.Text; -using System.Threading; -using System.Web.UI; - -public class Server { - private int port = 8080; - private int readChunkSize = 1024*1024*8; - private int writeChunkSize = 1024; - private string mainPath = "C:"; +public class WebServer { public static int Main(String[] args) { - new Server(); + Server mainServer = new Server(); return 0; } - private void writeHeader(Socket handler, int httpCode, string code, long cl, string ct, string extra) { - string header = "HTTP/1.1 "+httpCode+" "+code+"\r\nAccept-Ranges: bytes\r\nConnection: keep-alive\r\n"; - if (ct.Length > 0) { - header += "Content-type: "+ct+"\r\n"; - } - if (extra.Length > 0) { - header += extra; - } - header += "Content-Length: "+cl+"\r\n\r\n"; - byte[] msg = Encoding.UTF8.GetBytes(header); - handler.Send(msg); - } - private string getMime(string fileName) { - string[] w = fileName.Split('.'); - string ext = w[w.Length-1]; - string delim = ","+ext+":"; - int i = mimetypes.IndexOf(delim); - if (i != -1) { - return mimetypes.Substring(i+delim.Length).Split(',')[0]; - } - return ""; - } - private void error(Socket handler) { - try { - byte[] msg = Encoding.UTF8.GetBytes("500 - Internal Server Error"); - writeHeader(handler, 500, "INTERNAL SERVER ERROR", (long)msg.Length, "", ""); - handler.Send(msg); - } catch (Exception e) { - Console.WriteLine("Error2: {0}", e.ToString()); - } - } - private void GetHead(Socket handler, string method, string url, string path, string data) { - try { - if (Directory.Exists(path)) { - string[] Files = System.IO.Directory.GetFileSystemEntries(path); - string resp = directoryListingTemplate+""; - if (!url.Equals("/")) { - resp += ""; - } - foreach (string sFile in Files) { - string[] s = sFile.Split('/', '\\'); - string fileName = s[s.Length-1]; - resp += "\n"; - } - byte[] msg = Encoding.UTF8.GetBytes(resp); - writeHeader(handler, 200, "OK", (long)msg.Length, "text/html; charset=utf-8", ""); - if (method.Equals("HEAD")) { - return; - } - handler.Send(msg); - } else if (File.Exists(path)) { - string range = ""; - string d = data.ToLower(); - string delim = "\r\nrange: "; - int i = d.IndexOf(delim); - if (i != -1) { - range = data.Substring(i+delim.Length).Split('\r')[0]; - } - var file = new FileInfo(path); - - string rheader = ""; - long fileOffset=0, fileEndOffset=file.Length, len=file.Length+1; - long cl = file.Length; - int code = 200; - if (range.Length > 0) { - string ran = range.Split('=')[1]; - string[] rparts = ran.Split('-'); - if (rparts[1].Length == 0) { - fileOffset = Int32.Parse(rparts[0]); - fileEndOffset = file.Length; - cl = len-fileOffset-1; - rheader = "Content-Range: bytes "+fileOffset+"-"+(len-2)+"/"+(len-1)+"\r\n"; - code = (fileOffset == 0) ? 200 : 206; - } else { - fileOffset = Int32.Parse(rparts[0]); - fileEndOffset = Int32.Parse(rparts[1]); - cl = fileEndOffset-fileOffset+1; - rheader = "Content-Range: bytes "+fileOffset+"-"+(fileEndOffset)+"/"+(len-1)+"\r\n"; - code = 206; - } - } - writeHeader(handler, code, "OK", cl, getMime(path), rheader); - if (method.Equals("HEAD")) { - return; - } - FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); - BinaryReader reader = new BinaryReader(stream); - reader.BaseStream.Position = fileOffset; - long readLen = 0; - while (readLen <= cl) { - int a = readChunkSize; - if (cl-readLen < readChunkSize) { - a = (int)(cl-readLen); - } - if (a==0) break; - readLen+=a; - byte[] res = reader.ReadBytes(a); - try { - handler.Send(res); - } catch (Exception e) { - //Console.WriteLine("Errorr: {0}", e.ToString()); - reader.Close(); - stream.Close(); - return; - } - } - reader.Close(); - stream.Close(); - } else { - byte[] msg = Encoding.UTF8.GetBytes("404"); - writeHeader(handler, 404, "NOT FOUND", (long)msg.Length, "", ""); - handler.Send(msg); - } - } catch (Exception e) { - error(handler); - Console.WriteLine("Error: {0}", e.ToString()); - } - } - private void put(Socket handler, string url, string path, string data) { - try { - long cl = 0; - string d = data.ToLower(); - string delim = "\r\ncontent-length: "; - int i = d.IndexOf(delim); - if (i == -1) { - byte[] msg = Encoding.UTF8.GetBytes("400 - Bad Request"); - writeHeader(handler, 400, "Bad Request", (long)msg.Length, "", ""); - handler.Send(msg); - return; - } - cl = Int64.Parse(data.Substring(i+delim.Length).Split('\r')[0]); - if (File.Exists(path) || Directory.Exists(path)) { - byte[] msg = Encoding.UTF8.GetBytes("400 - Bad Request"); - writeHeader(handler, 400, "Bad Request", (long)msg.Length, "", ""); - handler.Send(msg); - return; - } - FileStream stream = File.Create(path); - long written = 0; - while (written < cl) { - int a = writeChunkSize; - if ((int)(cl-written) < writeChunkSize) { - a = (int)(cl-written); - } - written += (long)a; - byte[] bytes = new byte[a]; - handler.Receive(bytes); - stream.Write(bytes, 0, a); - } - stream.Close(); - writeHeader(handler, 201, "Created", 0, "", ""); - } catch (Exception e) { - error(handler); - Console.WriteLine("Error: {0}", e.ToString()); - } - } - private void onRequest(Object obj) { - Socket handler = (Socket) obj; - try { - while (true) { - bool consumed = false; - string data = ""; - while (!consumed) { - byte[] bytes = new byte[1]; - int bytesRec = handler.Receive(bytes); - data += Encoding.UTF8.GetString(bytes, 0, bytesRec); - consumed = (data.IndexOf("\r\n\r\n") != -1); - } - //Console.WriteLine("Text received : {0}", data); - string url = Uri.UnescapeDataString(data.Split(' ')[1].Split('?')[0]); - string method = data.Split(' ')[0]; - string path = mainPath+url; - Console.WriteLine("Request {0} {1}", method, url); - if (method.Equals("HEAD")||method.Equals("GET")) { - GetHead(handler, method, url, path, data); - } else if (method.Equals("PUT")) { - put(handler, url, path, data); - } else { - byte[] msg = Encoding.UTF8.GetBytes("405 - Method not allowed"); - writeHeader(handler, 405, "Method Not Allowed", (long)msg.Length, "", "Allow: GET, HEAD, PUT\r\n"); - handler.Send(msg); - } - //System.Windows.Forms.MessageBox.Show(url); - } - } catch (Exception e) { - error(handler); - Console.WriteLine("Error: {0}", e.ToString()); - } - handler.Shutdown(SocketShutdown.Both); - handler.Close(); - } - public Server() { - IPHostEntry host = Dns.GetHostEntry("localhost"); - IPAddress ipAddress = host.AddressList[0]; - IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); - try { - Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - listener.Bind(localEndPoint); - listener.Listen(100); //connection limit - Console.WriteLine("Listening on http://localhost:{0}", port); - while (true) { - Socket handler = listener.Accept(); - Thread t = new Thread(onRequest); - t.Start(handler); - //onRequest(handler); - } - //handler.Shutdown(SocketShutdown.Both); - //handler.Close(); - } catch (Exception e) { - Console.WriteLine(e.ToString()); - } - - Console.WriteLine("\n Press any key to continue..."); - Console.ReadKey(); - } - private const string mimetypes = ",123:application/vnd.lotus-1-2-3,3dml:text/vnd.in3d.3dml,3ds:image/x-3ds,3g2:video/3gpp2,3gp:video/3gpp,7z:application/x-7z-compressed,aab:application/x-authorware-bin,aac:audio/x-aac,aam:application/x-authorware-map,aas:application/x-authorware-seg,abw:application/x-abiword,ac:application/pkix-attr-cert,acc:application/vnd.americandynamics.acc,ace:application/x-ace-compressed,acu:application/vnd.acucobol,acutc:application/vnd.acucorp,adp:audio/adpcm,aep:application/vnd.audiograph,afm:application/x-font-type1,afp:application/vnd.ibm.modcap,ahead:application/vnd.ahead.space,ai:application/postscript,aif:audio/x-aiff,aifc:audio/x-aiff,aiff:audio/x-aiff,air:application/vnd.adobe.air-application-installer-package+zip,ait:application/vnd.dvb.ait,ami:application/vnd.amiga.ami,apk:application/vnd.android.package-archive,appcache:text/cache-manifest,application:application/x-ms-application,apr:application/vnd.lotus-approach,arc:application/x-freearc,asc:application/pgp-signature,asf:video/x-ms-asf,asm:text/x-asm,aso:application/vnd.accpac.simply.aso,asx:video/x-ms-asf,atc:application/vnd.acucorp,atom:application/atom+xml,atomcat:application/atomcat+xml,atomsvc:application/atomsvc+xml,atx:application/vnd.antix.game-component,au:audio/basic,avi:video/x-msvideo,aw:application/applixware,azf:application/vnd.airzip.filesecure.azf,azs:application/vnd.airzip.filesecure.azs,azw:application/vnd.amazon.ebook,bat:application/x-msdownload,bcpio:application/x-bcpio,bdf:application/x-font-bdf,bdm:application/vnd.syncml.dm+wbxml,bed:application/vnd.realvnc.bed,bh2:application/vnd.fujitsu.oasysprs,bin:application/octet-stream,blb:application/x-blorb,blorb:application/x-blorb,bmi:application/vnd.bmi,bmp:image/bmp,book:application/vnd.framemaker,box:application/vnd.previewsystems.box,boz:application/x-bzip2,bpk:application/octet-stream,btif:image/prs.btif,bz:application/x-bzip,bz2:application/x-bzip2,c:text/x-c,c11amc:application/vnd.cluetrust.cartomobile-config,c11amz:application/vnd.cluetrust.cartomobile-config-pkg,c4d:application/vnd.clonk.c4group,c4f:application/vnd.clonk.c4group,c4g:application/vnd.clonk.c4group,c4p:application/vnd.clonk.c4group,c4u:application/vnd.clonk.c4group,cab:application/vnd.ms-cab-compressed,caf:audio/x-caf,cap:application/vnd.tcpdump.pcap,car:application/vnd.curl.car,cat:application/vnd.ms-pki.seccat,cb7:application/x-cbr,cba:application/x-cbr,cbr:application/x-cbr,cbt:application/x-cbr,cbz:application/x-cbr,cc:text/x-c,cct:application/x-director,ccxml:application/ccxml+xml,cdbcmsg:application/vnd.contact.cmsg,cdf:application/x-netcdf,cdkey:application/vnd.mediastation.cdkey,cdmia:application/cdmi-capability,cdmic:application/cdmi-container,cdmid:application/cdmi-domain,cdmio:application/cdmi-object,cdmiq:application/cdmi-queue,cdx:chemical/x-cdx,cdxml:application/vnd.chemdraw+xml,cdy:application/vnd.cinderella,cer:application/pkix-cert,cfs:application/x-cfs-compressed,cgm:image/cgm,chat:application/x-chat,chm:application/vnd.ms-htmlhelp,chrt:application/vnd.kde.kchart,cif:chemical/x-cif,cii:application/vnd.anser-web-certificate-issue-initiation,cil:application/vnd.ms-artgalry,cla:application/vnd.claymore,class:application/java-vm,clkk:application/vnd.crick.clicker.keyboard,clkp:application/vnd.crick.clicker.palette,clkt:application/vnd.crick.clicker.template,clkw:application/vnd.crick.clicker.wordbank,clkx:application/vnd.crick.clicker,clp:application/x-msclip,cmc:application/vnd.cosmocaller,cmdf:chemical/x-cmdf,cml:chemical/x-cml,cmp:application/vnd.yellowriver-custom-menu,cmx:image/x-cmx,cod:application/vnd.rim.cod,com:application/x-msdownload,conf:text/plain; charset=utf-8,cpio:application/x-cpio,cpp:text/x-c,cpt:application/mac-compactpro,crd:application/x-mscardfile,crl:application/pkix-crl,crt:application/x-x509-ca-cert,cryptonote:application/vnd.rig.cryptonote,csh:application/x-csh,csml:chemical/x-csml,csp:application/vnd.commonspace,css:text/css,cst:application/x-director,csv:text/csv,cu:application/cu-seeme,curl:text/vnd.curl,cww:application/prs.cww,cxt:application/x-director,cxx:text/x-c,dae:model/vnd.collada+xml,daf:application/vnd.mobius.daf,dart:application/vnd.dart,dataless:application/vnd.fdsn.seed,davmount:application/davmount+xml,dbk:application/docbook+xml,dcr:application/x-director,dcurl:text/vnd.curl.dcurl,dd2:application/vnd.oma.dd2+xml,ddd:application/vnd.fujixerox.ddd,deb:application/x-debian-package,def:text/plain; charset=utf-8,deploy:application/octet-stream,der:application/x-x509-ca-cert,dfac:application/vnd.dreamfactory,dgc:application/x-dgc-compressed,dic:text/x-c,dir:application/x-director,dis:application/vnd.mobius.dis,dist:application/octet-stream,distz:application/octet-stream,djv:image/vnd.djvu,djvu:image/vnd.djvu,dll:application/x-msdownload,dmg:application/x-apple-diskimage,dmp:application/vnd.tcpdump.pcap,dms:application/octet-stream,dna:application/vnd.dna,doc:application/msword,docm:application/vnd.ms-word.document.macroenabled.12,docx:application/vnd.openxmlformats-officedocument.wordprocessingml.document,dot:application/msword,dotm:application/vnd.ms-word.template.macroenabled.12,dotx:application/vnd.openxmlformats-officedocument.wordprocessingml.template,dp:application/vnd.osgi.dp,dpg:application/vnd.dpgraph,dra:audio/vnd.dra,dsc:text/prs.lines.tag,dssc:application/dssc+der,dtb:application/x-dtbook+xml,dtd:application/xml-dtd,dts:audio/vnd.dts,dtshd:audio/vnd.dts.hd,dump:application/octet-stream,dvb:video/vnd.dvb.file,dvi:application/x-dvi,dwf:model/vnd.dwf,dwg:image/vnd.dwg,dxf:image/vnd.dxf,dxp:application/vnd.spotfire.dxp,dxr:application/x-director,ecelp4800:audio/vnd.nuera.ecelp4800,ecelp7470:audio/vnd.nuera.ecelp7470,ecelp9600:audio/vnd.nuera.ecelp9600,ecma:application/ecmascript,edm:application/vnd.novadigm.edm,edx:application/vnd.novadigm.edx,efif:application/vnd.picsel,ei6:application/vnd.pg.osasli,elc:application/octet-stream,emf:application/x-msmetafile,eml:message/rfc822,emma:application/emma+xml,emz:application/x-msmetafile,eol:audio/vnd.digital-winds,eot:application/vnd.ms-fontobject,eps:application/postscript,epub:application/epub+zip,es3:application/vnd.eszigno3+xml,esa:application/vnd.osgi.subsystem,esf:application/vnd.epson.esf,et3:application/vnd.eszigno3+xml,etx:text/x-setext,eva:application/x-eva,evy:application/x-envoy,exe:application/x-msdownload,exi:application/exi,ext:application/vnd.novadigm.ext,ez:application/andrew-inset,ez2:application/vnd.ezpix-album,ez3:application/vnd.ezpix-package,f:text/x-fortran,f4v:video/x-f4v,f77:text/x-fortran,f90:text/x-fortran,fbs:image/vnd.fastbidsheet,fcdt:application/vnd.adobe.formscentral.fcdt,fcs:application/vnd.isac.fcs,fdf:application/vnd.fdf,fe_launch:application/vnd.denovo.fcselayout-link,fg5:application/vnd.fujitsu.oasysgp,fgd:application/x-director,fh:image/x-freehand,fh4:image/x-freehand,fh5:image/x-freehand,fh7:image/x-freehand,fhc:image/x-freehand,fig:application/x-xfig,flac:audio/x-flac,fli:video/x-fli,flo:application/vnd.micrografx.flo,flv:video/x-flv,flw:application/vnd.kde.kivio,flx:text/vnd.fmi.flexstor,fly:text/vnd.fly,fm:application/vnd.framemaker,fnc:application/vnd.frogans.fnc,for:text/x-fortran,fpx:image/vnd.fpx,frame:application/vnd.framemaker,fsc:application/vnd.fsc.weblaunch,fst:image/vnd.fst,ftc:application/vnd.fluxtime.clip,fti:application/vnd.anser-web-funds-transfer-initiation,fvt:video/vnd.fvt,fxp:application/vnd.adobe.fxp,fxpl:application/vnd.adobe.fxp,fzs:application/vnd.fuzzysheet,g2w:application/vnd.geoplan,g3:image/g3fax,g3w:application/vnd.geospace,gac:application/vnd.groove-account,gam:application/x-tads,gbr:application/rpki-ghostbusters,gca:application/x-gca-compressed,gdl:model/vnd.gdl,geo:application/vnd.dynageo,gex:application/vnd.geometry-explorer,ggb:application/vnd.geogebra.file,ggt:application/vnd.geogebra.tool,ghf:application/vnd.groove-help,gif:image/gif,gim:application/vnd.groove-identity-message,gml:application/gml+xml,gmx:application/vnd.gmx,gnumeric:application/x-gnumeric,gph:application/vnd.flographit,gpx:application/gpx+xml,gqf:application/vnd.grafeq,gqs:application/vnd.grafeq,gram:application/srgs,gramps:application/x-gramps-xml,gre:application/vnd.geometry-explorer,grv:application/vnd.groove-injector,grxml:application/srgs+xml,gsf:application/x-font-ghostscript,gtar:application/x-gtar,gtm:application/vnd.groove-tool-message,gtw:model/vnd.gtw,gv:text/vnd.graphviz,gxf:application/gxf,gxt:application/vnd.geonext,gz:application/gzip,h:text/x-c,h261:video/h261,h263:video/h263,h264:video/h264,hal:application/vnd.hal+xml,hbci:application/vnd.hbci,hdf:application/x-hdf,hh:text/x-c,hlp:application/winhlp,hpgl:application/vnd.hp-hpgl,hpid:application/vnd.hp-hpid,hps:application/vnd.hp-hps,hqx:application/mac-binhex40,htke:application/vnd.kenameaapp,htm:text/html; charset=utf-8,html:text/html; charset=utf-8,hvd:application/vnd.yamaha.hv-dic,hvp:application/vnd.yamaha.hv-voice,hvs:application/vnd.yamaha.hv-script,i2g:application/vnd.intergeo,icc:application/vnd.iccprofile,ice:x-conference/x-cooltalk,icm:application/vnd.iccprofile,ico:image/x-icon,ics:text/calendar,ief:image/ief,ifb:text/calendar,ifm:application/vnd.shana.informed.formdata,iges:model/iges,igl:application/vnd.igloader,igm:application/vnd.insors.igm,igs:model/iges,igx:application/vnd.micrografx.igx,iif:application/vnd.shana.informed.interchange,imp:application/vnd.accpac.simply.imp,ims:application/vnd.ms-ims,in:text/plain; charset=utf-8,ink:application/inkml+xml,inkml:application/inkml+xml,install:application/x-install-instructions,iota:application/vnd.astraea-software.iota,ipfix:application/ipfix,ipk:application/vnd.shana.informed.package,irm:application/vnd.ibm.rights-management,irp:application/vnd.irepository.package+xml,iso:application/x-iso9660-image,itp:application/vnd.shana.informed.formtemplate,ivp:application/vnd.immervision-ivp,ivu:application/vnd.immervision-ivu,jad:text/vnd.sun.j2me.app-descriptor,jam:application/vnd.jam,jar:application/java-archive,java:text/x-java-source,jisp:application/vnd.jisp,jlt:application/vnd.hp-jlyt,jnlp:application/x-java-jnlp-file,joda:application/vnd.joost.joda-archive,jpe:image/jpeg,jpeg:image/jpeg,jpg:image/jpeg,jpgm:video/jpm,jpgv:video/jpeg,jpm:video/jpm,js:application/javascript; charset=utf-8,json:application/json,jsonml:application/jsonml+json,kar:audio/midi,karbon:application/vnd.kde.karbon,kfo:application/vnd.kde.kformula,kia:application/vnd.kidspiration,kml:application/vnd.google-earth.kml+xml,kmz:application/vnd.google-earth.kmz,kne:application/vnd.kinar,knp:application/vnd.kinar,kon:application/vnd.kde.kontour,kpr:application/vnd.kde.kpresenter,kpt:application/vnd.kde.kpresenter,kpxx:application/vnd.ds-keypoint,ksp:application/vnd.kde.kspread,ktr:application/vnd.kahootz,ktx:image/ktx,ktz:application/vnd.kahootz,kwd:application/vnd.kde.kword,kwt:application/vnd.kde.kword,lasxml:application/vnd.las.las+xml,latex:application/x-latex,lbd:application/vnd.llamagraphics.life-balance.desktop,lbe:application/vnd.llamagraphics.life-balance.exchange+xml,les:application/vnd.hhe.lesson-player,lha:application/x-lzh-compressed,link66:application/vnd.route66.link66+xml,list:text/plain; charset=utf-8,list3820:application/vnd.ibm.modcap,listafp:application/vnd.ibm.modcap,lnk:application/x-ms-shortcut,log:text/plain; charset=utf-8,lostxml:application/lost+xml,lrf:application/octet-stream,lrm:application/vnd.ms-lrm,ltf:application/vnd.frogans.ltf,lvp:audio/vnd.lucent.voice,lwp:application/vnd.lotus-wordpro,lzh:application/x-lzh-compressed,m13:application/x-msmediaview,m14:application/x-msmediaview,m1v:video/mpeg,m21:application/mp21,m2a:audio/mpeg,m2v:video/mpeg,m3a:audio/mpeg,m3u:audio/x-mpegurl,m3u8:application/vnd.apple.mpegurl,m4u:video/vnd.mpegurl,m4v:video/x-m4v,ma:application/mathematica,mads:application/mads+xml,mag:application/vnd.ecowin.chart,maker:application/vnd.framemaker,man:text/troff,mar:application/octet-stream,mathml:application/mathml+xml,mb:application/mathematica,mbk:application/vnd.mobius.mbk,mbox:application/mbox,mc1:application/vnd.medcalcdata,mcd:application/vnd.mcd,mcurl:text/vnd.curl.mcurl,mdb:application/x-msaccess,mdi:image/vnd.ms-modi,me:text/troff,mesh:model/mesh,meta4:application/metalink4+xml,metalink:application/metalink+xml,mets:application/mets+xml,mfm:application/vnd.mfmp,mft:application/rpki-manifest,mgp:application/vnd.osgeo.mapguide.package,mgz:application/vnd.proteus.magazine,mid:audio/midi,midi:audio/midi,mie:application/x-mie,mif:application/vnd.mif,mime:message/rfc822,mj2:video/mj2,mjp2:video/mj2,mjs:application/javascript; charset=utf-8,mk3d:video/x-matroska,mka:audio/x-matroska,mks:video/x-matroska,mkv:video/x-matroska,mlp:application/vnd.dolby.mlp,mmd:application/vnd.chipnuts.karaoke-mmd,mmf:application/vnd.smaf,mmr:image/vnd.fujixerox.edmics-mmr,mng:video/x-mng,mny:application/x-msmoney,mobi:application/x-mobipocket-ebook,mods:application/mods+xml,mov:video/quicktime,movie:video/x-sgi-movie,mp2:audio/mpeg,mp21:application/mp21,mp2a:audio/mpeg,mp3:audio/mpeg,mp4:video/mp4,mp4a:audio/mp4,mp4s:application/mp4,mp4v:video/mp4,mpc:application/vnd.mophun.certificate,mpe:video/mpeg,mpeg:video/mpeg,mpg:video/mpeg,mpg4:video/mp4,mpga:audio/mpeg,mpkg:application/vnd.apple.installer+xml,mpm:application/vnd.blueice.multipass,mpn:application/vnd.mophun.application,mpp:application/vnd.ms-project,mpt:application/vnd.ms-project,mpy:application/vnd.ibm.minipay,mqy:application/vnd.mobius.mqy,mrc:application/marc,mrcx:application/marcxml+xml,ms:text/troff,mscml:application/mediaservercontrol+xml,mseed:application/vnd.fdsn.mseed,mseq:application/vnd.mseq,msf:application/vnd.epson.msf,msh:model/mesh,msi:application/x-msdownload,msl:application/vnd.mobius.msl,msty:application/vnd.muvee.style,mts:model/vnd.mts,mus:application/vnd.musician,musicxml:application/vnd.recordare.musicxml+xml,mvb:application/x-msmediaview,mwf:application/vnd.mfer,mxf:application/mxf,mxl:application/vnd.recordare.musicxml,mxml:application/xv+xml,mxs:application/vnd.triscape.mxs,mxu:video/vnd.mpegurl,n-gage:application/vnd.nokia.n-gage.symbian.install,n3:text/n3,nb:application/mathematica,nbp:application/vnd.wolfram.player,nc:application/x-netcdf,ncx:application/x-dtbncx+xml,nfo:text/x-nfo,ngdat:application/vnd.nokia.n-gage.data,nitf:application/vnd.nitf,nlu:application/vnd.neurolanguage.nlu,nml:application/vnd.enliven,nnd:application/vnd.noblenet-directory,nns:application/vnd.noblenet-sealer,nnw:application/vnd.noblenet-web,npx:image/vnd.net-fpx,nsc:application/x-conference,nsf:application/vnd.lotus-notes,ntf:application/vnd.nitf,nzb:application/x-nzb,oa2:application/vnd.fujitsu.oasys2,oa3:application/vnd.fujitsu.oasys3,oas:application/vnd.fujitsu.oasys,obd:application/x-msbinder,obj:application/x-tgif,oda:application/oda,odb:application/vnd.oasis.opendocument.database,odc:application/vnd.oasis.opendocument.chart,odf:application/vnd.oasis.opendocument.formula,odft:application/vnd.oasis.opendocument.formula-template,odg:application/vnd.oasis.opendocument.graphics,odi:application/vnd.oasis.opendocument.image,odm:application/vnd.oasis.opendocument.text-master,odp:application/vnd.oasis.opendocument.presentation,ods:application/vnd.oasis.opendocument.spreadsheet,odt:application/vnd.oasis.opendocument.text,oga:audio/ogg,ogg:audio/ogg,ogv:video/ogg,ogx:application/ogg,omdoc:application/omdoc+xml,onepkg:application/onenote,onetmp:application/onenote,onetoc:application/onenote,onetoc2:application/onenote,opf:application/oebps-package+xml,opml:text/x-opml,oprc:application/vnd.palm,org:application/vnd.lotus-organizer,osf:application/vnd.yamaha.openscoreformat,osfpvg:application/vnd.yamaha.openscoreformat.osfpvg+xml,otc:application/vnd.oasis.opendocument.chart-template,otf:application/x-font-otf,otg:application/vnd.oasis.opendocument.graphics-template,oth:application/vnd.oasis.opendocument.text-web,oti:application/vnd.oasis.opendocument.image-template,otp:application/vnd.oasis.opendocument.presentation-template,ots:application/vnd.oasis.opendocument.spreadsheet-template,ott:application/vnd.oasis.opendocument.text-template,oxps:application/oxps,oxt:application/vnd.openofficeorg.extension,p:text/x-pascal,p10:application/pkcs10,p12:application/x-pkcs12,p7b:application/x-pkcs7-certificates,p7c:application/pkcs7-mime,p7m:application/pkcs7-mime,p7r:application/x-pkcs7-certreqresp,p7s:application/pkcs7-signature,p8:application/pkcs8,pas:text/x-pascal,paw:application/vnd.pawaafile,pbd:application/vnd.powerbuilder6,pbm:image/x-portable-bitmap,pcap:application/vnd.tcpdump.pcap,pcf:application/x-font-pcf,pcl:application/vnd.hp-pcl,pclxl:application/vnd.hp-pclxl,pct:image/x-pict,pcurl:application/vnd.curl.pcurl,pcx:image/x-pcx,pdb:application/vnd.palm,pdf:application/pdf,pfa:application/x-font-type1,pfb:application/x-font-type1,pfm:application/x-font-type1,pfr:application/font-tdpfr,pfx:application/x-pkcs12,pgm:image/x-portable-graymap,pgn:application/x-chess-pgn,pgp:application/pgp-encrypted,pic:image/x-pict,pkg:application/octet-stream,pki:application/pkixcmp,pkipath:application/pkix-pkipath,plb:application/vnd.3gpp.pic-bw-large,plc:application/vnd.mobius.plc,plf:application/vnd.pocketlearn,pls:application/pls+xml,pmd:application/x-pmd,pml:application/vnd.ctc-posml,png:image/png,pnm:image/x-portable-anymap,portpkg:application/vnd.macports.portpkg,pot:application/vnd.ms-powerpoint,potm:application/vnd.ms-powerpoint.template.macroenabled.12,potx:application/vnd.openxmlformats-officedocument.presentationml.template,ppam:application/vnd.ms-powerpoint.addin.macroenabled.12,ppd:application/vnd.cups-ppd,ppm:image/x-portable-pixmap,pps:application/vnd.ms-powerpoint,ppsm:application/vnd.ms-powerpoint.slideshow.macroenabled.12,ppsx:application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppt:application/vnd.ms-powerpoint,pptm:application/vnd.ms-powerpoint.presentation.macroenabled.12,pptx:application/vnd.openxmlformats-officedocument.presentationml.presentation,pqa:application/vnd.palm,prc:application/x-mobipocket-ebook,pre:application/vnd.lotus-freelance,prf:application/pics-rules,ps:application/postscript,psb:application/vnd.3gpp.pic-bw-small,psd:image/vnd.adobe.photoshop,psf:application/x-font-linux-psf,pskcxml:application/pskc+xml,ptid:application/vnd.pvi.ptid1,pub:application/x-mspublisher,pvb:application/vnd.3gpp.pic-bw-var,pwn:application/vnd.3m.post-it-notes,pya:audio/vnd.ms-playready.media.pya,pyv:video/vnd.ms-playready.media.pyv,qam:application/vnd.epson.quickanime,qbo:application/vnd.intu.qbo,qfx:application/vnd.intu.qfx,qps:application/vnd.publishare-delta-tree,qt:video/quicktime,qwd:application/vnd.quark.quarkxpress,qwt:application/vnd.quark.quarkxpress,qxb:application/vnd.quark.quarkxpress,qxd:application/vnd.quark.quarkxpress,qxl:application/vnd.quark.quarkxpress,qxt:application/vnd.quark.quarkxpress,ra:audio/x-pn-realaudio,ram:audio/x-pn-realaudio,rar:application/x-rar-compressed,ras:image/x-cmu-raster,rcprofile:application/vnd.ipunplugged.rcprofile,rdf:application/rdf+xml,rdz:application/vnd.data-vision.rdz,rep:application/vnd.businessobjects,res:application/x-dtbresource+xml,rgb:image/x-rgb,rif:application/reginfo+xml,rip:audio/vnd.rip,ris:application/x-research-info-systems,rl:application/resource-lists+xml,rlc:image/vnd.fujixerox.edmics-rlc,rld:application/resource-lists-diff+xml,rm:application/vnd.rn-realmedia,rmi:audio/midi,rmp:audio/x-pn-realaudio-plugin,rms:application/vnd.jcp.javame.midlet-rms,rmvb:application/vnd.rn-realmedia-vbr,rnc:application/relax-ng-compact-syntax,roa:application/rpki-roa,roff:text/troff,rp9:application/vnd.cloanto.rp9,rpss:application/vnd.nokia.radio-presets,rpst:application/vnd.nokia.radio-preset,rq:application/sparql-query,rs:application/rls-services+xml,rsd:application/rsd+xml,rss:application/rss+xml; charset=utf-8,rtf:application/rtf,rtx:text/richtext,s:text/x-asm,s3m:audio/s3m,saf:application/vnd.yamaha.smaf-audio,sbml:application/sbml+xml,sc:application/vnd.ibm.secure-container,scd:application/x-msschedule,scm:application/vnd.lotus-screencam,scq:application/scvp-cv-request,scs:application/scvp-cv-response,scurl:text/vnd.curl.scurl,sda:application/vnd.stardivision.draw,sdc:application/vnd.stardivision.calc,sdd:application/vnd.stardivision.impress,sdkd:application/vnd.solent.sdkm+xml,sdkm:application/vnd.solent.sdkm+xml,sdp:application/sdp,sdw:application/vnd.stardivision.writer,see:application/vnd.seemail,seed:application/vnd.fdsn.seed,sema:application/vnd.sema,semd:application/vnd.semd,semf:application/vnd.semf,ser:application/java-serialized-object,setpay:application/set-payment-initiation,setreg:application/set-registration-initiation,sfd-hdstx:application/vnd.hydrostatix.sof-data,sfs:application/vnd.spotfire.sfs,sfv:text/x-sfv,sgi:image/sgi,sgl:application/vnd.stardivision.writer-global,sgm:text/sgml,sgml:text/sgml,sh:application/x-sh,shar:application/x-shar,shf:application/shf+xml,sid:image/x-mrsid-image,sig:application/pgp-signature,sil:audio/silk,silo:model/mesh,sis:application/vnd.symbian.install,sisx:application/vnd.symbian.install,sit:application/x-stuffit,sitx:application/x-stuffitx,skd:application/vnd.koan,skm:application/vnd.koan,skp:application/vnd.koan,skt:application/vnd.koan,sldm:application/vnd.ms-powerpoint.slide.macroenabled.12,sldx:application/vnd.openxmlformats-officedocument.presentationml.slide,slt:application/vnd.epson.salt,sm:application/vnd.stepmania.stepchart,smf:application/vnd.stardivision.math,smi:application/smil+xml,smil:application/smil+xml,smv:video/x-smv,smzip:application/vnd.stepmania.package,snd:audio/basic,snf:application/x-font-snf,so:application/octet-stream,spc:application/x-pkcs7-certificates,spf:application/vnd.yamaha.smaf-phrase,spl:application/x-futuresplash,spot:text/vnd.in3d.spot,spp:application/scvp-vp-response,spq:application/scvp-vp-request,spx:audio/ogg,sql:application/x-sql,src:application/x-wais-source,srt:application/x-subrip,sru:application/sru+xml,srx:application/sparql-results+xml,ssdl:application/ssdl+xml,sse:application/vnd.kodak-descriptor,ssf:application/vnd.epson.ssf,ssml:application/ssml+xml,st:application/vnd.sailingtracker.track,stc:application/vnd.sun.xml.calc.template,std:application/vnd.sun.xml.draw.template,stf:application/vnd.wt.stf,sti:application/vnd.sun.xml.impress.template,stk:application/hyperstudio,stl:application/vnd.ms-pki.stl,str:application/vnd.pg.format,stw:application/vnd.sun.xml.writer.template,sub:text/vnd.dvb.subtitle,sus:application/vnd.sus-calendar,susp:application/vnd.sus-calendar,sv4cpio:application/x-sv4cpio,sv4crc:application/x-sv4crc,svc:application/vnd.dvb.service,svd:application/vnd.svd,svg:image/svg+xml,svgz:image/svg+xml,swa:application/x-director,swf:application/x-shockwave-flash,swi:application/vnd.aristanetworks.swi,sxc:application/vnd.sun.xml.calc,sxd:application/vnd.sun.xml.draw,sxg:application/vnd.sun.xml.writer.global,sxi:application/vnd.sun.xml.impress,sxm:application/vnd.sun.xml.math,sxw:application/vnd.sun.xml.writer,t:text/troff,t3:application/x-t3vm-image,taglet:application/vnd.mynfc,tao:application/vnd.tao.intent-module-archive,tar:application/x-tar,tcap:application/vnd.3gpp2.tcap,tcl:application/x-tcl,teacher:application/vnd.smart.teacher,tei:application/tei+xml,teicorpus:application/tei+xml,tex:application/x-tex,texi:application/x-texinfo,texinfo:application/x-texinfo,text:text/plain; charset=utf-8,tfi:application/thraud+xml,tfm:application/x-tex-tfm,tga:image/x-tga,thmx:application/vnd.ms-officetheme,tif:image/tiff,tiff:image/tiff,tmo:application/vnd.tmobile-livetv,torrent:application/x-bittorrent,tpl:application/vnd.groove-tool-template,tpt:application/vnd.trid.tpt,tr:text/troff,tra:application/vnd.trueapp,trm:application/x-msterminal,tsd:application/timestamped-data,tsv:text/tab-separated-values,ttc:application/x-font-ttf,ttf:application/x-font-ttf,ttl:text/turtle,twd:application/vnd.simtech-mindmapper,twds:application/vnd.simtech-mindmapper,txd:application/vnd.genomatix.tuxedo,txf:application/vnd.mobius.txf,txt:text/plain; charset=utf-8,u32:application/x-authorware-bin,udeb:application/x-debian-package,ufd:application/vnd.ufdl,ufdl:application/vnd.ufdl,ulx:application/x-glulx,umj:application/vnd.umajin,unityweb:application/vnd.unity,uoml:application/vnd.uoml+xml,uri:text/uri-list,uris:text/uri-list,urls:text/uri-list,ustar:application/x-ustar,utz:application/vnd.uiq.theme,uu:text/x-uuencode,uva:audio/vnd.dece.audio,uvd:application/vnd.dece.data,uvf:application/vnd.dece.data,uvg:image/vnd.dece.graphic,uvh:video/vnd.dece.hd,uvi:image/vnd.dece.graphic,uvm:video/vnd.dece.mobile,uvp:video/vnd.dece.pd,uvs:video/vnd.dece.sd,uvt:application/vnd.dece.ttml+xml,uvu:video/vnd.uvvu.mp4,uvv:video/vnd.dece.video,uvva:audio/vnd.dece.audio,uvvd:application/vnd.dece.data,uvvf:application/vnd.dece.data,uvvg:image/vnd.dece.graphic,uvvh:video/vnd.dece.hd,uvvi:image/vnd.dece.graphic,uvvm:video/vnd.dece.mobile,uvvp:video/vnd.dece.pd,uvvs:video/vnd.dece.sd,uvvt:application/vnd.dece.ttml+xml,uvvu:video/vnd.uvvu.mp4,uvvv:video/vnd.dece.video,uvvx:application/vnd.dece.unspecified,uvvz:application/vnd.dece.zip,uvx:application/vnd.dece.unspecified,uvz:application/vnd.dece.zip,vcard:text/vcard,vcd:application/x-cdlink,vcf:text/x-vcard,vcg:application/vnd.groove-vcard,vcs:text/x-vcalendar,vcx:application/vnd.vcx,vis:application/vnd.visionary,viv:video/vnd.vivo,vmd:application/vocaltec-media-desc,vob:video/x-ms-vob,vor:application/vnd.stardivision.writer,vox:application/x-authorware-bin,vrml:model/vrml,vsd:application/vnd.visio,vsf:application/vnd.vsf,vss:application/vnd.visio,vst:application/vnd.visio,vsw:application/vnd.visio,vtu:model/vnd.vtu,vtt:text/vtt,vxml:application/voicexml+xml,w3d:application/x-director,wad:application/x-doom,wasm:application/wasm,wav:audio/x-wav,wax:audio/x-ms-wax,wbmp:image/vnd.wap.wbmp,wbs:application/vnd.criticaltools.wbs+xml,wbxml:application/vnd.wap.wbxml,wcm:application/vnd.ms-works,wdb:application/vnd.ms-works,wdp:image/vnd.ms-photo,weba:audio/webm,webm:video/webm,webp:image/webp,wg:application/vnd.pmi.widget,wgt:application/widget,wks:application/vnd.ms-works,wm:video/x-ms-wm,wma:audio/x-ms-wma,wmd:application/x-ms-wmd,wmf:application/x-msmetafile,wml:text/vnd.wap.wml; charset=utf-8,wmlc:application/vnd.wap.wmlc,wmls:text/vnd.wap.wmlscript,wmlsc:application/vnd.wap.wmlscriptc,wmv:video/x-ms-wmv,wmx:video/x-ms-wmx,wmz:application/x-msmetafile,woff:application/x-font-woff,wpd:application/vnd.wordperfect,wpl:application/vnd.ms-wpl,wps:application/vnd.ms-works,wqd:application/vnd.wqd,wri:application/x-mswrite,wrl:model/vrml,wsdl:application/wsdl+xml,wspolicy:application/wspolicy+xml,wtb:application/vnd.webturbo,wvx:video/x-ms-wvx,x32:application/x-authorware-bin,x3d:model/x3d+xml,x3db:model/x3d+binary,x3dbz:model/x3d+binary,x3dv:model/x3d+vrml,x3dvz:model/x3d+vrml,x3dz:model/x3d+xml,xaml:application/xaml+xml,xap:application/x-silverlight-app,xar:application/vnd.xara,xbap:application/x-ms-xbap,xbd:application/vnd.fujixerox.docuworks.binder,xbm:image/x-xbitmap,xdf:application/xcap-diff+xml,xdm:application/vnd.syncml.dm+xml,xdp:application/vnd.adobe.xdp+xml,xdssc:application/dssc+xml,xdw:application/vnd.fujixerox.docuworks,xenc:application/xenc+xml,xer:application/patch-ops-error+xml,xfdf:application/vnd.adobe.xfdf,xfdl:application/vnd.xfdl,xht:application/xhtml+xml,xhtml:application/xhtml+xml,xhvml:application/xv+xml,xif:image/vnd.xiff,xla:application/vnd.ms-excel,xlam:application/vnd.ms-excel.addin.macroenabled.12,xlc:application/vnd.ms-excel,xlf:application/x-xliff+xml,xlm:application/vnd.ms-excel,xls:application/vnd.ms-excel,xlsb:application/vnd.ms-excel.sheet.binary.macroenabled.12,xlsm:application/vnd.ms-excel.sheet.macroenabled.12,xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlt:application/vnd.ms-excel,xltm:application/vnd.ms-excel.template.macroenabled.12,xltx:application/vnd.openxmlformats-officedocument.spreadsheetml.template,xlw:application/vnd.ms-excel,xm:audio/xm,xml:application/xml,xo:application/vnd.olpc-sugar,xop:application/xop+xml,xpi:application/x-xpinstall,xpl:application/xproc+xml,xpm:image/x-xpixmap,xpr:application/vnd.is-xpr,xps:application/vnd.ms-xpsdocument,xpw:application/vnd.intercon.formnet,xpx:application/vnd.intercon.formnet,xsl:application/xml,xslt:application/xslt+xml,xsm:application/vnd.syncml+xml,xspf:application/xspf+xml,xul:application/vnd.mozilla.xul+xml,xvm:application/xv+xml,xvml:application/xv+xml,xwd:image/x-xwindowdump,xyz:chemical/x-xyz,xz:application/x-xz,yang:application/yang,yin:application/yin+xml,z1:application/x-zmachine,z2:application/x-zmachine,z3:application/x-zmachine,z4:application/x-zmachine,z5:application/x-zmachine,z6:application/x-zmachine,z7:application/x-zmachine,z8:application/x-zmachine,zaz:application/vnd.zzazz.deck+xml,zip:application/zip,zir:application/vnd.zul,zirz:application/vnd.zul,zmm:application/vnd.handheld-entertainment+xml"; - private const string directoryListingTemplate = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Oh, no! This server is sending data Google Chrome can't understand. Please report a bug, and include the raw listing.
\n\n

Index of LOCATION

\n\n
\n \n [parent directory]\n \n
\n\n\n \n \n \n \n \n \n \n \n \n
Name\n Size\n \n Date Modified\n
\n\n\n\n\n\n"; } diff --git a/server.exe b/server.exe index c799939a1163f071bc0681b3fcefc4d57283bed8..3bb6d83541768884ca920b2e2caee7a4a0c24b64 100644 GIT binary patch delta 7835 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 ad}m}^tB&muet9CAzQ=BrKN_>GHS`}G{eUX~