private static void WriteDiagnosticsResults(StringAction Write, InternalWebMethodInfo WebMethod) { Write("<blockquote>"); if (WebMethod.Results == null) { Write("<h2>No results from " + WebMethod.MethodName + "</h2>"); } else { Write("<h2>" + WebMethod.Results.Length + " results from " + WebMethod.MethodName + "</h2>"); Write("<blockquote>"); foreach (var item in WebMethod.Results) { WriteWebMethod(Write, item, Parameter => { if (Parameter == null) { return; } Write(" = '<code style='color: red'>" + escapeXML(Parameter.Value) + "</code>'"); } ); } Write("</blockquote>"); Write("<br />"); } Write("</blockquote>"); }
public static void WriteWebMethodForm(StringAction Write, InternalWebMethodInfo WebMethod) { Write("<form target='_blank' action='" + WebMethod.ToQueryString() + "' method='POST'>"); WriteWebMethod(Write, WebMethod, Parameter => { if (Parameter == null) { Write("<input type='submit' value='Invoke' />"); return; } var key = "_" + WebMethod.MetadataToken + "_" + Parameter.Name; // C# named parameters style Write(": "); var value = ""; Parameter.Value.With(x => value = x.Replace("'", "'")); Write("<input type='text' name='" + key + "' value='" + value + "' />"); } ); Write("</form>"); }
public static string GetParameterValue(InternalWebMethodInfo that, string name) { var r = default(string); Console.WriteLine("GetParameterValue: " + new { name, that.Parameters.Length }); // do we support null parameters? var value = default(string); //Console.WriteLine("LoadParameters: name: " + Parameter.Name); var key = "_" + that.MetadataToken + "_" + name; Console.WriteLine("GetParameterValue: " + new { key }); var value_Form = that.InternalContext.Request.Form[key]; if (null != value_Form) { value = value_Form; } Console.WriteLine("GetParameterValue: " + new { value }); //Console.WriteLine("LoadParameters: value: " + value); //Parameter.Value = value.FromXMLString(); r = value.FromXMLString(); Console.WriteLine("GetParameterValue: " + new { r }); return(r); }
public static void ApplyTo(InternalWebMethodWorker that, InternalWebMethodInfo target) { //Console.WriteLine("InternalWebMethodWorker"); // WriteXDocument Results null target.Results = that.ToArray(); }
public static void SetResult(string TaskResult, InternalWebMethodInfo that) { // called by // x:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Commands\Rewrite\RewriteToJavaScriptDocument.WebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2013/201309-1/20130924-async-web-service that.TaskResult = TaskResult; SetResult(that); }
public static void WriteWebMethod(StringAction Write, InternalWebMethodInfo item, InternalWebMethodParameterInfoAction more) { Write("<br /> "); if (string.IsNullOrEmpty(item.MetadataToken)) { // when does this happen? Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' />"); Write(" <code>" + item.MethodName + "</code>"); } else { Write("<img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> <code><a style='text-decoration: none;' href='" + item.ToQueryString() + "'>" + item.MethodName + "</a></code>"); } if (more != null) { more(null); } if (item.Parameters != null) { foreach (var p in item.Parameters) { Write("<br /> "); if (p.IsDelegate) { Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' />"); Write(" <code>" + p.Name + "</code>"); } else { Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' />"); Write(" <code>" + p.Name + "</code>"); if (more != null) { more(p); } } } } }
// called by? WriteInternalFields ? public static void AddField(InternalWebMethodInfo that, string FieldName, string FieldValue) { if (that.InternalFields == null) that.InternalFields = new Dictionary<string, string>(); //> 000a 0x01d5 bytes //time to serialize fields into cookie { Length = 1 } //AddField { FieldName = field_Foo, FieldValue = 7 } // tested by // x:\jsc.svn\examples\javascript\test\testienumerableforservice\testienumerableforservice\applicationwebservice.cs // X:\jsc.svn\examples\javascript\Test\TestWebServiceTaskFields\TestWebServiceTaskFields\ApplicationWebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2013/201310/20131011-fields //Console.WriteLine("InternalWebMethodInfo.AddField " + new { FieldName, FieldValue }); that.InternalFields[FieldName] = FieldValue; }
// called by? public static void AddField(InternalWebMethodInfo that, string FieldName, string FieldValue) { if (that.InternalFields == null) { that.InternalFields = new Dictionary <string, string>(); } //> 000a 0x01d5 bytes //time to serialize fields into cookie { Length = 1 } //AddField { FieldName = field_Foo, FieldValue = 7 } // tested by // x:\jsc.svn\examples\javascript\test\testienumerableforservice\testienumerableforservice\applicationwebservice.cs // X:\jsc.svn\examples\javascript\Test\TestWebServiceTaskFields\TestWebServiceTaskFields\ApplicationWebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2013/201310/20131011-fields //Console.WriteLine("InternalWebMethodInfo.AddField " + new { FieldName, FieldValue }); that.InternalFields[FieldName] = FieldValue; }
public static void AddParameter(InternalWebMethodInfo that, string Name, string Value) { //Console.WriteLine("InternalWebMethodInfo.AddParameter " + new { Name, Value }); if (that.InternalParameters == null) { that.InternalParameters = new ArrayList(); } var n = new InternalWebMethodParameterInfo { Name = Name, Value = Value }; that.InternalParameters.Add(n); that.Parameters = (InternalWebMethodParameterInfo[])that.InternalParameters.ToArray( typeof(InternalWebMethodParameterInfo) ); }
// called by? public static string GetParameterValue(InternalWebMethodInfo that, string name) { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201511/20151123/uploadvaluestaskasync // Z:\jsc.svn\examples\javascript\ubuntu\UbuntuSSLWebApplication\UbuntuSSLWebApplication\ApplicationWebService.cs var r = default(string); //Console.WriteLine("InternalWebMethodInfo GetParameterValue: " + new { name, that.Parameters.Length }); // do we support null parameters? var value = default(string); //Console.WriteLine("LoadParameters: name: " + Parameter.Name); var key = "_" + that.MetadataToken + "_" + name; //Console.WriteLine("GetParameterValue: " + new { key }); var value_Form = that.InternalContext.Request.Form[key]; if (null != value_Form) { value = value_Form; } //Console.WriteLine("GetParameterValue: " + new { value }); //Console.WriteLine("LoadParameters: value: " + value); //Parameter.Value = value.FromXMLString(); r = value.FromXMLString(); //Console.WriteLine("GetParameterValue: " + new { r }); return(r); }
public static void InternalApplication_BeginRequest(InternalGlobal g) { // is it ROSLYN friendly? no? // need to compile it by 2012? var BeginRequestStopwatch = Stopwatch.StartNew(); var that = g.InternalApplication; var Context = that.Context; var Path = Context.Request.Path; #region WriteFile var CurrentFile = g.ToCurrentFile(); if (CurrentFile != null) { // http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching/ //// http://www.mombu.com/programming/xbase/t-outputcache-directive-vs-responsecachesetcacheability-624773.html g.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); g.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15)); //g.EndRequest += // (_s, _e) => // { //Console.WriteLine("cache " + CurrentFile.Name); // // http://forums.asp.net/t/1123505.aspx // HttpApplication application = (HttpApplication)_s; // HttpContext context = application.Context; //g.Response.ExpiresAbsolute = DateTime.Now.AddDays(1); //context.Response.AddHeader("pragma", "no-cache"); //g.Response.AddHeader("cache-control", "public"); g.Response.AddHeader("Content-Length", "" + CurrentFile.Length); var ContentType = "application/octet-stream"; var n = CurrentFile.Name; // http://www.webmaster-toolkit.com/mime-types.shtml if (n.EndsWith(".gif")) { ContentType = "image/gif"; } else if (n.EndsWith(".htm")) { ContentType = "text/html"; } else if (n.EndsWith(".png")) { ContentType = "image/png"; } else if (n.EndsWith(".jpg")) { ContentType = "image/jpg"; } else if (n.EndsWith(".svg")) { ContentType = "image/svg+xml"; } else if (n.EndsWith(".js")) { ContentType = "application/x-javascript"; } else if (n.EndsWith(".mp3")) { ContentType = "audio/mpeg3"; } else if (n.EndsWith(".wav")) { ContentType = "audio/wav"; } else if (n.EndsWith(".mid")) { ContentType = "audio/midi"; } else if (n.EndsWith(".css")) { ContentType = "text/css"; } that.Response.ContentType = ContentType; // to root Context.Response.WriteFile("/" + CurrentFile.Name); that.CompleteRequest(); //context.Response.CacheControl = "no-cache"; //}; // fake lag //if (that.Request.Path.EndsWith(".js")) // System.Threading.Thread.Sleep(1000); return; } #endregion StringAction Write = e => { // could we take the method pointer implicitly? Context.Response.Write(e); }; StringAction WriteLine = e => { // could we take the method pointer implicitly? Write(e + Environment.NewLine); }; var WebMethods = g.GetWebMethods(); // X:\jsc.svn\examples\javascript\test\TestBaseFieldSync\TestBaseFieldSync\ApplicationWebService.cs #region WriteInternalFields InternalFields -> AppendCookie Action <InternalWebMethodInfo> WriteInternalFields = x => { // does 304 check also look at // fields? // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201403/20140323 // X:\jsc.svn\examples\javascript\forms\FormsDataBindingForEnabled\FormsDataBindingForEnabled\ApplicationWebService.cs if (x.InternalFields == null) { return; } // typename instead? var c = new HttpCookie("InternalFields"); // X:\jsc.svn\examples\javascript\Test\TestWebServiceTaskFields\TestWebServiceTaskFields\ApplicationWebService.cs // X:\jsc.svn\examples\javascript\test\TestNullObjectFromWebService\TestNullObjectFromWebService\ApplicationWebService.cs foreach (string InternalFieldName in x.InternalFields.Keys.ToArray()) { var value = x.InternalFields[InternalFieldName]; Console.WriteLine(new { InternalFieldName, value }); if (value != null) { // for /xml post if (Context.Request.HttpMethod == "POST") { // GetParameterValue: { key = _0600000e_field_elapsed } that.Context.Response.AddHeader( ".field " + InternalFieldName, value ); } else { // for / get c[InternalFieldName] = value; } } } // Set-Cookie:InternalFields=field_Foo=7; path=/ //that.Context.Response.AppendCookie(c); if (Context.Request.HttpMethod == "POST") { } else { that.Context.Response.SetCookie(c); } }; #endregion var IsComplete = false; #region handler = WebServiceHandler var handler = new WebServiceHandler { Context = that.Context, CompleteRequest = delegate { IsComplete = true; that.CompleteRequest(); }, Applications = g.GetScriptApplications(), // tested by // X:\jsc.svn\examples\javascript\synergy\webgl\EvilChopperByPer\EvilChopperByPer\ApplicationWebService.cs // X:\jsc.svn\examples\javascript\synergy\webgl\WebGLDoomByInt13h\WebGLDoomByInt13h\ApplicationWebService.cs GetFiles = g.GetFiles, #region Default Default = delegate { that.Response.ContentType = "text/html"; // todo: jsc: PHP workaround required var apps = g.GetScriptApplications(); var app = apps[0]; var Host = that.Context.Request.Headers["Host"].TakeUntilIfAny(":"); var CacheManifest = false; //var CacheManifest = true; // should disable that for android webview? //if (Host == that.Context.Request.UserHostAddress) // CacheManifest = false; //// webdev? //if ("127.0.0.1" == that.Context.Request.UserHostAddress) // CacheManifest = false; // X:\jsc.svn\examples\javascript\test\TestServiceWorkerAssetCache\TestServiceWorkerAssetCache\Application.cs app.WriteTo(Write, CacheManifest); IsComplete = true; that.CompleteRequest(); }, #endregion Diagnostics = delegate { that.Response.ContentType = "text/html"; WriteDiagnostics(g, Write, WebMethods); IsComplete = true; that.CompleteRequest(); }, Redirect = delegate { that.Response.Redirect("/#" + that.Request.Path); IsComplete = true; that.CompleteRequest(); } }; #endregion #region handler.WriteSource handler.WriteSource = app => { handler.Context.Response.ContentType = "text/javascript"; g.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); // are we not part of AppCache? g.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15)); //Console.WriteLine("IsConstructor WriteInternalFields"); var Constructor = new InternalWebMethodInfo { IsConstructor = true }; // Method not found: '?'. // Additional information: Attempt by method 'mscorlib.<02000005IEnumerable\+ConvertToString>.ConvertToString(System.Collections.Generic.IEnumerable`1<TestIEnumerableForService.foo>)' // to access method '<>f__AnonymousType6`1<System.__Canon>..ctor(System.__Canon)' failed. g.Invoke(Constructor); WriteInternalFields(Constructor); #region GetFiles var ff = g.GetFiles(); // jsc packages js files? not for long:P will switch to gzip at some point! var app_references = app.References.Select( // why wont Single work correctly? // are we embedding one file multiple times? item => ff.First(k => k.Name == item.AssemblyFile || k.Name == item.AssemblyFile + ".js") ).ToArray(); #endregion app_references.WithEachIndex( (app_ref, index) => { // will this work an all platforms? // need to test! g.Response.AddHeader("X-Reference-" + index, app_ref.Name + " " + app_ref.Length); } ); // tested by // X:\jsc.svn\examples\javascript\android\com.abstractatech.adminshell\com.abstractatech.adminshell\ApplicationWebService.cs #region DiagnosticsMakeItSlowAndAddSalt if (app.DiagnosticsMakeItSlowAndAddSalt) { Console.WriteLine("enter DiagnosticsMakeItSlowAndAddSalt"); handler.Context.Response.ContentType = "application/octet-stream"; #region composite var composite = new CompositeStream( app_references.Select( k => { return(new Func <Stream>( () => { Console.WriteLine("composite: " + new { k.Name }); return (Stream)File.OpenRead(k.Name); } )); } ) ); #endregion Console.WriteLine("encrypting... "); //var x = new MemoryStream(); var buffer = new byte[1024 * 40]; //var count = composite.GetBytes(buffer).Count(); #region count var count = 0; foreach (var y in composite.GetBytes(buffer)) { count += y; Console.WriteLine(new { count }); } #endregion // encrypting... { count = 58 } Console.WriteLine("encrypting by splitting bytes... " + new { count }); var time = new Stopwatch(); time.Start(); var bytesleft = count; g.Response.AddHeader("Content-Length", "" + (count * 2)); g.Response.AddHeader("X-DiagnosticsMakeItSlowAndAddSalt", "ok"); // lets write DiagnosticsMakeItSlowAndAddSalt //enter DiagnosticsMakeItSlowAndAddSalt //encrypting... //enter GetBytes //exit GetBytes //encrypting... { count = 2282136 } //enter GetBytes // ? // needs to work in .net then in android! var xbuffer = new byte[buffer.Length * 2]; foreach (var length in composite.GetBytes(buffer)) { Console.WriteLine("before flush of " + new { length }); for (int i = 0; i < length; i++) { var item = buffer[i]; var lo = (byte)(item & 0xf); var hi = (byte)((item & 0xf0) >> 4); xbuffer[i * 2 + 0] = lo; xbuffer[i * 2 + 1] = hi; //h.Context.Response.OutputStream.WriteByte(lo); //h.Context.Response.OutputStream.WriteByte(hi); bytesleft--; } handler.Context.Response.OutputStream.Write(xbuffer, 0, length * 2); handler.Context.Response.Flush(); var timetarget = 8000 - time.ElapsedMilliseconds; // Caused by: java.lang.ArithmeticException: divide by zero //at ScriptCoreLib.Ultra.WebService.InternalGlobalExtensions___c__DisplayClasse._InternalApplication_BeginRequest_b__7(InternalGlobalExtensions___c__DisplayClasse.java:235) //var ms = (int)(timetarget / bytesleft); Console.WriteLine("." + new { bytesleft //, ms }); //if (timetarget > 0) //{ // Thread.Sleep(ms); //} } Console.WriteLine("will upload done " + new { time.ElapsedMilliseconds }); return; } #endregion #region GZipAssemblyFile // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2013/201301/20130103 var AcceptEncoding = handler.Context.Request.Headers["Accept-Encoding"]; if (!string.IsNullOrEmpty(AcceptEncoding)) { if (AcceptEncoding.Contains("gzip")) { g.Response.AddHeader("Content-Encoding", "gzip"); g.Response.WriteFile("/" + app.GZipAssemblyFile); handler.CompleteRequest(); return; } } #endregion g.Response.AddHeader("X-Comment", "gzip was disabled"); #region the old way var app_size = app_references.Sum(k => k.Length); // Accept-Encoding:gzip,deflate,sdch g.Response.AddHeader("Content-Length", "" + app_size); //g.Response.AddHeader("X-GZipAssemblyFile", "" + app.GZipAssemblyFile); foreach (var item in app_references) { // asp.net needs absolute paths handler.Context.Response.WriteFile("/" + item.Name); } #endregion handler.CompleteRequest(); }; #endregion #region WebMethodMetadataToken if (Context.Request.HttpMethod == "POST") { // X:\jsc.svn\core\ScriptCoreLib\JavaScript\BCLImplementation\System\Net\WebClient.cs // who sets WebMethodMetadataToken ? // X:\jsc.svn\core\ScriptCoreLib.Ultra\ScriptCoreLib.Ultra\JavaScript\Remoting\InternalWebMethodRequest.cs // C:\Users\Arvo\AppData\Local\Temp\6796$ScriptCoreLib.Ultra.dll$v4.0.30319$NoDynamic\ScriptCoreLib.JavaScript.Remoting.InternalWebMethodRequest.cs // X:\jsc.svn\examples\javascript\css\Test\TestLongWebMethod\TestLongWebMethod\Application.cs // tested by // X:\jsc.svn\examples\javascript\Test\TestWebMethodIPAddress\TestWebMethodIPAddress\ApplicationWebService.cs // X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Library\Templates\JavaScript\InternalWebMethodRequest.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140110-xml //var WebMethodMetadataToken = Context.Request.QueryString[InternalWebMethodInfo.QueryKey]; var WebMethodMetadataToken = Context.Request.Form["WebMethodMetadataToken"]; //var value_Form = that.InternalContext.Request.Form[key]; handler.WebMethod = InternalWebMethodInfo.First( WebMethods, WebMethodMetadataToken ); } #endregion g.Serve(handler); if (IsComplete) { return; } #region POST if (Context.Request.HttpMethod == "POST") { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140101 //Console.WriteLine("about to load params for " + new { handler.WebMethod }); if (handler.WebMethod == null) { // let user defined handler handle it.. } else { // is it also supposed to load the fields? handler.WebMethod.LoadParameters(that.Context); Console.WriteLine("enter invoke " + new { handler.WebMethod }); //about to load params for { WebMethod = { IsConstructor = false, MetadataToken = 06000002, Name = Insert, TypeFullName = WebCamAvatarsExperiment.ApplicationWebService, Parameters = 1 } } //about to invoke { WebMethod = { IsConstructor = false, MetadataToken = 06000002, Name = Insert, TypeFullName = WebCamAvatarsExperiment.ApplicationWebService, Parameters = 1 } } // when can we invoke the webmethod and not be at /xml? //try //{ // where is the code gen? // X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Commands\Rewrite\RewriteToJavaScriptDocument.WebService.cs // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140107-dev/test var WebMethodStopwatch = Stopwatch.StartNew(); // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201404/20140405/task // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201405/20140517 // defined by X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Commands\Rewrite\RewriteToJavaScriptDocument.WebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201408/20140811 // public abstract void Invoke(InternalWebMethodInfo e); g.Invoke(handler.WebMethod); // BeginRequestStopwatch //that.Response.AddHeader("X-BeginRequestStopwatch", "" + BeginRequestStopwatch.ElapsedMilliseconds); // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140110-stats that.Response.AddHeader("X-ElapsedMilliseconds", "" + WebMethodStopwatch.ElapsedMilliseconds); if (handler.WebMethod.AtElapsedMilliseconds != null) { handler.WebMethod.AtElapsedMilliseconds(WebMethodStopwatch.ElapsedMilliseconds); } //that.Response.AddHeader("X-WebMethodStopwatch", "" + SQLiteConnectionStringBuilderExtensions.ElapsedMilliseconds); //} //catch (Exception err) //{ // Console.WriteLine("boom! " + new { err }); //} //Console.WriteLine("exit invoke " + new { handler.WebMethod }); //if (that.Context.Request.Path == "/xml") if (that.Context.Request.Path != "/jsc") { // the diagnostics needs more attention down the road. WriteInternalFields(handler.WebMethod); // no yields // why is handler.WebMethod.Results null?? #region 204 if (handler.WebMethod.Results.Length == 0) { if (handler.WebMethod.TaskResult == null) { // or should we send binary zip for webworker? // NoContent g.Context.Response.StatusCode = 204; g.Context.Response.Flush(); that.CompleteRequest(); return; } } #endregion WriteXDocument(g, Write, handler.WebMethod); that.CompleteRequest(); return; } that.Response.ContentType = "text/html"; WriteDiagnosticsResults(Write, handler.WebMethod); WriteDiagnostics(g, Write, WebMethods); that.CompleteRequest(); return; } } #endregion if (IsComplete) { return; } #region /favicon.ico if (Path == "/favicon.ico") { Context.Response.WriteFile("assets/ScriptCoreLib/jsc.ico"); that.CompleteRequest(); return; } #endregion #region /robots.txt if (Path == "/robots.txt") { Context.Response.StatusCode = 404; that.CompleteRequest(); return; } #endregion #region /crossdomain.xml if (Path == "/crossdomain.xml") { // X:\jsc.svn\core\ScriptCoreLib.Ultra.Library\ScriptCoreLib.Ultra.Library\Ultra\WebService\InternalGlobalExtensions.InternalApplication_BeginRequest.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140109-webclient // http://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html // X:\jsc.smokescreen.svn\market\appengine\xmoneseAIR\xmoneseAIR\ApplicationCanvas.cs Context.Response.Write(@"<?xml version='1.0'?> <!-- http://www.osmf.org/crossdomain.xml --> <!DOCTYPE cross-domain-policy SYSTEM 'http://www.adobe.com/xml/dtds/cross-domain-policy.dtd'> <cross-domain-policy> <allow-access-from domain='*' /> <site-control permitted-cross-domain-policies='all'/> </cross-domain-policy>"); that.CompleteRequest(); return; } #endregion // cache manifest will not be needed // after ServiceWorker becomes useful // 20141230 // X:\jsc.svn\examples\javascript\test\TestServiceWorkerAssetCache\TestServiceWorkerAssetCache\Application.cs #region WriteCacheManifest if (Path == "/" + WebApplicationCacheManifest.ManifestName) { // <html manifest="cache-manifest"> //WriteCacheManifest(g, that, WriteLine); Context.Response.StatusCode = 404; that.CompleteRequest(); return; } #endregion if (that.Request.Path == "/jsc") { handler.Diagnostics(); return; } #region /view-source if (that.Request.Path == "/view-source") { var app = handler.Applications[0]; // can we just invoke a ctor? // and have the fields returne? handler.WriteSource(app); return; } #endregion if (handler.IsDefaultPath) { handler.Default(); return; } if (Context.Request.HttpMethod == "POST") { // we dont know what to do with this POST.. Context.Response.StatusCode = 404; that.CompleteRequest(); return; } // we could invoke web service handler now? handler.Redirect(); //h.Diagnostics(); }
// https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/20151102 // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201510/20151022/httprequest public static void InternalApplication_BeginRequest(InternalGlobal g) { //Console.WriteLine("InternalApplication_BeginRequest " + new { Environment.StackTrace }); // is it ROSLYN friendly? no? // need to compile it by 2012? //AppDomain.CurrentDomain.UnhandledException += // (s, e) => // { // }; var BeginRequestStopwatch = Stopwatch.StartNew(); var that = g.InternalApplication; var Context = that.Context; var Path = Context.Request.Path; #region WriteFile var CurrentFile = g.ToCurrentFile(); if (CurrentFile != null) { // http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching/ //// http://www.mombu.com/programming/xbase/t-outputcache-directive-vs-responsecachesetcacheability-624773.html g.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); g.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15)); //g.EndRequest += // (_s, _e) => // { //Console.WriteLine("cache " + CurrentFile.Name); // // http://forums.asp.net/t/1123505.aspx // HttpApplication application = (HttpApplication)_s; // HttpContext context = application.Context; //g.Response.ExpiresAbsolute = DateTime.Now.AddDays(1); //context.Response.AddHeader("pragma", "no-cache"); //g.Response.AddHeader("cache-control", "public"); g.Response.AddHeader("Content-Length", "" + CurrentFile.Length); var ContentType = "application/octet-stream"; var n = CurrentFile.Name; // http://www.webmaster-toolkit.com/mime-types.shtml if (n.EndsWith(".gif")) ContentType = "image/gif"; else if (n.EndsWith(".htm")) ContentType = "text/html"; else if (n.EndsWith(".png")) ContentType = "image/png"; else if (n.EndsWith(".jpg")) ContentType = "image/jpg"; else if (n.EndsWith(".svg")) ContentType = "image/svg+xml"; else if (n.EndsWith(".js")) ContentType = "application/x-javascript"; else if (n.EndsWith(".mp3")) ContentType = "audio/mpeg3"; else if (n.EndsWith(".wav")) ContentType = "audio/wav"; else if (n.EndsWith(".mid")) ContentType = "audio/midi"; else if (n.EndsWith(".css")) ContentType = "text/css"; that.Response.ContentType = ContentType; // to root Context.Response.WriteFile("/" + CurrentFile.Name); that.CompleteRequest(); //context.Response.CacheControl = "no-cache"; //}; // fake lag //if (that.Request.Path.EndsWith(".js")) // System.Threading.Thread.Sleep(1000); return; } #endregion StringAction Write = e => { // could we take the method pointer implicitly? Context.Response.Write(e); }; StringAction WriteLine = e => { // could we take the method pointer implicitly? Write(e + Environment.NewLine); }; var WebMethods = g.GetWebMethods(); // X:\jsc.svn\examples\javascript\test\TestBaseFieldSync\TestBaseFieldSync\ApplicationWebService.cs #region WriteInternalFields InternalFields -> AppendCookie Action<InternalWebMethodInfo> WriteInternalFields = x => { // Z:\jsc.svn\examples\javascript\ubuntu\UbuntuSSLWebApplication\UbuntuSSLWebApplication\ApplicationWebService.cs // does 304 check also look at // fields? // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201403/20140323 // X:\jsc.svn\examples\javascript\forms\FormsDataBindingForEnabled\FormsDataBindingForEnabled\ApplicationWebService.cs if (x.InternalFields == null) return; // typename instead? var c = new HttpCookie("InternalFields"); // X:\jsc.svn\examples\javascript\Test\TestWebServiceTaskFields\TestWebServiceTaskFields\ApplicationWebService.cs // X:\jsc.svn\examples\javascript\test\TestNullObjectFromWebService\TestNullObjectFromWebService\ApplicationWebService.cs foreach (string InternalFieldName in x.InternalFields.Keys.ToArray()) { var value = x.InternalFields[InternalFieldName]; //Console.WriteLine("WriteInternalFields " + new { InternalFieldName, value }); if (value != null) { // for /xml post if (Context.Request.HttpMethod == "POST") { // GetParameterValue: { key = _0600000e_field_elapsed } // if we write her. where are they read? // Z:\jsc.svn\examples\javascript\Test\TestFirefoxWebServiceField\ApplicationWebService.cs // firefox filters out spaces? that.Context.Response.AddHeader( ".field-" + InternalFieldName, value ); // .field-field_foo:<_02000013>%0d%0a <_04000021>Z3Vlc3Q=</_04000021>%0d%0a</_02000013> // Z:\jsc.svn\examples\javascript\Test\TestAfterInvokeResponseHeaders\ApplicationWebService.cs // 204 No Content ? } else { // for / get c[InternalFieldName] = value; } } } // Set-Cookie:InternalFields=field_Foo=7; path=/ //that.Context.Response.AppendCookie(c); if (Context.Request.HttpMethod == "POST") { } else { that.Context.Response.SetCookie(c); } }; #endregion var IsComplete = false; #region handler = WebServiceHandler var handler = new WebServiceHandler { ClientCertificate = g.ClientCertificate, ClientTrace = g.ClientTrace, Context = that.Context, CompleteRequest = delegate { IsComplete = true; that.CompleteRequest(); }, Applications = g.GetScriptApplications(), // tested by // X:\jsc.svn\examples\javascript\synergy\webgl\EvilChopperByPer\EvilChopperByPer\ApplicationWebService.cs // X:\jsc.svn\examples\javascript\synergy\webgl\WebGLDoomByInt13h\WebGLDoomByInt13h\ApplicationWebService.cs GetFiles = g.GetFiles, #region Default Default = delegate { that.Response.ContentType = "text/html"; //that.Response.AddHeader("Access-Control-Allow-Origin", "*"); // todo: jsc: PHP workaround required var apps = g.GetScriptApplications(); var app = apps[0]; var Host = that.Context.Request.Headers["Host"].TakeUntilIfAny(":"); var CacheManifest = false; //var CacheManifest = true; // should disable that for android webview? //if (Host == that.Context.Request.UserHostAddress) // CacheManifest = false; //// webdev? //if ("127.0.0.1" == that.Context.Request.UserHostAddress) // CacheManifest = false; // X:\jsc.svn\examples\javascript\test\TestServiceWorkerAssetCache\TestServiceWorkerAssetCache\Application.cs app.WriteTo(Write, CacheManifest); IsComplete = true; that.CompleteRequest(); }, #endregion Diagnostics = delegate { that.Response.ContentType = "text/html"; WriteDiagnostics(g, Write, WebMethods); IsComplete = true; that.CompleteRequest(); }, Redirect = delegate { that.Response.Redirect("/#" + that.Request.Path); IsComplete = true; that.CompleteRequest(); } }; #endregion #region handler.WriteSource handler.WriteSource = app => { handler.Context.Response.ContentType = "text/javascript"; g.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); // are we not part of AppCache? g.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15)); //Console.WriteLine("IsConstructor WriteInternalFields"); var Constructor = new InternalWebMethodInfo { IsConstructor = true }; // Method not found: '?'. // Additional information: Attempt by method 'mscorlib.<02000005IEnumerable\+ConvertToString>.ConvertToString(System.Collections.Generic.IEnumerable`1<TestIEnumerableForService.foo>)' // to access method '<>f__AnonymousType6`1<System.__Canon>..ctor(System.__Canon)' failed. g.Invoke(Constructor); WriteInternalFields(Constructor); #region GetFiles var ff = g.GetFiles(); // jsc packages js files? not for long:P will switch to gzip at some point! var app_references = app.References.Select( // why wont Single work correctly? // are we embedding one file multiple times? item => ff.First(k => k.Name == item.AssemblyFile || k.Name == item.AssemblyFile + ".js") ).ToArray(); #endregion app_references.WithEachIndex( (app_ref, index) => { // will this work an all platforms? // need to test! g.Response.AddHeader("X-Reference-" + index, app_ref.Name + " " + app_ref.Length); } ); // tested by // X:\jsc.svn\examples\javascript\android\com.abstractatech.adminshell\com.abstractatech.adminshell\ApplicationWebService.cs #region DiagnosticsMakeItSlowAndAddSalt if (app.DiagnosticsMakeItSlowAndAddSalt) { Console.WriteLine("enter DiagnosticsMakeItSlowAndAddSalt"); handler.Context.Response.ContentType = "application/octet-stream"; #region composite var composite = new CompositeStream( app_references.Select( k => { return new Func<Stream>( () => { Console.WriteLine("composite: " + new { k.Name }); return (Stream)File.OpenRead(k.Name); } ); } ) ); #endregion Console.WriteLine("encrypting... "); //var x = new MemoryStream(); var buffer = new byte[1024 * 40]; //var count = composite.GetBytes(buffer).Count(); #region count var count = 0; foreach (var y in composite.GetBytes(buffer)) { count += y; Console.WriteLine(new { count }); } #endregion // encrypting... { count = 58 } Console.WriteLine("encrypting by splitting bytes... " + new { count }); var time = new Stopwatch(); time.Start(); var bytesleft = count; g.Response.AddHeader("Content-Length", "" + (count * 2)); g.Response.AddHeader("X-DiagnosticsMakeItSlowAndAddSalt", "ok"); // lets write DiagnosticsMakeItSlowAndAddSalt //enter DiagnosticsMakeItSlowAndAddSalt //encrypting... //enter GetBytes //exit GetBytes //encrypting... { count = 2282136 } //enter GetBytes // ? // needs to work in .net then in android! var xbuffer = new byte[buffer.Length * 2]; foreach (var length in composite.GetBytes(buffer)) { Console.WriteLine("before flush of " + new { length }); for (int i = 0; i < length; i++) { var item = buffer[i]; var lo = (byte)(item & 0xf); var hi = (byte)((item & 0xf0) >> 4); xbuffer[i * 2 + 0] = lo; xbuffer[i * 2 + 1] = hi; //h.Context.Response.OutputStream.WriteByte(lo); //h.Context.Response.OutputStream.WriteByte(hi); bytesleft--; } handler.Context.Response.OutputStream.Write(xbuffer, 0, length * 2); handler.Context.Response.Flush(); var timetarget = 8000 - time.ElapsedMilliseconds; // Caused by: java.lang.ArithmeticException: divide by zero //at ScriptCoreLib.Ultra.WebService.InternalGlobalExtensions___c__DisplayClasse._InternalApplication_BeginRequest_b__7(InternalGlobalExtensions___c__DisplayClasse.java:235) //var ms = (int)(timetarget / bytesleft); Console.WriteLine("." + new { bytesleft //, ms }); //if (timetarget > 0) //{ // Thread.Sleep(ms); //} } Console.WriteLine("will upload done " + new { time.ElapsedMilliseconds }); return; } #endregion #region GZipAssemblyFile // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2013/201301/20130103 var AcceptEncoding = handler.Context.Request.Headers["Accept-Encoding"]; if (!string.IsNullOrEmpty(AcceptEncoding)) if (AcceptEncoding.Contains("gzip")) { g.Response.AddHeader("Content-Encoding", "gzip"); g.Response.WriteFile("/" + app.GZipAssemblyFile); handler.CompleteRequest(); return; } #endregion g.Response.AddHeader("X-Comment", "gzip was disabled"); #region the old way var app_size = app_references.Sum(k => k.Length); // Accept-Encoding:gzip,deflate,sdch g.Response.AddHeader("Content-Length", "" + app_size); //g.Response.AddHeader("X-GZipAssemblyFile", "" + app.GZipAssemblyFile); foreach (var item in app_references) { // asp.net needs absolute paths handler.Context.Response.WriteFile("/" + item.Name); } #endregion handler.CompleteRequest(); }; #endregion #region WebMethodMetadataToken if (Context.Request.HttpMethod == "POST") { var cWebMethodMetadataToken = Context.Request.Form.AllKeys.Contains("WebMethodMetadataToken"); //Console.WriteLine("POST is expected to include WebMethodMetadataToken " + new { cWebMethodMetadataToken }); // X:\jsc.svn\core\ScriptCoreLib\JavaScript\BCLImplementation\System\Net\WebClient.cs // who sets WebMethodMetadataToken ? // X:\jsc.svn\core\ScriptCoreLib.Ultra\ScriptCoreLib.Ultra\JavaScript\Remoting\InternalWebMethodRequest.cs // C:\Users\Arvo\AppData\Local\Temp\6796$ScriptCoreLib.Ultra.dll$v4.0.30319$NoDynamic\ScriptCoreLib.JavaScript.Remoting.InternalWebMethodRequest.cs // X:\jsc.svn\examples\javascript\css\Test\TestLongWebMethod\TestLongWebMethod\Application.cs // tested by // X:\jsc.svn\examples\javascript\Test\TestWebMethodIPAddress\TestWebMethodIPAddress\ApplicationWebService.cs // X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Library\Templates\JavaScript\InternalWebMethodRequest.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140110-xml //var WebMethodMetadataToken = Context.Request.QueryString[InternalWebMethodInfo.QueryKey]; if (cWebMethodMetadataToken) { var WebMethodMetadataToken = Context.Request.Form["WebMethodMetadataToken"]; //var value_Form = that.InternalContext.Request.Form[key]; // Z:\jsc.svn\examples\javascript\appengine\Test\TestUserHostAddress\ApplicationWebService.cs if (WebMethodMetadataToken != null) handler.WebMethod = InternalWebMethodInfo.First( WebMethods, WebMethodMetadataToken ); } } #endregion g.Serve(handler); if (IsComplete) return; #region POST if (Context.Request.HttpMethod == "POST") { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140101 //Console.WriteLine("about to load params for " + new { handler.WebMethod }); if (handler.WebMethod == null) { // let user defined handler handle it.. } else { // is it also supposed to load the fields? handler.WebMethod.LoadParameters(that.Context); //Console.WriteLine("enter invoke " + new { handler.WebMethod }); //about to load params for { WebMethod = { IsConstructor = false, MetadataToken = 06000002, Name = Insert, TypeFullName = WebCamAvatarsExperiment.ApplicationWebService, Parameters = 1 } } //about to invoke { WebMethod = { IsConstructor = false, MetadataToken = 06000002, Name = Insert, TypeFullName = WebCamAvatarsExperiment.ApplicationWebService, Parameters = 1 } } // when can we invoke the webmethod and not be at /xml? //try //{ // where is the code gen? // X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Commands\Rewrite\RewriteToJavaScriptDocument.WebService.cs // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140107-dev/test var WebMethodStopwatch = Stopwatch.StartNew(); // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201404/20140405/task // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201405/20140517 // defined by X:\jsc.internal.svn\compiler\jsc.meta\jsc.meta\Commands\Rewrite\RewriteToJavaScriptDocument.WebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201408/20140811 // public abstract void Invoke(InternalWebMethodInfo e); g.Invoke(handler.WebMethod); // BeginRequestStopwatch //that.Response.AddHeader("X-BeginRequestStopwatch", "" + BeginRequestStopwatch.ElapsedMilliseconds); // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/04-monese/2014/201401/20140110-stats that.Response.AddHeader("X-ElapsedMilliseconds", "" + WebMethodStopwatch.ElapsedMilliseconds); //that.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (handler.WebMethod.AtElapsedMilliseconds != null) handler.WebMethod.AtElapsedMilliseconds(WebMethodStopwatch.ElapsedMilliseconds); //that.Response.AddHeader("X-WebMethodStopwatch", "" + SQLiteConnectionStringBuilderExtensions.ElapsedMilliseconds); //} //catch (Exception err) //{ // Console.WriteLine("boom! " + new { err }); //} //Console.WriteLine("exit invoke " + new { handler.WebMethod }); //if (that.Context.Request.Path == "/xml") if (that.Context.Request.Path != "/jsc") { // the diagnostics needs more attention down the road. WriteInternalFields(handler.WebMethod); // no yields // why is handler.WebMethod.Results null?? #region 204 if (handler.WebMethod.Results.Length == 0) if (handler.WebMethod.TaskResult == null) { // or should we send binary zip for webworker? // NoContent g.Context.Response.StatusCode = 204; g.Context.Response.Flush(); that.CompleteRequest(); return; } #endregion WriteXDocument(g, Write, handler.WebMethod); that.CompleteRequest(); return; } that.Response.ContentType = "text/html"; WriteDiagnosticsResults(Write, handler.WebMethod); WriteDiagnostics(g, Write, WebMethods); that.CompleteRequest(); return; } } #endregion if (IsComplete) return; #region /favicon.ico if (Path == "/favicon.ico") { Context.Response.WriteFile("assets/ScriptCoreLib/jsc.ico"); that.CompleteRequest(); return; } #endregion #region /robots.txt if (Path == "/robots.txt") { Context.Response.StatusCode = 404; that.CompleteRequest(); return; } #endregion #region /crossdomain.xml if (Path == "/crossdomain.xml") { // X:\jsc.svn\core\ScriptCoreLib.Ultra.Library\ScriptCoreLib.Ultra.Library\Ultra\WebService\InternalGlobalExtensions.InternalApplication_BeginRequest.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140109-webclient // http://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html // X:\jsc.smokescreen.svn\market\appengine\xmoneseAIR\xmoneseAIR\ApplicationCanvas.cs Context.Response.Write(@"<?xml version='1.0'?> <!-- http://www.osmf.org/crossdomain.xml --> <!DOCTYPE cross-domain-policy SYSTEM 'http://www.adobe.com/xml/dtds/cross-domain-policy.dtd'> <cross-domain-policy> <allow-access-from domain='*' /> <site-control permitted-cross-domain-policies='all'/> </cross-domain-policy>"); that.CompleteRequest(); return; } #endregion // cache manifest will not be needed // after ServiceWorker becomes useful // 20141230 // X:\jsc.svn\examples\javascript\test\TestServiceWorkerAssetCache\TestServiceWorkerAssetCache\Application.cs #region WriteCacheManifest if (Path == "/" + WebApplicationCacheManifest.ManifestName) { // <html manifest="cache-manifest"> //WriteCacheManifest(g, that, WriteLine); Context.Response.StatusCode = 404; that.CompleteRequest(); return; } #endregion if (that.Request.Path == "/jsc") { handler.Diagnostics(); return; } #region /view-source if (that.Request.Path == "/view-source") { var app = handler.Applications[0]; // can we just invoke a ctor? // and have the fields returne? handler.WriteSource(app); return; } #endregion if (handler.IsDefaultPath) { handler.Default(); return; } if (Context.Request.HttpMethod == "POST") { // Z:\jsc.svn\examples\javascript\test\TestMultipartRelated\Application.cs // Z:\jsc.svn\examples\javascript\ubuntu\UbuntuDualSSLWebApplication\UbuntuDualSSLWebApplication\ApplicationWebService.cs Console.WriteLine("invalid invoke? IE is that you?"); // we dont know what to do with this POST.. Context.Response.StatusCode = 404; that.CompleteRequest(); return; } // we could invoke web service handler now? handler.Redirect(); //h.Diagnostics(); }
public static void WriteWebMethod(StringAction Write, InternalWebMethodInfo item, InternalWebMethodParameterInfoAction more) { Write("<br /> "); if (string.IsNullOrEmpty(item.MetadataToken)) { // when does this happen? Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' />"); Write(" <code>" + item.MethodName + "</code>"); } else { Write("<img src='http://i.msdn.microsoft.com/deshae98.pubmethod(en-us,VS.90).gif' /> <code><a style='text-decoration: none;' href='" + item.ToQueryString() + "'>" + item.MethodName + "</a></code>"); } if (more != null) more(null); if (item.Parameters != null) foreach (var p in item.Parameters) { Write("<br /> "); if (p.IsDelegate) { Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubdelegate(en-us,VS.90).gif' />"); Write(" <code>" + p.Name + "</code>"); } else { Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' />"); Write(" <code>" + p.Name + "</code>"); if (more != null) more(p); } } }
private static void WriteXDocument(InternalGlobal g, StringAction Write, InternalWebMethodInfo WebMethod) { var that = g.InternalApplication; var Context = that.Context; #region document var w = new StringBuilder(); w.Append("<document>"); if (WebMethod.Results == null) { //Console.WriteLine("WriteXDocument Results null"); } else { //Console.WriteLine("WriteXDocument Results " + new { WebMethod.Results.Length }); foreach (var item in WebMethod.Results) { w.Append("<" + item.MethodName + ">"); if (item.Parameters != null) { foreach (var p in item.Parameters) { if (p.Value == null) { // no parameter? // X:\jsc.svn\examples\javascript\WebMethodXElementTransferExperiment\WebMethodXElementTransferExperiment\ApplicationWebService.cs } else { w.Append("<" + p.Name + ">"); w.Append(escapeXML(p.Value)); w.Append("</" + p.Name + ">"); } } } w.Append("</" + item.MethodName + ">"); } } if (WebMethod.TaskComplete) { w.Append("<TaskComplete>"); if (WebMethod.TaskResult != null) { //Console.WriteLine(new { WebMethod.TaskResult }); w.Append("<TaskResult>"); w.Append(escapeXML(WebMethod.TaskResult)); w.Append("</TaskResult>"); } w.Append("</TaskComplete>"); } w.Append("</document>"); #endregion var ws = w.ToString(); var wsbytes = Encoding.UTF8.GetBytes(ws); // http://stackoverflow.com/questions/1999824/whats-the-shortest-pair-of-strings-that-causes-an-md5-collision var ETagbytes = wsbytes.ToMD5Bytes(); var newETag = ETagbytes.ToHexString(); // does the client already have a copy of the same response? // if so, send 304 ? // http://www.codeproject.com/Articles/23857/The-Performance-Woe-of-Binary-XML // are we ready for encrypted binary xml? // http://msdn.microsoft.com/en-us/library/cc219210.aspx // file:///C:/Users/Arvo/Downloads/03-002r9_Binary_Extensible_Markup_Language_BXML_Encoding_Specification.pdf // is this the beginning of a binary diff service? // allow http to https calls Context.Response.AddHeader("Access-Control-Allow-Origin", "*"); Context.Response.AddHeader("ETag", Convert.ToBase64String(ETagbytes)); var hasETag = Context.Request.Form.AllKeys.Contains("ETag"); if (hasETag) { var oldETag64 = Context.Request.Form["ETag"]; var oldETagbytes = Convert.FromBase64String(oldETag64); var clientETag = oldETagbytes.ToHexString(); //{ MethodName = Gravatar, MetadataToken = 06000001, oldETag = 1706b464adc232a9df3dd4539a206569 } //{ MethodName = Gravatar, MetadataToken = 06000001, ETag = 1706b464adc232a9df3dd4539a206569 } //Console.WriteLine(new { WebMethod.MethodName, WebMethod.MetadataToken, clientETag }); //I/System.Console( 3988): #17 POST /xml/Gravatar HTTP/1.1 //D/FastDormancy( 220): before ======= ENTER DORMANCY ======= //W/Threeg ( 918): Failed to read packet and byte counts from wifi interface //D/dalvikvm( 3988): GC_CONCURRENT freed 819K, 56% free 3157K/7111K, external 2013K/2108K, paused 2ms+2ms //I/System.Console( 3988): { MethodName = Gravatar, MetadataToken = 06000001, oldETag = d41d8cd98f00b204e9800998ecf8427e } //I/System.Console( 3988): { MethodName = Gravatar, MetadataToken = 06000001, ETag = 5a62b5d768653ae632ba4ff7e0b7a03c } //I/Web Console( 3988): %c0:312066ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:14691/view-source:37081 //I/Web Console( 3988): 0:312076ms { Name = Gravatar, MetadataToken = 06000001, ETag = d41d8cd98f00b204e9800998ecf8427e, ElapsedMilliseconds = 5 } at http://192.168.43.1:14691/view-source:37040 #if ETagTestedForIE11 if (clientETag == newETag) { //Console.WriteLine("Client already has the answer, sending 304"); // X:\jsc.svn\examples\javascript\forms\FormsDataBindingForEnabled\FormsDataBindingForEnabled\ApplicationControl.cs // what will web client do with 304? g.Context.Response.StatusCode = 304; g.Context.Response.Flush(); that.CompleteRequest(); return; } #endif } //Console.WriteLine(new { WebMethod.MethodName, WebMethod.MetadataToken, newETag, ws.Length }); //I/System.Console( 4563): #4 POST /xml/Gravatar HTTP/1.1 //I/System.Console( 4563): { MethodName = Gravatar, MetadataToken = 06000001, newETag = 1706b464adc232a9df3dd4539a206569, Length = 239 } //I/Web Console( 4563): %c0:22236ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:6686/view-source:37081 //I/Web Console( 4563): 0:22345ms { Name = Gravatar, MetadataToken = 06000001, ETag = d41d8cd98f00b204e9800998ecf8427e, ElapsedMilliseconds = 25 } at http://192.168.43.1:6686/view-source:37040 Context.Response.ContentType = "text/xml"; // https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control Write(ws); that.CompleteRequest(); }
public static void Add(InternalWebMethodWorker that, InternalWebMethodInfo value) { that.Results.Add(value); }
public abstract void Invoke(InternalWebMethodInfo e);
public static void SetResult(InternalWebMethodInfo that) { that.TaskComplete = true; }
public override void Invoke(InternalWebMethodInfo e) { }
// called by? public static string GetParameterValue(InternalWebMethodInfo that, string name) { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201511/20151123/uploadvaluestaskasync // Z:\jsc.svn\examples\javascript\ubuntu\UbuntuSSLWebApplication\UbuntuSSLWebApplication\ApplicationWebService.cs var r = default(string); //Console.WriteLine("InternalWebMethodInfo GetParameterValue: " + new { name, that.Parameters.Length }); // do we support null parameters? var value = default(string); //Console.WriteLine("LoadParameters: name: " + Parameter.Name); var key = "_" + that.MetadataToken + "_" + name; //Console.WriteLine("GetParameterValue: " + new { key }); var value_Form = that.InternalContext.Request.Form[key]; if (null != value_Form) { value = value_Form; } //Console.WriteLine("GetParameterValue: " + new { value }); //Console.WriteLine("LoadParameters: value: " + value); //Parameter.Value = value.FromXMLString(); r = value.FromXMLString(); //Console.WriteLine("GetParameterValue: " + new { r }); return r; }
public static InternalWebMethodInfo First(InternalWebMethodInfo[] e, string MetadataToken) { var k = default(InternalWebMethodInfo); if (!string.IsNullOrEmpty(MetadataToken)) foreach (var item in e) { if (item.MetadataToken == MetadataToken) { k = item; break; } } return k; }
public static void WriteDiagnostics(InternalGlobal g, StringAction Write, InternalWebMethodInfo[] WebMethods) { // should the diagnostics be a separate rich Browser Application? :) var Context = g.InternalApplication.Context; Write("<title>jsc-solutions.net</title>"); Write("<center>"); Write("<div style='background-color: black; color: white; padding: 2em;'>"); Write("« Rotate your device to left to <b>launch</b>"); Write("</div>"); Write("</center>"); Write("<br/><center><a href='/'>Launch Application</a></center><br/>"); //Write("<h1>" + Context.Request.Headers["Host"] + "</h1>"); foreach (var HeaderKey in Context.Request.Headers.AllKeys) { var HeaderValue = Context.Request.Headers[HeaderKey]; Write("<code style='color: gray;'>" + HeaderKey + "</code>:"); Write("<code style='color: green;'>" + HeaderValue + "</code><br />"); } Write("<a href='http://jsc-solutions.net'><img border='0' src='/assets/ScriptCoreLib/jsc.png' /></a>"); #region Special pages Write("<h2>Special pages</h2>"); Write("<br /> " + "special page: " + "<a href='/robots.txt'>/robots.txt</a>"); Write("<br /> " + "special page: " + "<a href='/xml'>/xml</a>"); Write("<br /> " + "special page: " + "<a href='/crossdomain.xml'>/crossdomain.xml</a>"); Write("<br /> " + "special page: " + "<a href='/favicon.ico'>/favicon.ico</a>"); Write("<br /> " + "special page: " + "<a href='/jsc'>/jsc</a>"); #endregion Write("<h2>WebMethods (" + WebMethods.Length + ")</h2>"); foreach (var item in WebMethods) { InternalGlobalExtensions.WriteWebMethodForm(Write, item); } //Write("<br /> Path: '" + Context.Request.Path + "'"); //Write("<br /> HttpMethod: '" + Context.Request.HttpMethod + "'"); Write("<h2>Form</h2>"); foreach (var item in Context.Request.Form.AllKeys) { Write("<br /> " + "<img src='http://i.msdn.microsoft.com/w144atby.pubproperty(en-us,VS.90).gif' /> <code>"); Write(item); Write(" = "); Write(escapeXML(Context.Request.Form[item])); Write("</code>"); } #region QueryString Write("<h2>QueryString</h2>"); foreach (var item in Context.Request.QueryString.AllKeys) { Write("<br /> " + "<img src='http://i.msdn.microsoft.com/w144atby.pubproperty(en-us,VS.90).gif' /> <code>"); Write(item); Write(" = "); Write(escapeXML(Context.Request.QueryString[item])); Write("</code>"); } #endregion Write("<h2>Script Applications</h2>"); foreach (var item in g.GetScriptApplications()) { Write("<br /> " + "script application: " + item.TypeName); foreach (var r in item.References) { Write("<br /> "); Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' /> reference: "); Write(r.AssemblyFile); } } Write("<h2>Files</h2>"); foreach (var item in g.GetFiles()) { Write("<br /> " + " file: <a href='" + item.Name + "'>" + item.Name + "</a>"); } }
private static void WriteDiagnosticsResults(StringAction Write, InternalWebMethodInfo WebMethod) { Write("<blockquote>"); if (WebMethod.Results == null) { Write("<h2>No results from " + WebMethod.MethodName + "</h2>"); } else { Write("<h2>" + WebMethod.Results.Length + " results from " + WebMethod.MethodName + "</h2>"); Write("<blockquote>"); foreach (var item in WebMethod.Results) { WriteWebMethod(Write, item, Parameter => { if (Parameter == null) return; Write(" = '<code style='color: red'>" + escapeXML(Parameter.Value) + "</code>'"); } ); } Write("</blockquote>"); Write("<br />"); } Write("</blockquote>"); }
private static void WriteXDocument(InternalGlobal g, StringAction Write, InternalWebMethodInfo WebMethod) { var that = g.InternalApplication; var Context = that.Context; #region document var w = new StringBuilder(); w.Append("<document>"); if (WebMethod.Results == null) { //Console.WriteLine("WriteXDocument Results null"); } else { //Console.WriteLine("WriteXDocument Results " + new { WebMethod.Results.Length }); foreach (var item in WebMethod.Results) { w.Append("<" + item.MethodName + ">"); if (item.Parameters != null) { foreach (var p in item.Parameters) { if (p.Value == null) { // no parameter? // X:\jsc.svn\examples\javascript\WebMethodXElementTransferExperiment\WebMethodXElementTransferExperiment\ApplicationWebService.cs } else { w.Append("<" + p.Name + ">"); w.Append(escapeXML(p.Value)); w.Append("</" + p.Name + ">"); } } } w.Append("</" + item.MethodName + ">"); } } if (WebMethod.TaskComplete) { w.Append("<TaskComplete>"); if (WebMethod.TaskResult != null) { //Console.WriteLine(new { WebMethod.TaskResult }); w.Append("<TaskResult>"); w.Append(escapeXML(WebMethod.TaskResult)); w.Append("</TaskResult>"); } w.Append("</TaskComplete>"); } w.Append("</document>"); #endregion var ws = w.ToString(); var wsbytes = Encoding.UTF8.GetBytes(ws); // http://stackoverflow.com/questions/1999824/whats-the-shortest-pair-of-strings-that-causes-an-md5-collision var ETagbytes = wsbytes.ToMD5Bytes(); var newETag = ETagbytes.ToHexString(); // does the client already have a copy of the same response? // if so, send 304 ? // http://www.codeproject.com/Articles/23857/The-Performance-Woe-of-Binary-XML // are we ready for encrypted binary xml? // http://msdn.microsoft.com/en-us/library/cc219210.aspx // file:///C:/Users/Arvo/Downloads/03-002r9_Binary_Extensible_Markup_Language_BXML_Encoding_Specification.pdf // is this the beginning of a binary diff service? // allow http to https calls Context.Response.AddHeader("Access-Control-Allow-Origin", "*"); Context.Response.AddHeader("ETag", Convert.ToBase64String(ETagbytes)); var hasETag = Context.Request.Form.AllKeys.Contains("ETag"); if (hasETag) { var oldETag64 = Context.Request.Form["ETag"]; var oldETagbytes = Convert.FromBase64String(oldETag64); var clientETag = oldETagbytes.ToHexString(); //{ MethodName = Gravatar, MetadataToken = 06000001, oldETag = 1706b464adc232a9df3dd4539a206569 } //{ MethodName = Gravatar, MetadataToken = 06000001, ETag = 1706b464adc232a9df3dd4539a206569 } //Console.WriteLine(new { WebMethod.MethodName, WebMethod.MetadataToken, clientETag }); //I/System.Console( 3988): #17 POST /xml/Gravatar HTTP/1.1 //D/FastDormancy( 220): before ======= ENTER DORMANCY ======= //W/Threeg ( 918): Failed to read packet and byte counts from wifi interface //D/dalvikvm( 3988): GC_CONCURRENT freed 819K, 56% free 3157K/7111K, external 2013K/2108K, paused 2ms+2ms //I/System.Console( 3988): { MethodName = Gravatar, MetadataToken = 06000001, oldETag = d41d8cd98f00b204e9800998ecf8427e } //I/System.Console( 3988): { MethodName = Gravatar, MetadataToken = 06000001, ETag = 5a62b5d768653ae632ba4ff7e0b7a03c } //I/Web Console( 3988): %c0:312066ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:14691/view-source:37081 //I/Web Console( 3988): 0:312076ms { Name = Gravatar, MetadataToken = 06000001, ETag = d41d8cd98f00b204e9800998ecf8427e, ElapsedMilliseconds = 5 } at http://192.168.43.1:14691/view-source:37040 if (clientETag == newETag) { //Console.WriteLine("Client already has the answer, sending 304"); // X:\jsc.svn\examples\javascript\forms\FormsDataBindingForEnabled\FormsDataBindingForEnabled\ApplicationControl.cs // what will web client do with 304? g.Context.Response.StatusCode = 304; g.Context.Response.Flush(); that.CompleteRequest(); return; } } //Console.WriteLine(new { WebMethod.MethodName, WebMethod.MetadataToken, newETag, ws.Length }); //I/System.Console( 4563): #4 POST /xml/Gravatar HTTP/1.1 //I/System.Console( 4563): { MethodName = Gravatar, MetadataToken = 06000001, newETag = 1706b464adc232a9df3dd4539a206569, Length = 239 } //I/Web Console( 4563): %c0:22236ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:6686/view-source:37081 //I/Web Console( 4563): 0:22345ms { Name = Gravatar, MetadataToken = 06000001, ETag = d41d8cd98f00b204e9800998ecf8427e, ElapsedMilliseconds = 25 } at http://192.168.43.1:6686/view-source:37040 Context.Response.ContentType = "text/xml"; // https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control Write(ws); that.CompleteRequest(); }
private static void WriteDiagnostics(InternalGlobal g, StringAction Write, InternalWebMethodInfo[] WebMethods) { // should the diagnostics be a separate rich Browser Application? :) var Context = g.InternalApplication.Context; Write("<title>jsc-solutions.net</title>"); Write("<br/><center><a href='/'>Launch Application</a></center><br/>"); Write("<a href='http://jsc-solutions.net'><img border='0' src='/assets/ScriptCoreLib/jsc.png' /></a>"); Write("<blockquote>"); Write("<h2>Special pages</h2>"); Write("<blockquote>"); // like CON in filesystem? Write("<br /> " + "special page: " + "<a href='/robots.txt'>/robots.txt</a>"); Write("<br /> " + "special page: " + "<a href='/xml'>/xml</a>"); Write("<br /> " + "special page: " + "<a href='/crossdomain.xml'>/crossdomain.xml</a>"); Write("<br /> " + "special page: " + "<a href='/favicon.ico'>/favicon.ico</a>"); Write("<br /> " + "special page: " + "<a href='/jsc'>/jsc</a>"); Write("<br /> " + "special page: " + "<a href='/view-source'>/view-source</a>"); Write("</blockquote>"); Write("<h2>Methods</h2>"); Write("<blockquote>"); foreach (var item in WebMethods) { WriteWebMethodForm(Write, item); } Write("</blockquote>"); Write("<br /> Path: '" + Context.Request.Path + "'"); Write("<br /> HttpMethod: '" + Context.Request.HttpMethod + "'"); Write("<h2>Form</h2>"); foreach (var item in Context.Request.Form.AllKeys) { Write("<br /> " + "<img src='http://i.msdn.microsoft.com/w144atby.pubproperty(en-us,VS.90).gif' /> <code>"); Write(item); Write(" = "); Write(escapeXML(Context.Request.Form[item])); Write("</code>"); } Write("<h2>QueryString</h2>"); foreach (var item in Context.Request.QueryString.AllKeys) { Write("<br /> " + "<img src='http://i.msdn.microsoft.com/w144atby.pubproperty(en-us,VS.90).gif' /> <code>"); Write(item); Write(" = "); Write(escapeXML(Context.Request.QueryString[item])); Write("</code>"); } var ff = g.GetFiles(); // http://msdn.microsoft.com/en-us/library/y47ychfe.aspx Write("<h2>Applications</h2>"); Write("<blockquote>"); foreach (var app in g.GetScriptApplications()) { Write("<br /> "); Write("<img src='http://i.msdn.microsoft.com/yxcx7skw.pubclass(en-us,VS.90).gif' />"); Write(" <code style='color: darkcyan;'>" + app.TypeName + "</code>"); // var app_references = app.References.Select( // item => ff.First(k => k.Name == item.AssemblyFile + ".js") //).ToArray(); // var app_size = app_references.Sum(k => k.Length); // Write(" <span style='color: gray;'>(" + app_size + " bytes)</span>"); foreach (var r in app.References) { Write("<br /> "); Write("<img src='http://i.msdn.microsoft.com/dynimg/IC477625.png' />"); Write(" " + r.AssemblyFile); } } Write("</blockquote>"); Write("<h2>Files</h2>"); Write("<blockquote>"); Action<string> separator = delegate { }; foreach (var item in g.GetFiles()) { separator(item.Name); Write( "<br /> " + " file: <a href='" + item.Name + "'>" + item.Name + "</a>" + " size: " + item.Length ); // do we need this? //var itemref_csharp4 = item; separator = next => { if (next.TakeUntilLastOrEmpty("/") == item.Name.TakeUntilLastOrEmpty("/")) { return; } Write( "<br /> " ); }; } Write("</blockquote>"); Write("</blockquote>"); }
public static void AddParameter(InternalWebMethodInfo that, string Name, string Value) { //Console.WriteLine("InternalWebMethodInfo.AddParameter " + new { Name, Value }); if (that.InternalParameters == null) that.InternalParameters = new ArrayList(); var n = new InternalWebMethodParameterInfo { Name = Name, Value = Value }; that.InternalParameters.Add(n); that.Parameters = (InternalWebMethodParameterInfo[])that.InternalParameters.ToArray( typeof(InternalWebMethodParameterInfo) ); }