public static void Assert() { var input = new MemoryStream(Encoding.ASCII.GetBytes("xxaa\rbbb\n ?ccc\r\nuuuu")); var r = new SmartStreamReader(input); var a = r.ReadLine(); var b = r.ReadLine(); var buffer = new byte[5]; var c = r.Read(buffer, 0, buffer.Length); var u = r.ReadToEnd(); }
static void Main(string[] args) { SmartStreamReader.InternalBufferCapacity = 9; var input = new MemoryStream(Encoding.ASCII.GetBytes("xa\rbbb\n ?ccc\r\n yuuuux\nz")); var r = new SmartStreamReader(input); var a = r.ReadLine(); var x = r.ReadToBoundary("uuuu"); var y = Encoding.UTF8.GetString(x.ToArray()); var z = r.ReadLine(); }
public static void Main(string[] args) { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201409/20140908/rsa-assetslibrary // start /MIN /WAIT cmd /C C:\util\jsc\bin\jsc.meta.exe ReferenceAssetsLibrary /ProjectFileName:"$(ProjectPath)" /NamedKeyPairs:JVMToCLR /NamedKeyPairs:CLRToJVM System.Console.WriteLine( typeof(object).AssemblyQualifiedName ); // how do we use it? // first lets show the api is useable. // are we a GUI java app? //var zImageMetadataReader = typeof(com.drew.imaging.ImageMetadataReader); //// { zImageMetadataReader = com.drew.imaging.ImageMetadataReader } //Console.WriteLine(new { zImageMetadataReader }); //<package id="AndroidMetadataExtractor" version="1.0.0.0" targetFramework="net40" /> //var m = ImageMetadataReader.readMetadata(new File(filepath)); var f = @"x:\vr\androidlensblur\IMG_20151205_150024.vr.jpg"; //var f = @"x:\vr\androidlensblur\IMG_20151205_152513.vr.jpg"; try { // could jsc have ctors act as implict operators yet? Action<com.adobe.xmp.XMPMeta> AtXMPMeta = XMPMeta => { try { var XMPMetai = XMPMeta.iterator(); //Console.WriteLine(new { getXMPMeta = XMPMeta.size() }); Console.WriteLine(); while (XMPMetai.hasNext()) { var xXMPPropertyInfo = XMPMetai.next() as com.adobe.xmp.properties.XMPPropertyInfo; //string getNamespace(); // PropertyOptions getOptions(); // string getPath(); // string getValue(); var Namespace = xXMPPropertyInfo.getNamespace(); var Path = xXMPPropertyInfo.getPath(); var Value = xXMPPropertyInfo.getValue(); //{ Namespace = http://ns.google.com/photos/1.0/image/, Path = , Value = } //{ Namespace = http://ns.google.com/photos/1.0/image/, Path = GImage:Data, Value = /9j/4AAQS Console.WriteLine(new { Namespace, Path, Value }); if (Path == "GImage:Data") { // GImage:Mime="image/jpeg" var GImageDataBytes = Convert.FromBase64String(Value); // image broken? File.WriteAllBytes("GImageDataBytes.jpg", GImageDataBytes); } // http://stackoverflow.com/questions/1650983/streaming-aac-audio-with-android if (Path == "GAudio:Data") { // GAudio:Mime="audio/mp4a-latm" var GAudioDataBytes = Convert.FromBase64String(Value); // whats the format? //File.WriteAllBytes("GAudioDataBytes.mp3", GAudioDataBytes); } } } catch { throw; } }; var bytes = System.IO.File.ReadAllBytes(f); var s = new SmartStreamReader(new MemoryStream(bytes)); var s2 = new SmartStreamReader(new MemoryStream(bytes)); var segmentindex = 0; var xmpmeta_open = "<x:xmpmeta"; var xmpmeta_close = "</x:xmpmeta>"; var ok = true; while (ok) { ok = false; //Console.WriteLine("before ReadToBoundary"); var segment1 = s.ReadToBoundary(xmpmeta_open); //Console.WriteLine("after ReadToBoundary"); //Console.WriteLine(new { segment1 }); if (segment1 != null) { var segment1close = s.ReadToBoundary(xmpmeta_close); //Console.WriteLine(new { segment1close }); if (segment1close != null) { Console.WriteLine("segment1 " + new { segment1close.Length }); ok = segment1close.Length > 0; if (ok) { var xmpmeta_close_bytes = Encoding.UTF8.GetBytes(xmpmeta_close); segment1close.Write(xmpmeta_close_bytes, 0, xmpmeta_close_bytes.Length); //var xmpmeta_bytes = segment1close.ToArray().Concat(Encoding.UTF8.GetBytes(xmpmeta_close)).ToArray(); var xmpmeta_bytes = segment1close.ToArray(); //var xmpmeta_string = xmpmeta_open + Encoding.UTF8.GetString(segment1close.ToArray()) + xmpmeta_close; //var xmpmeta_string = Encoding.UTF8.GetString(segment1close.ToArray()) + xmpmeta_close; var xmpmeta_string = Encoding.UTF8.GetString(xmpmeta_bytes); //File.WriteAllText("xmpmeta." + segmentindex + ".xml", xmpmeta_string); //File.WriteAllBytes("xmpmeta." + segmentindex + ".xml", xmpmeta_bytes); // its in chunks. //Console.WriteLine(new { segmentindex, xmpmeta_string }); //Console.WriteLine(new { segmentindex }); //com.adobe.xmp.XMPMeta meta = com.adobe.xmp.XMPMetaFactory.parseFromBuffer( // (sbyte[])(object)xmpmeta_bytes //); //Console.WriteLine(new { segmentindex, meta }); //AtXMPMeta(meta); //{ fault = System.Xml.XmlException: '.', hexadecimal value 0x00, is an invalid character. Line 6, position 65122. // at System.Xml.XmlTextReaderImpl.Throw(Exception e) // at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) // at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Char[] data, Int32 length, Int32 invCharPos) // at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr) var xmpmeta = XElement.Parse(xmpmeta_string); var HasExtendedXMP = xmpmeta.Elements().First().Elements().First().Attributes().FirstOrDefault(x => x.Name.LocalName == "HasExtendedXMP"); // Console.WriteLine(new { xmpmeta }); // Image cotains XMP section, 65460 bytes long //??http://ns.adobe.com/xmp/extension/?E7161367CA4C162658BE105E785E9D37?U??????<x:xmpmeta xmlns:x="ado //be:ns:meta/" x:xmptk="Adobe XMP Core 5.1.0-jc003"> // http://ns.adobe.com/xmp/extension/?E //var boundary = "http://ns.adobe.com/xmp/extension/?" + HasExtendedXMP.Value; //var boundary = "http://ns.adobe.com/xmp/extension/"; var boundary = HasExtendedXMP.Value; // 475348120A63AE3C4D312022600647AA var skip0 = s.ReadToBoundary(boundary); var chunkstream = new MemoryStream { }; do { var take0 = s.ReadToBoundary(boundary); //Console.WriteLine(new { take0.Length }); // kStdXMPLimit var offset1 = boundary.Length + 8; if (take0.Length > 65462) { // last chunk? // take0.ReadToEnd() 'System.IO.MemoryStream' does not contain a definition for 'ReadToEnd' and no extension method 'ReadToEnd' accepting a first argument of type 'System.IO.MemoryStream' could be found (are you missing a using directive or an assembly reference?) //var x = take0.ReadToEnd(); var s3 = new SmartStreamReader(new MemoryStream(take0.ToArray())); var s3x = s3.ReadToBoundary(xmpmeta_close); //var xs = Encoding.UTF8.GetString( // take0.ToArray(), // boundary.Length + 8, // (int)take0.Length - (boundary.Length + 8) // ); chunkstream.Write( s3x.ToArray(), offset1, (int)s3x.Length - offset1 ); break; } if (take0.Length == 0) break; // (char)take0.ToArray()[boundary.Length + 8] 60 '<' char // (char)take0.ToArray()[take0.Length - "http://ns.adobe.com/xmp/extension/".Length - 6] 74 'J' char var offset2 = (int)take0.Length - "http://ns.adobe.com/xmp/extension/".Length - 6; chunkstream.Write( take0.ToArray(), offset1, offset2 - offset1 + 1 ); } while (true); var xmpmeta2_string = Encoding.UTF8.GetString(chunkstream.ToArray()) + xmpmeta_close; //var xmpmeta = XElement.Parse(xmpmeta_string); var xmpmeta2 = XElement.Parse(xmpmeta2_string); //File.WriteAllBytes("xmpmeta." + segmentindex + ".jpg", chunkstream.tos); //xmpmeta2.Elements().First().Elements().First().Attributes().ToArray()[3].Name.LocalName "Data" string //xmpmeta2.Elements().First().Elements().First().Attributes().ToArray()[3].Name.NamespaceName "http://ns.google.com/photos/1.0/image/" string var GAudioData = xmpmeta2.Elements().First().Elements().First().Attributes().ToArray()[4]; var GAudioDataBytes = Convert.FromBase64String(GAudioData.Value); File.WriteAllBytes(new FileInfo(f).Name + ".GAudioDataBytes.mp4", GAudioDataBytes); var GImageData = xmpmeta2.Elements().First().Elements().First().Attributes().ToArray()[3]; var GImageDataBytes = Convert.FromBase64String(GImageData.Value); File.WriteAllBytes(new FileInfo(f).Name + ".GImageDataBytes.jpg", GImageDataBytes); // http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart3.pdf // keep only 1 section thanks. ok = false; Debugger.Break(); } //java.lang.Object, rt //{ zImageMetadataReader = com.drew.imaging.ImageMetadataReader } //{ segment1 = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@19b1de } //{ segment1close = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@1d10a5c } //segment1 { Length = 860 } //{ segment1 = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@50988 } //{ segment1close = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@49d67c } //segment1 { Length = 2218768 } //{ segment1 = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@1a42792 } //{ segment1close = ScriptCoreLibJava.BCLImplementation.System.IO.__MemoryStream@2200d5 } //segment1 { Length = 0 } //{ DirectoryCount = 6 } } } segmentindex++; } // segment 2 ? //var segment2 = s.ReadToBoundary("<x:xmpmeta"); //Console.WriteLine("segmen1 " + new { segment2 }); #if !DEBUG var m = ImageMetadataReader.readMetadata(new java.io.File(f)); // now what? // can we find the additional data feed ? var DirectoryCount = m.getDirectoryCount(); Console.WriteLine(new { DirectoryCount }); var i = m.getDirectories(); var ii = i.iterator(); //{ zImageMetadataReader = com.drew.imaging.ImageMetadataReader } //{ DirectoryCount = 6 } //{ current = JPEG Directory (8 tags) } //{ current = Exif IFD0 Directory (8 tags) } //{ current = GPS Directory (2 tags) } //{ current = Exif SubIFD Directory (2 tags) } //{ current = Xmp Directory (1 tag) } //{ current = File Directory (3 tags) } //done // java.lang.Object, rt //{ zImageMetadataReader = com.drew.imaging.ImageMetadataReader } //{ DirectoryCount = 6 } //{ xDirectory = JPEG Directory (8 tags) } //{ TagCount = 8 } //{ xDirectory = Exif IFD0 Directory (8 tags) } //{ TagCount = 8 } //{ xDirectory = GPS Directory (2 tags) } //{ TagCount = 2 } //{ xDirectory = Exif SubIFD Directory (2 tags) } //{ TagCount = 2 } //{ xDirectory = Xmp Directory (1 tag) } //{ TagCount = 1 } //{ xXmpDirectory = Xmp Directory (1 tag) } //{ xDirectory = File Directory (3 tags) } //{ TagCount = 3 } //done while (ii.hasNext()) { var current = ii.next(); var xDirectory = current as com.drew.metadata.Directory; Console.WriteLine(); Console.WriteLine(new { xDirectory }); var TagCount = xDirectory.getTagCount(); Console.WriteLine(new { TagCount }); var taga = xDirectory.getTags(); var tagii = taga.iterator(); while (tagii.hasNext()) { var tagcurrent = tagii.next(); //var tagcurrentt = typeof(tagcurrent); //var tagcurrentt = Type.GetTypeFromHandle(tagcurrent); var tagcurrentt = tagcurrent.GetType(); var xTag = tagcurrent as com.drew.metadata.Tag; //Console.WriteLine(new { tagcurrent, tagcurrentt }); Console.WriteLine(new { tagcurrent, xTag }); } var xXmpDirectory = xDirectory as com.drew.metadata.xmp.XmpDirectory; if (xXmpDirectory != null) { Console.WriteLine(); Console.WriteLine(new { xXmpDirectory }); // should see mime tags? //public virtual Map getXmpProperties(); #region XmpProperties var XmpProperties = xXmpDirectory.getXmpProperties(); Console.WriteLine(new { XmpProperties = XmpProperties.size() }); //for (int i = 0; i < XmpProperties.size(); i++) var ksi = XmpProperties.keySet().iterator(); while (ksi.hasNext()) { var ckey = ksi.next(); var cvalue = XmpProperties.get(ckey); Console.WriteLine(new { ckey, cvalue }); } #endregion // this is only the first one? there is more? // http://stackoverflow.com/questions/23253281/reading-jpg-files-xmp-metadata var XMPMeta = xXmpDirectory.getXMPMeta(); AtXMPMeta(XMPMeta); } } #endif } catch (Exception fault) { Console.WriteLine(new { fault }); //throw; } Console.WriteLine("done"); Console.ReadLine(); CLRProgram.CLRMain(); }
static HTTPHeadersWithXElement[] InputStreamToXElements(string boundary, Stream InputStream) { //Console.WriteLine("enter InputStreamToXElements " + new { InputStream, InputStream.Position }); Console.WriteLine("enter InputStreamToXElements " + new { InputStream }); var a = new List<HTTPHeadersWithXElement> { }; var rSmartStreamReader = new ScriptCoreLib.Shared.IO.SmartStreamReader(InputStream); //var dump = rSmartStreamReader.ReadToEnd(); //Console.WriteLine(new { dump }); //return a.ToArray(); //MultipartReader var header0 = rSmartStreamReader.ReadLine(); while (header0 == "--" + boundary) { // opening multipart.. header0 = ""; var header2 = rSmartStreamReader.ReadLine(); var ContentType = header2.SkipUntilOrEmpty("Content-Type:"); var hlist = new List<string> { }; var headers = true; while (headers) { var header3 = rSmartStreamReader.ReadLine(); headers = !string.IsNullOrEmpty(header3); if (headers) { hlist.Add(header3); } } { // read data // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 // X:\jsc.svn\examples\rewrite\TestReadToBoundary\TestReadToBoundary\Program.cs var data = rSmartStreamReader.ReadToBoundary("--" + boundary); var xstring = Encoding.UTF8.GetString(data.ToArray()); var x = XElement.Parse(xstring); a.Add(new HTTPHeadersWithXElement { Headers = hlist.ToArray(), Content = x }); var header4 = rSmartStreamReader.ReadLine(); header0 = header4; // which is it, the end or is there more? //Console.WriteLine("#" + cid + " " + new { header4 }); //I/System.Console( 6761): #5 { Length = 256 } //I/System.Console( 6761): #5 { header4 = ------WebKitFormBoundaryrn6MyQlGvhETZkjw-- } // the end? } } return a.ToArray(); }
public static Thread CreateServer( ContextWrapper InternalContext, IPAddress ipa, int port, Action<string> Console_WriteLine, InternalFileInfo[] Files) { var random = new System.Random(); // Error 312 (net::ERR_UNSAFE_PORT): Unknown error. if (port < 1024) port = random.Next(1024, 32000); var cid = 0; NetworkStreamAction AtConnection = InternalStream => { var id = cid++; Console_WriteLine("#" + cid); //log("AtConnection"); var r = new SmartStreamReader(InternalStream); #region __Global var __Request = new __HttpRequest(); var __Response = new __HttpResponse { InternalStream = InternalStream, InternalContext = InternalContext }; var __Global = new __Global(); __Global.Files = Files; __Global.WebMethods = new InternalWebMethodInfo[] { new InternalWebMethodInfo { Name = "WebMethod2", TypeFullName = "TestGAE.ApplicationWebService", MetadataToken = "06000001", Parameters = new InternalWebMethodParameterInfo[] { new InternalWebMethodParameterInfo { Name = "e", Value = "", IsDelegate = false }, new InternalWebMethodParameterInfo { Name = "y", Value = "", IsDelegate = true } } } }; __Global.ScriptApplications = new[] { new WebServiceScriptApplication { TypeName = "Application", TypeFullName = "TestGAE.Application", PageSource = "<body>\r\n <noscript>Error: This Application requires JavaScript.</noscript>\r\n <link rel=\"stylesheet\" href=\"assets/TestGAE/Default.css\" />\r\n <div id=\"PageContainer\">\r\n <h1 id=\"Header\">JSC - The .NET crosscompiler for web platforms.</h1>\r\n <p id=\"Content\" style=\"padding: 2em; color: blue;\">Hello world</p>\r\n </div>\r\n</body>", References = new [] { new WebServiceScriptApplication.Reference { AssemblyFile = "ScriptCoreLib.dll" }, new WebServiceScriptApplication.Reference { AssemblyFile = "TestGAE.Application.exe" } } } }; ((__HttpApplication)(object)__Global).Request = (HttpRequest)(object)__Request; ((__HttpApplication)(object)__Global).Response = (HttpResponse)(object)__Response; var Context = __Global.Context; #endregion #region __Request { HttpMethod, QueryString, Headers } var HTTP_METHOD_PATH_QUERY = r.ReadLine(); var HTTP_METHOD = HTTP_METHOD_PATH_QUERY.TakeUntilOrEmpty(" "); __Request.HttpMethod = HTTP_METHOD; Console.WriteLine("#" + cid + " " + HTTP_METHOD_PATH_QUERY); #region check METHOD if (HTTP_METHOD != "POST") if (HTTP_METHOD != "GET") { var m = new MemoryStream(); Action<string> WriteLineASCII = (string e) => { var x = Encoding.ASCII.GetBytes(e + "\r\n"); m.Write(x, 0, x.Length); }; Console_WriteLine("#" + cid + " 500"); WriteLineASCII("HTTP/1.1 500 OK"); WriteLineASCII("Connection: close"); var oa = m.ToArray(); InternalStream.Write(oa, 0, oa.Length); InternalStream.Flush(); InternalStream.Close(); return; } #endregion var HTTP_PATH_QUERY = HTTP_METHOD_PATH_QUERY.SkipUntilOrEmpty(" ").TakeUntilLastOrEmpty(" "); var HTTP_PATH = HTTP_PATH_QUERY.TakeUntilIfAny("?"); __Request.Path = HTTP_PATH; #region QueryString var HTTP_QUERY = HTTP_PATH_QUERY.SkipUntilOrEmpty("?"); var __QueryStringItems = HTTP_QUERY.Split('&'); foreach (var item in __QueryStringItems) { var Key = item.TakeUntilOrEmpty("="); if (!string.IsNullOrEmpty(Key)) { var Value = item.SkipUntilIfAny("="); __Request.QueryString[Key] = Value; } } #endregion __Request.Headers["Content-Type"] = ""; #region Headers var NextHeader = r.ReadLine(); while (!string.IsNullOrEmpty(NextHeader)) { // http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers var HeaderKey = NextHeader.TakeUntilOrEmpty(":"); var HeaderValue = NextHeader.SkipUntilIfAny(":").Trim(); __Request.Headers[HeaderKey] = HeaderValue; NextHeader = r.ReadLine(); } #endregion #endregion var data = r.ReadToMemoryStream(); var boundary = __Request.Headers["Content-Type"].SkipUntilOrEmpty("multipart/form-data; boundary="); #region Form if (__Request.Headers["Content-Type"] == "application/x-www-form-urlencoded") { var p = Encoding.UTF8.GetString(data.ToBytes()); var q = p.Split('&'); foreach (var item in q) { var Key = item.TakeUntilOrEmpty("="); var Value = item.SkipUntilIfAny("="); __Request.Form[Key] = Value; } } #endregion #region selected_item var selected_item = default(InternalFileInfo); foreach (var item in Files) { // LINQ please! if (HTTP_PATH == "/" + item.Name) selected_item = item; } #endregion { if (__Request.Path == "/jsc") { __InternalGlobalExtensions.InternalApplication_BeginRequest(__Global); } else { InternalGlobalExtensions.InternalApplication_BeginRequest(__Global); } Console.WriteLine("#" + cid + " " + HTTP_METHOD_PATH_QUERY + " done"); return; //} #region selected_item if (selected_item != null) { var path = selected_item.Name; __Response.StatusCode = 200; __Response.Headers["X-Handler"] = "http://jsc-solutions.net"; if (path.EndsWith(".gif")) __Response.ContentType = ("image/gif"); else if (path.EndsWith(".png")) __Response.ContentType = ("image/png"); else if (path.EndsWith(".htm")) __Response.ContentType = ("text/html; charset=utf-8"); else __Response.ContentType = ("application/octet-stream"); __Response.WriteFile(path); InternalStream.Close(); __Global.CompleteRequest(); return; } #endregion __Response.StatusCode = 200; __Response.ContentType = ("text/html; charset=utf-8"); __Response.Headers["X-Handler"] = "http://jsc-solutions.net"; #region index #region WriteLineASCII Action<string> WriteLine = (string e) => { __Response.Write(e + "\r\n"); }; #endregion #region html index WriteLine("<html>"); WriteLine("<body>"); foreach (var HeaderKey in Context.Request.Headers.AllKeys) { var HeaderValue = Context.Request.Headers[HeaderKey]; WriteLine("<code style='color: gray;'>" + HeaderKey + "</code>:"); WriteLine("<code style='color: green;'>" + HeaderValue + "</code><br />"); } WriteLine("<h3>data: 0x" + data.Length.ToString("x8") + "</h3>"); WriteLine("<pre>" + boundary + "</pre>"); WriteLine("<hr />"); WriteLine("<pre>" + HTTP_METHOD_PATH_QUERY + "</pre>"); if (string.IsNullOrEmpty(boundary)) WriteLine("<pre>" + WriteHexDump(data.ToBytes()) + "</pre>"); #region by boundary if (!string.IsNullOrEmpty(boundary)) { boundary = "--" + boundary; var bytes = data.ToBytes(); var boundarybytes = Encoding.ASCII.GetBytes(boundary); var boundaries = new List<Int32Box>(); for (int i = 0; i < bytes.Length - boundarybytes.Length; i++) { var AtBoundary = false; // is i at boundary? for (int j = 0; j < boundarybytes.Length; j++) { if (bytes[i + j] != boundarybytes[j]) { AtBoundary = false; break; } AtBoundary = true; } if (AtBoundary) { boundaries.Add(new Int32Box { value = i }); } } var boundaries_a = boundaries.ToArray(); for (int i = 0; i < boundaries_a.Length - 1; i++) { var start = boundaries_a[i].value + boundarybytes.Length + 2; var end = boundaries_a[i + 1].value; var chunk = new byte[end - start]; Array.Copy(bytes, start, chunk, 0, chunk.Length); WriteLine("<hr />"); WriteLine("<pre>" + WriteHexDump(chunk) + "</pre>"); } } #endregion WriteLine("<hr />"); WriteLine("<form target='_blank' action='/jsc?WebMethod=06000048' method='POST'><br /> <img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> method: <code><a href='?WebMethod=06000048'>Hello</a></code><input type='submit' value='Invoke' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>data</code> = <input type='text' name='_06000048_data' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>foo</code> = <input type='text' name='_06000048_foo' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' /> parameter: <code>result</code></form>"); WriteLine("<hr />"); WriteLine("<form target='_blank' action='/jsc?WebMethod=06000048' method='POST' enctype='multipart/form-data'>"); WriteLine(" <br /> <img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> method: <code><a href='?WebMethod=06000048'>Hello</a></code><input type='submit' value='Invoke' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>data</code> = <input type='text' name='_06000048_data' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>foo</code> = <input type='text' name='_06000048_foo' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' /> parameter: <code>result</code></form>"); WriteLine("<hr />"); WriteLine("<form target='_blank' action='?WebMethod=06000048' method='POST' enctype='multipart/form-data'>"); WriteLine(" <input type='file' name='pic' size='40' accept='image/*' />"); WriteLine(" <input type='file' name='foo' />"); WriteLine(" <br /> <img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> method: <code><a href='?WebMethod=06000048'>Hello</a></code><input type='submit' value='Invoke' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>data</code> = <input type='text' name='_06000048_data' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>foo</code> = <input type='text' name='_06000048_foo' value='' /><br />"); WriteLine(" <img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' /> parameter: <code>result</code></form>"); WriteLine("</body>"); WriteLine("</html>"); #endregion InternalStream.Flush(); InternalStream.Close(); #endregion } }; var t = new Thread( delegate() { Console_WriteLine(ipa + ":" + port); var r = new TcpListener(ipa, port); //try //{ r.Start(); while (true) { //log("AcceptTcpClient"); var c = r.AcceptTcpClient(); //log("AcceptTcpClient done, GetStream"); var s = c.GetStream(); //log("AcceptTcpClient done, GetStream done"); //AtConnection(s); new Thread( delegate() { //log("before AtConnection"); AtConnection(s); } ) { IsBackground = true, }.Start(); } //} //catch //{ // log("AcceptTcpClient error!"); // throw; //} } ) { IsBackground = true, }; return t; }
public static Thread CreateServer(IPAddress ipa, int port, Action<string> Console_WriteLine) { var random = new System.Random(); // Error 312 (net::ERR_UNSAFE_PORT): Unknown error. if (port < 1024) port = random.Next(1024, 32000); var cid = 0; NetworkStreamAction AtConnection = s => { var id = cid++; Console_WriteLine("#" + cid); //log("AtConnection"); var r = new SmartStreamReader(s); var HTTP_METHOD_PATH_QUERY = r.ReadLine(); Console_WriteLine("#" + cid + HTTP_METHOD_PATH_QUERY); var HTTP_METHOD = HTTP_METHOD_PATH_QUERY.TakeUntilOrEmpty(" "); if (HTTP_METHOD != "POST") if (HTTP_METHOD != "GET") { var m = new MemoryStream(); Action<string> WriteLineASCII = (string e) => { var x = Encoding.ASCII.GetBytes(e + "\r\n"); m.Write(x, 0, x.Length); }; Console_WriteLine("#" + cid + " 500"); WriteLineASCII("HTTP/1.1 500 OK"); WriteLineASCII("Connection: close"); var oa = m.ToArray(); s.Write(oa, 0, oa.Length); s.Flush(); s.Close(); return; } var HTTP_PATH_QUERY = HTTP_METHOD_PATH_QUERY.SkipUntilOrEmpty(" ").TakeUntilLastOrEmpty(" "); var HTTP_PATH = HTTP_PATH_QUERY.TakeUntilIfAny("?"); var HTTP_QUERY = HTTP_PATH_QUERY.SkipUntilOrEmpty("?"); var HTTP_HEADERS = new List<string>(); var br = r.ReadLine(); while (!string.IsNullOrEmpty(br)) { HTTP_HEADERS.Add(br); br = r.ReadLine(); } var data = r.ReadToMemoryStream(); //log("ReadLine done"); { var m = new MemoryStream(); Action<string> WriteLineASCII = (string e) => { var x = Encoding.ASCII.GetBytes(e + "\r\n"); m.Write(x, 0, x.Length); }; Console_WriteLine("#" + cid + " 200"); WriteLineASCII("HTTP/1.1 200 OK"); WriteLineASCII("Content-Type: text/html; charset=utf-8"); //WriteLineASCII("Content-Length: " + data.Length); WriteLineASCII("Connection: close"); WriteLineASCII(""); WriteLineASCII(""); WriteLineASCII("<html>"); WriteLineASCII("<body>"); //WriteLineASCII("<pre style='color: blue;'>" + new { HTTP_METHOD, HTTP_PATH, HTTP_QUERY, data = data.Length } + "</pre>"); WriteLineASCII("<code style='color: green;'>HTTP_METHOD: " + HTTP_METHOD + "</code><br />"); WriteLineASCII("<code style='color: green;'>HTTP_PATH: " + HTTP_PATH + "</code><br />"); WriteLineASCII("<code style='color: green;'>HTTP_QUERY: " + HTTP_QUERY + "</code><br />"); WriteLineASCII("<code style='color: green;'>data: " + data.Length + "</code><br />"); WriteLineASCII("<code style='color: green;'>data: 0x" + data.Length.ToString("x8") + "</code><br />"); var boundary = ""; foreach (var item in HTTP_HEADERS.ToArray()) { var HeaderKey = item.TakeUntilOrEmpty(":"); var HeaderValue = item.SkipUntilIfAny(":"); // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 // http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html if (HeaderKey == "Content-Type") boundary = HeaderValue.SkipUntilOrEmpty("multipart/form-data; boundary="); WriteLineASCII("<code style='color: gray;'>" + HeaderKey + "</code>:"); WriteLineASCII("<code style='color: green;'>" + HeaderValue + "</code><br />"); } WriteLineASCII("<hr />"); WriteLineASCII("<pre>" + boundary + "</pre>"); WriteLineASCII("<hr />"); WriteLineASCII("<h1 style='color: red;'>Hello world</h2><h3>jsc</h3>"); WriteLineASCII("<pre>" + HTTP_METHOD_PATH_QUERY + "</pre>"); if (string.IsNullOrEmpty(boundary)) WriteLineASCII("<pre>" + WriteHexDump(data.ToBytes()) + "</pre>"); if (!string.IsNullOrEmpty(boundary)) { boundary = "--" + boundary; var bytes = data.ToBytes(); var boundarybytes = Encoding.ASCII.GetBytes(boundary); var boundaries = new List<Int32Box>(); for (int i = 0; i < bytes.Length - boundarybytes.Length; i++) { var AtBoundary = false; // is i at boundary? for (int j = 0; j < boundarybytes.Length; j++) { if (bytes[i + j] != boundarybytes[j]) { AtBoundary = false; break; } AtBoundary = true; } if (AtBoundary) { boundaries.Add(new Int32Box { value = i }); } } var boundaries_a = boundaries.ToArray(); for (int i = 0; i < boundaries_a.Length - 1; i++) { var start = boundaries_a[i].value + boundarybytes.Length + 2; var end = boundaries_a[i + 1].value; var chunk = new byte[end - start]; Array.Copy(bytes, start, chunk, 0, chunk.Length); WriteLineASCII("<hr />"); WriteLineASCII("<pre>" + WriteHexDump(chunk) + "</pre>"); } } WriteLineASCII("<hr />"); WriteLineASCII("<form target='_blank' action='?WebMethod=06000048' method='POST'><br /> <img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> method: <code><a href='?WebMethod=06000048'>Hello</a></code><input type='submit' value='Invoke' /><br /> <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>data</code> = <input type='text' name='_06000048_data' value='' /><br /> <img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' /> parameter: <code>result</code></form>"); WriteLineASCII("<form target='_blank' action='?WebMethod=06000048' method='POST' enctype='multipart/form-data'>"); WriteLineASCII(" <input type='file' name='pic' size='40' accept='image/*' />"); WriteLineASCII(" <input type='file' name='foo' />"); WriteLineASCII(" <br /> <img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> method: <code><a href='?WebMethod=06000048'>Hello</a></code><input type='submit' value='Invoke' /><br /> <img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> parameter: <code>data</code> = <input type='text' name='_06000048_data' value='' /><br /> <img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' /> parameter: <code>result</code></form>"); WriteLineASCII("</body>"); WriteLineASCII("</body>"); WriteLineASCII("</html>"); var oa = m.ToArray(); s.Write(oa, 0, oa.Length); s.Flush(); s.Close(); } }; var t = new Thread( delegate() { Console_WriteLine(ipa + ":" + port); var r = new TcpListener(ipa, port); //try //{ r.Start(); while (true) { //log("AcceptTcpClient"); var c = r.AcceptTcpClient(); //log("AcceptTcpClient done, GetStream"); var s = c.GetStream(); //log("AcceptTcpClient done, GetStream done"); //AtConnection(s); new Thread( delegate() { //log("before AtConnection"); AtConnection(s); } ) { IsBackground = true, }.Start(); } //} //catch //{ // log("AcceptTcpClient error!"); // throw; //} } ) { IsBackground = true, }; return t; }
static HTTPHeadersWithXElement[] InputStreamToXElements(string boundary, Stream InputStream) { //Console.WriteLine("enter InputStreamToXElements " + new { InputStream, InputStream.Position }); Console.WriteLine("enter InputStreamToXElements " + new { InputStream }); var a = new List <HTTPHeadersWithXElement> { }; var rSmartStreamReader = new ScriptCoreLib.Shared.IO.SmartStreamReader(InputStream); //var dump = rSmartStreamReader.ReadToEnd(); //Console.WriteLine(new { dump }); //return a.ToArray(); //MultipartReader var header0 = rSmartStreamReader.ReadLine(); while (header0 == "--" + boundary) { // opening multipart.. header0 = ""; var header2 = rSmartStreamReader.ReadLine(); var ContentType = header2.SkipUntilOrEmpty("Content-Type:"); var hlist = new List <string> { }; var headers = true; while (headers) { var header3 = rSmartStreamReader.ReadLine(); headers = !string.IsNullOrEmpty(header3); if (headers) { hlist.Add(header3); } } { // read data // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 // X:\jsc.svn\examples\rewrite\TestReadToBoundary\TestReadToBoundary\Program.cs var data = rSmartStreamReader.ReadToBoundary("--" + boundary); var xstring = Encoding.UTF8.GetString(data.ToArray()); var x = XElement.Parse(xstring); a.Add(new HTTPHeadersWithXElement { Headers = hlist.ToArray(), Content = x }); var header4 = rSmartStreamReader.ReadLine(); header0 = header4; // which is it, the end or is there more? //Console.WriteLine("#" + cid + " " + new { header4 }); //I/System.Console( 6761): #5 { Length = 256 } //I/System.Console( 6761): #5 { header4 = ------WebKitFormBoundaryrn6MyQlGvhETZkjw-- } // the end? } } return(a.ToArray()); }