예제 #1
0
        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();
        }
        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();
        }
예제 #3
0
        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();
        }
예제 #4
0
        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();
        }
예제 #5
0
        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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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("&nbsp;&nbsp;&nbsp;&nbsp;<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;
        }
예제 #7
0
        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 /> &nbsp;&nbsp;&nbsp;&nbsp;<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 /> &nbsp;&nbsp;&nbsp;&nbsp;<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 /> &nbsp;&nbsp;&nbsp;&nbsp;<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 /> &nbsp;&nbsp;&nbsp;&nbsp;<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;
        }
예제 #8
0
        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());
        }