Created
December 13, 2019 09:01
-
-
Save ifree/20e022b6939c122c435afee47bdd3b86 to your computer and use it in GitHub Desktop.
Clipboard server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Net.Sockets; | |
using System.Net; | |
using System.IO; | |
using System.Threading; | |
using System.Diagnostics; | |
namespace ClipServer | |
{ | |
// https://gist.github.com/zezba9000/04054e3128e6af413e5bc8002489b2fe | |
public class HTTPProxyServer | |
{ | |
private Thread _serverThread; | |
private HttpListener _listener; | |
private int _port; | |
private Func<string/*path*/, Response> _requestHandler; | |
public class Response | |
{ | |
public string content_tyep; | |
public byte[] bytes; | |
public Response(string c, byte[] b) | |
{ | |
content_tyep = c; | |
bytes = b; | |
} | |
} | |
public int Port | |
{ | |
get { return _port; } | |
private set { } | |
} | |
/// <summary> | |
/// Construct server with given port. | |
/// </summary> | |
/// <param name="reqHandler">Request handler.</param> | |
/// <param name="port">Port of the server.</param> | |
public HTTPProxyServer(Func<string/*path*/, Response> reqHandler, int port) | |
{ | |
this.Initialize(reqHandler, port); | |
} | |
/// <summary> | |
/// Construct server with suitable port. | |
/// </summary> | |
/// <param name="reqHandler">Request handler.</param> | |
public HTTPProxyServer(Func<string/*path*/, Response> reqHandler) | |
{ | |
//get an empty port | |
TcpListener l = new TcpListener(IPAddress.Loopback, 0); | |
l.Start(); | |
int port = ((IPEndPoint)l.LocalEndpoint).Port; | |
l.Stop(); | |
this.Initialize(reqHandler, port); | |
} | |
/// <summary> | |
/// Stop server and dispose all functions. | |
/// </summary> | |
public void Stop() | |
{ | |
_serverThread.Abort(); | |
_listener.Stop(); | |
} | |
private void Listen() | |
{ | |
_listener = new HttpListener(); | |
_listener.Prefixes.Add("http://*:" + _port.ToString() + "/"); | |
_listener.Start(); | |
while (true) | |
{ | |
try | |
{ | |
HttpListenerContext context = _listener.GetContext(); | |
Process(context); | |
} | |
catch (Exception ex) | |
{ | |
} | |
} | |
} | |
private void Process(HttpListenerContext context) | |
{ | |
string filename = context.Request.Url.AbsolutePath; | |
//Console.WriteLine(filename); | |
filename = filename.Substring(1); | |
{ | |
try | |
{ | |
Response resp = _requestHandler(filename); | |
if (resp == null || resp.bytes == null || resp.content_tyep == null) | |
throw new Exception(); | |
//Adding permanent http response headers | |
context.Response.ContentType = string.IsNullOrWhiteSpace(resp.content_tyep) ? "application/octet-stream" : resp.content_tyep; | |
context.Response.ContentLength64 = resp.bytes.Length; | |
context.Response.AddHeader("Date", DateTime.Now.ToString("r")); | |
context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); | |
byte[] buffer = new byte[1024 * 16]; | |
int nbytes; | |
const int buffer_len = 1024 * 16; | |
int offset = 0; | |
while (offset < resp.bytes.Length) | |
{ | |
int remain = resp.bytes.Length - offset; | |
int read_amount = Math.Min(buffer_len, remain); | |
context.Response.OutputStream.Write(resp.bytes, offset, read_amount); | |
offset += read_amount; | |
} | |
context.Response.StatusCode = (int)HttpStatusCode.OK; | |
context.Response.OutputStream.Flush(); | |
} | |
catch (Exception ex) | |
{ | |
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; | |
} | |
} | |
context.Response.OutputStream.Close(); | |
} | |
private void Initialize(Func<string/*path*/, Response> reqHandler, int port) | |
{ | |
this._requestHandler = reqHandler; | |
this._port = port; | |
_serverThread = new Thread(this.Listen); | |
_serverThread.IsBackground = true; | |
_serverThread.Start(); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Runtime.Serialization.Formatters.Binary; | |
using System.Text; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using System.Windows.Forms; | |
using System.Runtime.InteropServices; | |
using System.Text.RegularExpressions; | |
namespace ClipServer | |
{ | |
class Program | |
{ | |
[DllImport("kernel32.dll")] | |
static extern IntPtr GetConsoleWindow(); | |
[DllImport("user32.dll")] | |
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); | |
const int SW_HIDE = 0; | |
const int SW_SHOW = 5; | |
// https://stackoverflow.com/a/3393525/309846 | |
private static IDictionary<string, string> _mappings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) { | |
#region Big freaking list of mime types | |
// combination of values from Windows 7 Registry and | |
// from C:\Windows\System32\inetsrv\config\applicationHost.config | |
// some added, including .7z and .dat | |
{".323", "text/h323"}, | |
{".3g2", "video/3gpp2"}, | |
{".3gp", "video/3gpp"}, | |
{".3gp2", "video/3gpp2"}, | |
{".3gpp", "video/3gpp"}, | |
{".7z", "application/x-7z-compressed"}, | |
{".aa", "audio/audible"}, | |
{".AAC", "audio/aac"}, | |
{".aaf", "application/octet-stream"}, | |
{".aax", "audio/vnd.audible.aax"}, | |
{".ac3", "audio/ac3"}, | |
{".aca", "application/octet-stream"}, | |
{".accda", "application/msaccess.addin"}, | |
{".accdb", "application/msaccess"}, | |
{".accdc", "application/msaccess.cab"}, | |
{".accde", "application/msaccess"}, | |
{".accdr", "application/msaccess.runtime"}, | |
{".accdt", "application/msaccess"}, | |
{".accdw", "application/msaccess.webapplication"}, | |
{".accft", "application/msaccess.ftemplate"}, | |
{".acx", "application/internet-property-stream"}, | |
{".AddIn", "text/xml"}, | |
{".ade", "application/msaccess"}, | |
{".adobebridge", "application/x-bridge-url"}, | |
{".adp", "application/msaccess"}, | |
{".ADT", "audio/vnd.dlna.adts"}, | |
{".ADTS", "audio/aac"}, | |
{".afm", "application/octet-stream"}, | |
{".ai", "application/postscript"}, | |
{".aif", "audio/x-aiff"}, | |
{".aifc", "audio/aiff"}, | |
{".aiff", "audio/aiff"}, | |
{".air", "application/vnd.adobe.air-application-installer-package+zip"}, | |
{".amc", "application/x-mpeg"}, | |
{".application", "application/x-ms-application"}, | |
{".art", "image/x-jg"}, | |
{".asa", "application/xml"}, | |
{".asax", "application/xml"}, | |
{".ascx", "application/xml"}, | |
{".asd", "application/octet-stream"}, | |
{".asf", "video/x-ms-asf"}, | |
{".ashx", "application/xml"}, | |
{".asi", "application/octet-stream"}, | |
{".asm", "text/plain"}, | |
{".asmx", "application/xml"}, | |
{".aspx", "application/xml"}, | |
{".asr", "video/x-ms-asf"}, | |
{".asx", "video/x-ms-asf"}, | |
{".atom", "application/atom+xml"}, | |
{".au", "audio/basic"}, | |
{".avi", "video/x-msvideo"}, | |
{".axs", "application/olescript"}, | |
{".bas", "text/plain"}, | |
{".bcpio", "application/x-bcpio"}, | |
{".bin", "application/octet-stream"}, | |
{".bmp", "image/bmp"}, | |
{".c", "text/plain"}, | |
{".cab", "application/octet-stream"}, | |
{".caf", "audio/x-caf"}, | |
{".calx", "application/vnd.ms-office.calx"}, | |
{".cat", "application/vnd.ms-pki.seccat"}, | |
{".cc", "text/plain"}, | |
{".cd", "text/plain"}, | |
{".cdda", "audio/aiff"}, | |
{".cdf", "application/x-cdf"}, | |
{".cer", "application/x-x509-ca-cert"}, | |
{".chm", "application/octet-stream"}, | |
{".class", "application/x-java-applet"}, | |
{".clp", "application/x-msclip"}, | |
{".cmx", "image/x-cmx"}, | |
{".cnf", "text/plain"}, | |
{".cod", "image/cis-cod"}, | |
{".config", "application/xml"}, | |
{".contact", "text/x-ms-contact"}, | |
{".coverage", "application/xml"}, | |
{".cpio", "application/x-cpio"}, | |
{".cpp", "text/plain"}, | |
{".crd", "application/x-mscardfile"}, | |
{".crl", "application/pkix-crl"}, | |
{".crt", "application/x-x509-ca-cert"}, | |
{".cs", "text/plain"}, | |
{".csdproj", "text/plain"}, | |
{".csh", "application/x-csh"}, | |
{".csproj", "text/plain"}, | |
{".css", "text/css"}, | |
{".csv", "text/csv"}, | |
{".cur", "application/octet-stream"}, | |
{".cxx", "text/plain"}, | |
{".dat", "application/octet-stream"}, | |
{".datasource", "application/xml"}, | |
{".dbproj", "text/plain"}, | |
{".dcr", "application/x-director"}, | |
{".def", "text/plain"}, | |
{".deploy", "application/octet-stream"}, | |
{".der", "application/x-x509-ca-cert"}, | |
{".dgml", "application/xml"}, | |
{".dib", "image/bmp"}, | |
{".dif", "video/x-dv"}, | |
{".dir", "application/x-director"}, | |
{".disco", "text/xml"}, | |
{".dll", "application/x-msdownload"}, | |
{".dll.config", "text/xml"}, | |
{".dlm", "text/dlm"}, | |
{".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"}, | |
{".dsp", "application/octet-stream"}, | |
{".dsw", "text/plain"}, | |
{".dtd", "text/xml"}, | |
{".dtsConfig", "text/xml"}, | |
{".dv", "video/x-dv"}, | |
{".dvi", "application/x-dvi"}, | |
{".dwf", "drawing/x-dwf"}, | |
{".dwp", "application/octet-stream"}, | |
{".dxr", "application/x-director"}, | |
{".eml", "message/rfc822"}, | |
{".emz", "application/octet-stream"}, | |
{".eot", "application/octet-stream"}, | |
{".eps", "application/postscript"}, | |
{".etl", "application/etl"}, | |
{".etx", "text/x-setext"}, | |
{".evy", "application/envoy"}, | |
{".exe", "application/octet-stream"}, | |
{".exe.config", "text/xml"}, | |
{".fdf", "application/vnd.fdf"}, | |
{".fif", "application/fractals"}, | |
{".filters", "Application/xml"}, | |
{".fla", "application/octet-stream"}, | |
{".flr", "x-world/x-vrml"}, | |
{".flv", "video/x-flv"}, | |
{".fsscript", "application/fsharp-script"}, | |
{".fsx", "application/fsharp-script"}, | |
{".generictest", "application/xml"}, | |
{".gif", "image/gif"}, | |
{".group", "text/x-ms-group"}, | |
{".gsm", "audio/x-gsm"}, | |
{".gtar", "application/x-gtar"}, | |
{".gz", "application/x-gzip"}, | |
{".h", "text/plain"}, | |
{".hdf", "application/x-hdf"}, | |
{".hdml", "text/x-hdml"}, | |
{".hhc", "application/x-oleobject"}, | |
{".hhk", "application/octet-stream"}, | |
{".hhp", "application/octet-stream"}, | |
{".hlp", "application/winhlp"}, | |
{".hpp", "text/plain"}, | |
{".hqx", "application/mac-binhex40"}, | |
{".hta", "application/hta"}, | |
{".htc", "text/x-component"}, | |
{".htm", "text/html"}, | |
{".html", "text/html"}, | |
{".htt", "text/webviewhtml"}, | |
{".hxa", "application/xml"}, | |
{".hxc", "application/xml"}, | |
{".hxd", "application/octet-stream"}, | |
{".hxe", "application/xml"}, | |
{".hxf", "application/xml"}, | |
{".hxh", "application/octet-stream"}, | |
{".hxi", "application/octet-stream"}, | |
{".hxk", "application/xml"}, | |
{".hxq", "application/octet-stream"}, | |
{".hxr", "application/octet-stream"}, | |
{".hxs", "application/octet-stream"}, | |
{".hxt", "text/html"}, | |
{".hxv", "application/xml"}, | |
{".hxw", "application/octet-stream"}, | |
{".hxx", "text/plain"}, | |
{".i", "text/plain"}, | |
{".ico", "image/x-icon"}, | |
{".ics", "application/octet-stream"}, | |
{".idl", "text/plain"}, | |
{".ief", "image/ief"}, | |
{".iii", "application/x-iphone"}, | |
{".inc", "text/plain"}, | |
{".inf", "application/octet-stream"}, | |
{".inl", "text/plain"}, | |
{".ins", "application/x-internet-signup"}, | |
{".ipa", "application/x-itunes-ipa"}, | |
{".ipg", "application/x-itunes-ipg"}, | |
{".ipproj", "text/plain"}, | |
{".ipsw", "application/x-itunes-ipsw"}, | |
{".iqy", "text/x-ms-iqy"}, | |
{".isp", "application/x-internet-signup"}, | |
{".ite", "application/x-itunes-ite"}, | |
{".itlp", "application/x-itunes-itlp"}, | |
{".itms", "application/x-itunes-itms"}, | |
{".itpc", "application/x-itunes-itpc"}, | |
{".IVF", "video/x-ivf"}, | |
{".jar", "application/java-archive"}, | |
{".java", "application/octet-stream"}, | |
{".jck", "application/liquidmotion"}, | |
{".jcz", "application/liquidmotion"}, | |
{".jfif", "image/pjpeg"}, | |
{".jnlp", "application/x-java-jnlp-file"}, | |
{".jpb", "application/octet-stream"}, | |
{".jpe", "image/jpeg"}, | |
{".jpeg", "image/jpeg"}, | |
{".jpg", "image/jpeg"}, | |
{".js", "application/x-javascript"}, | |
{".json", "application/json"}, | |
{".jsx", "text/jscript"}, | |
{".jsxbin", "text/plain"}, | |
{".latex", "application/x-latex"}, | |
{".library-ms", "application/windows-library+xml"}, | |
{".lit", "application/x-ms-reader"}, | |
{".loadtest", "application/xml"}, | |
{".lpk", "application/octet-stream"}, | |
{".lsf", "video/x-la-asf"}, | |
{".lst", "text/plain"}, | |
{".lsx", "video/x-la-asf"}, | |
{".lzh", "application/octet-stream"}, | |
{".m13", "application/x-msmediaview"}, | |
{".m14", "application/x-msmediaview"}, | |
{".m1v", "video/mpeg"}, | |
{".m2t", "video/vnd.dlna.mpeg-tts"}, | |
{".m2ts", "video/vnd.dlna.mpeg-tts"}, | |
{".m2v", "video/mpeg"}, | |
{".m3u", "audio/x-mpegurl"}, | |
{".m3u8", "audio/x-mpegurl"}, | |
{".m4a", "audio/m4a"}, | |
{".m4b", "audio/m4b"}, | |
{".m4p", "audio/m4p"}, | |
{".m4r", "audio/x-m4r"}, | |
{".m4v", "video/x-m4v"}, | |
{".mac", "image/x-macpaint"}, | |
{".mak", "text/plain"}, | |
{".man", "application/x-troff-man"}, | |
{".manifest", "application/x-ms-manifest"}, | |
{".map", "text/plain"}, | |
{".master", "application/xml"}, | |
{".mda", "application/msaccess"}, | |
{".mdb", "application/x-msaccess"}, | |
{".mde", "application/msaccess"}, | |
{".mdp", "application/octet-stream"}, | |
{".me", "application/x-troff-me"}, | |
{".mfp", "application/x-shockwave-flash"}, | |
{".mht", "message/rfc822"}, | |
{".mhtml", "message/rfc822"}, | |
{".mid", "audio/mid"}, | |
{".midi", "audio/mid"}, | |
{".mix", "application/octet-stream"}, | |
{".mk", "text/plain"}, | |
{".mmf", "application/x-smaf"}, | |
{".mno", "text/xml"}, | |
{".mny", "application/x-msmoney"}, | |
{".mod", "video/mpeg"}, | |
{".mov", "video/quicktime"}, | |
{".movie", "video/x-sgi-movie"}, | |
{".mp2", "video/mpeg"}, | |
{".mp2v", "video/mpeg"}, | |
{".mp3", "audio/mpeg"}, | |
{".mp4", "video/mp4"}, | |
{".mp4v", "video/mp4"}, | |
{".mpa", "video/mpeg"}, | |
{".mpe", "video/mpeg"}, | |
{".mpeg", "video/mpeg"}, | |
{".mpf", "application/vnd.ms-mediapackage"}, | |
{".mpg", "video/mpeg"}, | |
{".mpp", "application/vnd.ms-project"}, | |
{".mpv2", "video/mpeg"}, | |
{".mqv", "video/quicktime"}, | |
{".ms", "application/x-troff-ms"}, | |
{".msi", "application/octet-stream"}, | |
{".mso", "application/octet-stream"}, | |
{".mts", "video/vnd.dlna.mpeg-tts"}, | |
{".mtx", "application/xml"}, | |
{".mvb", "application/x-msmediaview"}, | |
{".mvc", "application/x-miva-compiled"}, | |
{".mxp", "application/x-mmxp"}, | |
{".nc", "application/x-netcdf"}, | |
{".nsc", "video/x-ms-asf"}, | |
{".nws", "message/rfc822"}, | |
{".ocx", "application/octet-stream"}, | |
{".oda", "application/oda"}, | |
{".odc", "text/x-ms-odc"}, | |
{".odh", "text/plain"}, | |
{".odl", "text/plain"}, | |
{".odp", "application/vnd.oasis.opendocument.presentation"}, | |
{".ods", "application/oleobject"}, | |
{".odt", "application/vnd.oasis.opendocument.text"}, | |
{".one", "application/onenote"}, | |
{".onea", "application/onenote"}, | |
{".onepkg", "application/onenote"}, | |
{".onetmp", "application/onenote"}, | |
{".onetoc", "application/onenote"}, | |
{".onetoc2", "application/onenote"}, | |
{".orderedtest", "application/xml"}, | |
{".osdx", "application/opensearchdescription+xml"}, | |
{".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"}, | |
{".pbm", "image/x-portable-bitmap"}, | |
{".pcast", "application/x-podcast"}, | |
{".pct", "image/pict"}, | |
{".pcx", "application/octet-stream"}, | |
{".pcz", "application/octet-stream"}, | |
{".pdf", "application/pdf"}, | |
{".pfb", "application/octet-stream"}, | |
{".pfm", "application/octet-stream"}, | |
{".pfx", "application/x-pkcs12"}, | |
{".pgm", "image/x-portable-graymap"}, | |
{".pic", "image/pict"}, | |
{".pict", "image/pict"}, | |
{".pkgdef", "text/plain"}, | |
{".pkgundef", "text/plain"}, | |
{".pko", "application/vnd.ms-pki.pko"}, | |
{".pls", "audio/scpls"}, | |
{".pma", "application/x-perfmon"}, | |
{".pmc", "application/x-perfmon"}, | |
{".pml", "application/x-perfmon"}, | |
{".pmr", "application/x-perfmon"}, | |
{".pmw", "application/x-perfmon"}, | |
{".png", "image/png"}, | |
{".pnm", "image/x-portable-anymap"}, | |
{".pnt", "image/x-macpaint"}, | |
{".pntg", "image/x-macpaint"}, | |
{".pnz", "image/png"}, | |
{".pot", "application/vnd.ms-powerpoint"}, | |
{".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, | |
{".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, | |
{".ppa", "application/vnd.ms-powerpoint"}, | |
{".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, | |
{".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"}, | |
{".prf", "application/pics-rules"}, | |
{".prm", "application/octet-stream"}, | |
{".prx", "application/octet-stream"}, | |
{".ps", "application/postscript"}, | |
{".psc1", "application/PowerShell"}, | |
{".psd", "application/octet-stream"}, | |
{".psess", "application/xml"}, | |
{".psm", "application/octet-stream"}, | |
{".psp", "application/octet-stream"}, | |
{".pub", "application/x-mspublisher"}, | |
{".pwz", "application/vnd.ms-powerpoint"}, | |
{".qht", "text/x-html-insertion"}, | |
{".qhtm", "text/x-html-insertion"}, | |
{".qt", "video/quicktime"}, | |
{".qti", "image/x-quicktime"}, | |
{".qtif", "image/x-quicktime"}, | |
{".qtl", "application/x-quicktimeplayer"}, | |
{".qxd", "application/octet-stream"}, | |
{".ra", "audio/x-pn-realaudio"}, | |
{".ram", "audio/x-pn-realaudio"}, | |
{".rar", "application/octet-stream"}, | |
{".ras", "image/x-cmu-raster"}, | |
{".rat", "application/rat-file"}, | |
{".rc", "text/plain"}, | |
{".rc2", "text/plain"}, | |
{".rct", "text/plain"}, | |
{".rdlc", "application/xml"}, | |
{".resx", "application/xml"}, | |
{".rf", "image/vnd.rn-realflash"}, | |
{".rgb", "image/x-rgb"}, | |
{".rgs", "text/plain"}, | |
{".rm", "application/vnd.rn-realmedia"}, | |
{".rmi", "audio/mid"}, | |
{".rmp", "application/vnd.rn-rn_music_package"}, | |
{".roff", "application/x-troff"}, | |
{".rpm", "audio/x-pn-realaudio-plugin"}, | |
{".rqy", "text/x-ms-rqy"}, | |
{".rtf", "application/rtf"}, | |
{".rtx", "text/richtext"}, | |
{".ruleset", "application/xml"}, | |
{".s", "text/plain"}, | |
{".safariextz", "application/x-safari-safariextz"}, | |
{".scd", "application/x-msschedule"}, | |
{".sct", "text/scriptlet"}, | |
{".sd2", "audio/x-sd2"}, | |
{".sdp", "application/sdp"}, | |
{".sea", "application/octet-stream"}, | |
{".searchConnector-ms", "application/windows-search-connector+xml"}, | |
{".setpay", "application/set-payment-initiation"}, | |
{".setreg", "application/set-registration-initiation"}, | |
{".settings", "application/xml"}, | |
{".sgimb", "application/x-sgimb"}, | |
{".sgml", "text/sgml"}, | |
{".sh", "application/x-sh"}, | |
{".shar", "application/x-shar"}, | |
{".shtml", "text/html"}, | |
{".sit", "application/x-stuffit"}, | |
{".sitemap", "application/xml"}, | |
{".skin", "application/xml"}, | |
{".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, | |
{".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, | |
{".slk", "application/vnd.ms-excel"}, | |
{".sln", "text/plain"}, | |
{".slupkg-ms", "application/x-ms-license"}, | |
{".smd", "audio/x-smd"}, | |
{".smi", "application/octet-stream"}, | |
{".smx", "audio/x-smd"}, | |
{".smz", "audio/x-smd"}, | |
{".snd", "audio/basic"}, | |
{".snippet", "application/xml"}, | |
{".snp", "application/octet-stream"}, | |
{".sol", "text/plain"}, | |
{".sor", "text/plain"}, | |
{".spc", "application/x-pkcs7-certificates"}, | |
{".spl", "application/futuresplash"}, | |
{".src", "application/x-wais-source"}, | |
{".srf", "text/plain"}, | |
{".SSISDeploymentManifest", "text/xml"}, | |
{".ssm", "application/streamingmedia"}, | |
{".sst", "application/vnd.ms-pki.certstore"}, | |
{".stl", "application/vnd.ms-pki.stl"}, | |
{".sv4cpio", "application/x-sv4cpio"}, | |
{".sv4crc", "application/x-sv4crc"}, | |
{".svc", "application/xml"}, | |
{".swf", "application/x-shockwave-flash"}, | |
{".t", "application/x-troff"}, | |
{".tar", "application/x-tar"}, | |
{".tcl", "application/x-tcl"}, | |
{".testrunconfig", "application/xml"}, | |
{".testsettings", "application/xml"}, | |
{".tex", "application/x-tex"}, | |
{".texi", "application/x-texinfo"}, | |
{".texinfo", "application/x-texinfo"}, | |
{".tgz", "application/x-compressed"}, | |
{".thmx", "application/vnd.ms-officetheme"}, | |
{".thn", "application/octet-stream"}, | |
{".tif", "image/tiff"}, | |
{".tiff", "image/tiff"}, | |
{".tlh", "text/plain"}, | |
{".tli", "text/plain"}, | |
{".toc", "application/octet-stream"}, | |
{".tr", "application/x-troff"}, | |
{".trm", "application/x-msterminal"}, | |
{".trx", "application/xml"}, | |
{".ts", "video/vnd.dlna.mpeg-tts"}, | |
{".tsv", "text/tab-separated-values"}, | |
{".ttf", "application/octet-stream"}, | |
{".tts", "video/vnd.dlna.mpeg-tts"}, | |
{".txt", "text/plain"}, | |
{".u32", "application/octet-stream"}, | |
{".uls", "text/iuls"}, | |
{".user", "text/plain"}, | |
{".ustar", "application/x-ustar"}, | |
{".vb", "text/plain"}, | |
{".vbdproj", "text/plain"}, | |
{".vbk", "video/mpeg"}, | |
{".vbproj", "text/plain"}, | |
{".vbs", "text/vbscript"}, | |
{".vcf", "text/x-vcard"}, | |
{".vcproj", "Application/xml"}, | |
{".vcs", "text/plain"}, | |
{".vcxproj", "Application/xml"}, | |
{".vddproj", "text/plain"}, | |
{".vdp", "text/plain"}, | |
{".vdproj", "text/plain"}, | |
{".vdx", "application/vnd.ms-visio.viewer"}, | |
{".vml", "text/xml"}, | |
{".vscontent", "application/xml"}, | |
{".vsct", "text/xml"}, | |
{".vsd", "application/vnd.visio"}, | |
{".vsi", "application/ms-vsi"}, | |
{".vsix", "application/vsix"}, | |
{".vsixlangpack", "text/xml"}, | |
{".vsixmanifest", "text/xml"}, | |
{".vsmdi", "application/xml"}, | |
{".vspscc", "text/plain"}, | |
{".vss", "application/vnd.visio"}, | |
{".vsscc", "text/plain"}, | |
{".vssettings", "text/xml"}, | |
{".vssscc", "text/plain"}, | |
{".vst", "application/vnd.visio"}, | |
{".vstemplate", "text/xml"}, | |
{".vsto", "application/x-ms-vsto"}, | |
{".vsw", "application/vnd.visio"}, | |
{".vsx", "application/vnd.visio"}, | |
{".vtx", "application/vnd.visio"}, | |
{".wav", "audio/wav"}, | |
{".wave", "audio/wav"}, | |
{".wax", "audio/x-ms-wax"}, | |
{".wbk", "application/msword"}, | |
{".wbmp", "image/vnd.wap.wbmp"}, | |
{".wcm", "application/vnd.ms-works"}, | |
{".wdb", "application/vnd.ms-works"}, | |
{".wdp", "image/vnd.ms-photo"}, | |
{".webarchive", "application/x-safari-webarchive"}, | |
{".webtest", "application/xml"}, | |
{".wiq", "application/xml"}, | |
{".wiz", "application/msword"}, | |
{".wks", "application/vnd.ms-works"}, | |
{".WLMP", "application/wlmoviemaker"}, | |
{".wlpginstall", "application/x-wlpg-detect"}, | |
{".wlpginstall3", "application/x-wlpg3-detect"}, | |
{".wm", "video/x-ms-wm"}, | |
{".wma", "audio/x-ms-wma"}, | |
{".wmd", "application/x-ms-wmd"}, | |
{".wmf", "application/x-msmetafile"}, | |
{".wml", "text/vnd.wap.wml"}, | |
{".wmlc", "application/vnd.wap.wmlc"}, | |
{".wmls", "text/vnd.wap.wmlscript"}, | |
{".wmlsc", "application/vnd.wap.wmlscriptc"}, | |
{".wmp", "video/x-ms-wmp"}, | |
{".wmv", "video/x-ms-wmv"}, | |
{".wmx", "video/x-ms-wmx"}, | |
{".wmz", "application/x-ms-wmz"}, | |
{".wpl", "application/vnd.ms-wpl"}, | |
{".wps", "application/vnd.ms-works"}, | |
{".wri", "application/x-mswrite"}, | |
{".wrl", "x-world/x-vrml"}, | |
{".wrz", "x-world/x-vrml"}, | |
{".wsc", "text/scriptlet"}, | |
{".wsdl", "text/xml"}, | |
{".wvx", "video/x-ms-wvx"}, | |
{".x", "application/directx"}, | |
{".xaf", "x-world/x-vrml"}, | |
{".xaml", "application/xaml+xml"}, | |
{".xap", "application/x-silverlight-app"}, | |
{".xbap", "application/x-ms-xbap"}, | |
{".xbm", "image/x-xbitmap"}, | |
{".xdr", "text/plain"}, | |
{".xht", "application/xhtml+xml"}, | |
{".xhtml", "application/xhtml+xml"}, | |
{".xla", "application/vnd.ms-excel"}, | |
{".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, | |
{".xlc", "application/vnd.ms-excel"}, | |
{".xld", "application/vnd.ms-excel"}, | |
{".xlk", "application/vnd.ms-excel"}, | |
{".xll", "application/vnd.ms-excel"}, | |
{".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"}, | |
{".xml", "text/xml"}, | |
{".xmta", "application/xml"}, | |
{".xof", "x-world/x-vrml"}, | |
{".XOML", "text/plain"}, | |
{".xpm", "image/x-xpixmap"}, | |
{".xps", "application/vnd.ms-xpsdocument"}, | |
{".xrm-ms", "text/xml"}, | |
{".xsc", "application/xml"}, | |
{".xsd", "text/xml"}, | |
{".xsf", "text/xml"}, | |
{".xsl", "text/xml"}, | |
{".xslt", "text/xml"}, | |
{".xsn", "application/octet-stream"}, | |
{".xss", "application/xml"}, | |
{".xtp", "application/octet-stream"}, | |
{".xwd", "image/x-xwindowdump"}, | |
{".z", "application/x-compress"}, | |
{".zip", "application/x-zip-compressed"}, | |
#endregion | |
}; | |
public static string GetMimeType(string extension) | |
{ | |
if (extension == null) | |
{ | |
throw new ArgumentNullException("extension"); | |
} | |
if (!extension.StartsWith(".")) | |
{ | |
extension = "." + extension; | |
} | |
string mime; | |
return _mappings.TryGetValue(extension, out mime) ? mime : "application/octet-stream"; | |
} | |
[STAThread] | |
static void Main(string[] args) | |
{ | |
var handle = GetConsoleWindow(); | |
ShowWindow(handle, SW_HIDE); | |
Dictionary<string, string> mime_mapping = new Dictionary<string, string> { | |
{DataFormats.Bitmap, "image/png"},// all bitmap to png | |
{DataFormats.Html, "text/html"}, | |
{DataFormats.StringFormat, "text/plain"}, | |
{DataFormats.UnicodeText , "text/plain"}, | |
{DataFormats.Text, "text/plain" }, | |
{DataFormats.Rtf, "text/richtext"}, | |
}; | |
Semaphore request_coming = new Semaphore(0, 1); | |
IDataObject clip_data = null; | |
bool should_quit = false; | |
HTTPProxyServer server = new HTTPProxyServer(_ => { | |
if (_ == "selection") | |
{ | |
request_coming.Release(); | |
Thread.Sleep(1000); | |
string[] fmts = clip_data.GetFormats(true); | |
//foreach (var _fmt in fmts) | |
//{ | |
// Console.WriteLine(_fmt); | |
//} | |
BinaryFormatter bf = new BinaryFormatter(); | |
byte[] data = null; | |
string fmt = null; | |
foreach (var kv in mime_mapping) | |
{ | |
object data_obj = clip_data.GetData(kv.Key, true); | |
if (data_obj == null) | |
continue; | |
using (var ms = new System.IO.MemoryStream()) | |
{ | |
if(data_obj is System.Drawing.Bitmap) | |
{ | |
(data_obj as System.Drawing.Bitmap).Save(ms, System.Drawing.Imaging.ImageFormat.Png); | |
data = ms.ToArray(); | |
} | |
else if(data_obj is string) | |
{ | |
string str = data_obj as string; | |
// html processing | |
if(kv.Key == DataFormats.Html) | |
{ | |
var pos = Regex.Match(str, @"(StartHTML:(?<start>\d+))[^a-zA-Z]+(EndHTML:(?<end>\d+))", RegexOptions.Multiline); | |
if(pos.Success) | |
{ | |
int start = int.Parse(pos.Groups["start"].Value); | |
int end = int.Parse(pos.Groups["end"].Value); | |
if (end - start > str.Length - start) | |
str = str.Substring(start); | |
else | |
str = str.Substring(start, end - start); | |
} | |
} | |
data = System.Text.Encoding.UTF8.GetBytes(str); | |
} | |
else if(data_obj is System.IO.MemoryStream) | |
{ | |
data = (data_obj as System.IO.MemoryStream).ToArray(); | |
} | |
else | |
{ | |
bf.Serialize(ms, data_obj); | |
data = ms.ToArray(); | |
} | |
} | |
if (data != null) | |
{ | |
fmt = kv.Value; | |
break; | |
} | |
} | |
//process file | |
const string fmt_filename = "FileNameW"; | |
if (fmts.Contains(fmt_filename) && data == null) | |
{ | |
string []fnames = clip_data.GetData(fmt_filename, true) as string[]; | |
string fname = fnames.Length > 0 ? fnames[0] : null; // only send first selected file | |
fmt = GetMimeType(fname.Substring(fname.LastIndexOf('.'))); | |
if(fmt != null) | |
data = System.IO.File.ReadAllBytes(fname); | |
} | |
if (data == null) | |
return null; | |
//byte[] data = System.IO.File.ReadAllBytes(@"C:\Users\Frei Zhang\Pictures\logo.png"); | |
return new HTTPProxyServer.Response( | |
/*"image/png"*/fmt, | |
data | |
); | |
} | |
else if(_ == "quit") | |
{ | |
request_coming.Release(); | |
should_quit = true; | |
return null; | |
} | |
else | |
{ | |
return null; | |
} | |
}, 8000); | |
while(!should_quit) | |
{ | |
request_coming.WaitOne(); | |
clip_data = Clipboard.GetDataObject(); | |
} | |
server.Stop(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment