private void jsonMapAndPrimitives(string actionName) { var initialMap = new JsonDataMap(); initialMap["ID"] = 100; initialMap["Name"] = "Initial Name"; var str = initialMap.ToJson(JsonWritingOptions.CompactRowsAsMap); var values = new NameValueCollection(); values.Add("n", "777"); values.Add("s", "sss"); using (var wc = CreateWebClient()) { wc.QueryString = values; wc.Headers[HttpRequestHeader.ContentType] = Azos.Web.ContentType.JSON; var res = wc.UploadString(INTEGRATION_HTTP_ADDR + actionName, str); var gotMap = JsonReader.DeserializeDataObject(res) as JsonDataMap; Aver.AreObjectsEqual(gotMap["ID"], 777); Aver.AreObjectsEqual(gotMap["Name"], "sss"); } }
protected override void DoEncodeResponse(MemoryStream ms, ResponseMsg msg, ISerializer serializer) { var data = new JsonDataMap(); data["id"] = msg.RequestID.ID; data["instance"] = msg.RemoteInstance?.ToString("D"); if (msg.ReturnValue is string rstr) { data["return"] = rstr; } else if (msg.ReturnValue is Contracts.RemoteTerminalInfo rtrm) { data["return"] = rtrm; } else if (msg.ReturnValue is WrappedExceptionData wed) { data["return"] = new JsonDataMap { { "error-content", wed.ToJson(JsonWritingOptions.CompactRowsAsMap) } } } ; else { throw new ProtocolException(StringConsts.GLUE_BINDING_RESPONSE_ERROR.Args(nameof(AppTermBinding), "unsupported ReturnValue `{0}`".Args(msg.ReturnValue))); } var json = data.ToJson(JsonWritingOptions.Compact); var utf8 = Encoding.UTF8.GetBytes(json); ms.Write(utf8, 0, utf8.Length); }
protected override void DoAfterWork(WorkContext work, JsonDataMap matched) { work.Log( matched[VAR_TYPE].AsEnum <MessageType>(MessageType.Info), matched[VAR_TEXT].AsString(work.About), matched[VAR_FROM].AsString("{0}.After".Args(GetType().FullName)), pars: matched.ToJson(JsonWritingOptions.CompactASCII) ); }
public void SortMapKeys() { var dict = new JsonDataMap() { { "z", 1 }, { "g", -2 }, { "a", 3 }, { "b", 7 } }; var json = dict.ToJson(JsonWritingOptions.Compact); json.See(); json = dict.ToJson(new JsonWritingOptions(JsonWritingOptions.Compact) { MapSortKeys = true }); json.See(); Aver.AreEqual(@"{""a"":3,""b"":7,""g"":-2,""z"":1}", json); }
private MinIdpUserData processResponse(Guid rel, JsonDataMap response) { if (ComponentEffectiveLogLevel < MessageType.Trace) { WriteLog(MessageType.DebugA, nameof(processResponse), "#100 Got response", related: rel, pars: response.ToJson(JsonWritingOptions.CompactASCII)); } var got = response.UnwrapPayloadObject(); if (got == null) { return(null); } var dataMap = got as JsonDataMap; if (dataMap == null) { if (got is string ciphered && ciphered.IsNotNullOrWhiteSpace()) { if (ComponentEffectiveLogLevel < MessageType.Trace) { WriteLog(MessageType.DebugA, nameof(processResponse), "#150 Deciphering", related: rel, pars: ciphered); } var deciphered = MessageProtectionAlgorithm.NonNull(nameof(MessageProtectionAlgorithm)) .UnprotectObject(ciphered); if (deciphered == null)//returns null if message could not be deciphered { WriteLog(MessageType.Critical, nameof(processResponse), StringConsts.SECURITY_IDP_RESPONSE_DECIPHER_ERROR, related: rel); } dataMap = deciphered as JsonDataMap; } else { var etext = StringConsts.SECURITY_IDP_PROTOCOL_ERROR.Args("unsupported `data` of type `{0}`".Args(got.GetType().Name)); if (ComponentEffectiveLogLevel < MessageType.Trace) { WriteLog(MessageType.DebugError, nameof(processResponse), "#155 " + etext, related: rel); } throw new SecurityException(etext); } }
private ConfigSectionNode buildSection(string name, JsonDataMap sectData, ConfigSectionNode parent) { var value = sectData[SECTION_VALUE_ATTR].AsString(); ConfigSectionNode result = parent == null ? new ConfigSectionNode(this, null, name, value) : parent.AddChildNode(name, value); foreach (var kvp in sectData) { if (kvp.Value is JsonDataMap) { buildSection(kvp.Key, (JsonDataMap)kvp.Value, result); } else if (kvp.Value is JsonDataArray) { var lst = (JsonDataArray)kvp.Value; foreach (var lnode in lst) { if (lnode is JsonDataMap lmap) { buildSection(kvp.Key, lmap, result); } else if (lnode is JsonDataArray larray) { throw new ConfigException(StringConsts.CONFIG_JSON_STRUCTURE_ERROR, new ConfigException("Bad structure: " + sectData.ToJson())); } else { result.AddAttributeNode(kvp.Key, "{0}".Args(lnode)); } } } else { if (!kvp.Key.EqualsIgnoreCase(SECTION_VALUE_ATTR)) { result.AddAttributeNode(kvp.Key, kvp.Value); } } } return(result); }
public override string ToString() => m_Content.ToJson(JsonWritingOptions.CompactASCII);
/// <summary> /// Handles the exception by responding appropriately with error page with conditional level of details and logging /// </summary> public static void HandleException(WorkContext work, Exception error, OrderedRegistry <WorkMatch> showDumpMatches, OrderedRegistry <WorkMatch> logMatches, string securityRedirectURL = null, string securityRedirectTarget = null, OrderedRegistry <WorkMatch> securityRedirectMatches = null, Type customPageType = null ) { if (work == null || error == null) { return; } var showDump = showDumpMatches != null? showDumpMatches.OrderedValues.Any(m => m.Make(work) != null) : false; if (work.Response.Buffered) { work.Response.CancelBuffered(); } var json = false; if (work.Request != null && work.Request.AcceptTypes != null)//if needed for some edge HttpListener cases when Request or Request.AcceptTypes are null { json = work.Request.AcceptTypes.Any(at => at.EqualsIgnoreCase(ContentType.JSON)); } var actual = error; if (actual is FilterPipelineException fpe) { actual = fpe.RootException; } if (actual is MvcException mvce) { actual = mvce.InnerException; } var securityError = Security.AuthorizationException.IsDenotedBy(actual); if (actual is IHttpStatusProvider httpStatusProvider) { work.Response.StatusCode = httpStatusProvider.HttpStatusCode; work.Response.StatusDescription = httpStatusProvider.HttpStatusDescription; } else { if (securityError) { work.Response.StatusCode = WebConsts.STATUS_403; work.Response.StatusDescription = WebConsts.STATUS_403_DESCRIPTION; } else { work.Response.StatusCode = WebConsts.STATUS_500; work.Response.StatusDescription = WebConsts.STATUS_500_DESCRIPTION; } } if (json) { work.Response.ContentType = ContentType.JSON; work.Response.WriteJSON(error.ToClientResponseJSONMap(showDump)); } else { if (securityRedirectMatches != null && securityRedirectMatches.Count > 0) { JsonDataMap matched = null; foreach (var match in securityRedirectMatches.OrderedValues) { matched = match.Make(work, actual); if (matched != null) { break; } } if (matched != null) { var url = matched[VAR_SECURITY_REDIRECT_URL].AsString(); var target = matched[VAR_SECURITY_REDIRECT_TARGET].AsString(); if (url.IsNotNullOrWhiteSpace()) { securityRedirectURL = url; } if (target.IsNotNullOrWhiteSpace()) { securityRedirectTarget = target; } } } if (securityRedirectURL.IsNotNullOrWhiteSpace() && securityError && !work.IsAuthenticated) { var url = securityRedirectURL; var target = securityRedirectTarget; if (target.IsNotNullOrWhiteSpace()) { var partsA = url.Split('#'); var parts = partsA[0].Split('?'); var query = parts.Length > 1 ? parts[0] + "&" : string.Empty; url = "{0}?{1}{2}={3}{4}".Args(parts[0], query, target, Uri.EscapeDataString(work.Request.Url.PathAndQuery), partsA.Length > 1 ? "#" + partsA[1] : string.Empty); } work.Response.RedirectAndAbort(url); } else { WaveTemplate errorPage = null; if (customPageType != null) { try { errorPage = Activator.CreateInstance(customPageType) as WaveTemplate; if (errorPage == null) { throw new WaveException("not WaveTemplate"); } } catch (Exception actErr) { work.Log(Log.MessageType.Error, StringConsts.ERROR_PAGE_TEMPLATE_TYPE_ERROR.Args(customPageType.FullName, actErr.ToMessageWithType()), typeof(ErrorFilter).FullName + ".ctor(customPageType)", actErr); } } if (errorPage == null) { errorPage = new ErrorPage(work, error, showDump); } errorPage.Render(work, error); } } if (logMatches != null && logMatches.Count > 0) { JsonDataMap matched = null; foreach (var match in logMatches.OrderedValues) { matched = match.Make(work, error); if (matched != null) { break; } } if (matched != null) { work.Log(Log.MessageType.Error, error.ToMessageWithType(), typeof(ErrorFilter).FullName, pars: matched.ToJson(JsonWritingOptions.CompactASCII)); } } }
protected override void DoEncodeRequest(MemoryStream ms, RequestMsg msg) { if (msg.Contract != typeof(Contracts.IRemoteTerminal)) { throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding), nameof(Contracts.IRemoteTerminal), msg.Contract.FullName)); } var request = msg as RequestAnyMsg; if (request == null) { throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding), nameof(RequestAnyMsg), msg.GetType().FullName)); } var data = new JsonDataMap(); data["id"] = request.RequestID.ID; data["instance"] = request.RemoteInstance?.ToString("D"); data["method"] = request.MethodName; data["one-way"] = false;//reserved for future use if (request.Arguments != null && request.Arguments.Length > 0) { data["command"] = request.Arguments[0]; } else { data["command"] = null; } //Handle headers, this binding allows ONLY for AuthenticationHeader with supported tokens/credentials if (request.HasHeaders) { if (request.Headers.Count > 1) { throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding), "1 AuthenticationHeader", request.Headers.Count)); } var ahdr = request.Headers[0] as AuthenticationHeader; if (ahdr == null) { throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding), "1 AuthenticationHeader", request.Headers[0].GetType().FullName)); } if (ahdr.Token.Assigned) { data["auth-token"] = ahdr.Token.ToString(); } if (ahdr.Credentials != null) { var src = ahdr.Credentials as Azos.Security.IStringRepresentableCredentials; if (src == null) { throw new ProtocolException(StringConsts.GLUE_BINDING_UNSUPPORTED_FUNCTION_ERROR.Args(nameof(AppTermBinding), "IStringRepresentableCredentials", ahdr.Credentials.GetType().FullName)); } data["auth-cred"] = src.RepresentAsString(); } } var json = data.ToJson(JsonWritingOptions.Compact); var utf8 = Encoding.UTF8.GetBytes(json); ms.Write(utf8, 0, utf8.Length); }
/// <summary> /// Handles the exception by responding appropriately with error page with conditional level of details and logging /// </summary> public static void HandleException(WorkContext work, Exception error, OrderedRegistry <WorkMatch> showDumpMatches, OrderedRegistry <WorkMatch> logMatches, string securityRedirectURL = null, string securityRedirectTarget = null, OrderedRegistry <WorkMatch> securityRedirectMatches = null, Type customPageType = null ) { if (work == null || error == null) { return; } var showDump = showDumpMatches != null? showDumpMatches.OrderedValues.Any(m => m.Make(work) != null) : false; if (work.Response.Buffered) { work.Response.CancelBuffered(); } var json = false; if (work.Request != null && work.Request.AcceptTypes != null)//if needed for some edge HttpListener cases when Request or Request.AcceptTypes are null { json = work.Request.AcceptTypes.Any(at => at.EqualsIgnoreCase(ContentType.JSON)); } var actual = error; if (actual is FilterPipelineException fpe) { actual = fpe.RootException; } if (actual is MvcException mvce) { actual = mvce.InnerException; } var securityError = Security.AuthorizationException.IsDenotedBy(error); var hsp = error.SearchThisOrInnerExceptionOf <IHttpStatusProvider>(); if (hsp != null) { work.Response.StatusCode = hsp.HttpStatusCode; work.Response.StatusDescription = hsp.HttpStatusDescription; } else { if (securityError) { work.Response.StatusCode = WebConsts.STATUS_403; work.Response.StatusDescription = WebConsts.STATUS_403_DESCRIPTION; } else { work.Response.StatusCode = WebConsts.STATUS_500; work.Response.StatusDescription = WebConsts.STATUS_500_DESCRIPTION; } } if (json) { work.Response.ContentType = ContentType.JSON; work.Response.WriteJSON(error.ToClientResponseJsonMap(showDump), JsonWritingOptions.PrettyPrintRowsAsMap); } else { if (securityRedirectMatches != null && securityRedirectMatches.Count > 0) { JsonDataMap matched = null; foreach (var match in securityRedirectMatches.OrderedValues) { matched = match.Make(work, actual); if (matched != null) { break; } } if (matched != null) { var url = matched[VAR_SECURITY_REDIRECT_URL].AsString(); var target = matched[VAR_SECURITY_REDIRECT_TARGET].AsString(); if (url.IsNotNullOrWhiteSpace()) { securityRedirectURL = url; } if (target.IsNotNullOrWhiteSpace()) { securityRedirectTarget = target; } } } if (securityRedirectURL.IsNotNullOrWhiteSpace() && securityError && !work.IsAuthenticated) { var url = securityRedirectURL; var target = securityRedirectTarget; if (target.IsNotNullOrWhiteSpace()) { var partsA = url.Split('#'); var parts = partsA[0].Split('?'); var query = parts.Length > 1 ? parts[0] + "&" : string.Empty; url = "{0}?{1}{2}={3}{4}".Args(parts[0], query, target, Uri.EscapeDataString(work.Request.Url.PathAndQuery), partsA.Length > 1 ? "#" + partsA[1] : string.Empty); } work.Response.RedirectAndAbort(url); } else { WaveTemplate errorPage = null; if (customPageType != null) { try { //20201130 DKh fix #376 var simpleCtor = customPageType.GetConstructor(new Type[] { typeof(Exception), typeof(bool) }) == null; errorPage = (simpleCtor ? Activator.CreateInstance(customPageType) : Activator.CreateInstance(customPageType, error, showDump) ) as WaveTemplate;//fix #376 if (errorPage == null) { throw new WaveException("not a {0}".Args(nameof(WaveTemplate))); } } catch (Exception actErr) { work.Log(Log.MessageType.Error, StringConsts.ERROR_PAGE_TEMPLATE_TYPE_ERROR.Args(customPageType.FullName, actErr.ToMessageWithType()), typeof(ErrorFilter).FullName + ".ctor(customPageType)", actErr); } } if (errorPage == null) { errorPage = new ErrorPage(error, showDump); } errorPage.Render(work, error); } } if (logMatches != null && logMatches.Count > 0) { JsonDataMap matched = null; foreach (var match in logMatches.OrderedValues) { matched = match.Make(work, error); if (matched != null) { break; } } if (matched != null) { matched["$ip"] = work.EffectiveCallerIPEndPoint.ToString(); matched["$ua"] = work.Request.UserAgent.TakeFirstChars(78, ".."); matched["$mtd"] = work.Request.HttpMethod; matched["$uri"] = work.Request.Url.ToString().TakeFirstChars(78, ".."); matched["$ref"] = work.Request.UrlReferrer?.ToString().TakeFirstChars(78, ".."); matched["$stat"] = "{0}/{1}".Args(work.Response.StatusCode, work.Response.StatusDescription); if (work.Portal != null) { matched["$portal"] = work.Portal.Name; } if (work.GeoEntity != null) { matched["$geo"] = work.GeoEntity.LocalityName; } work.Log(Log.MessageType.Error, error.ToMessageWithType(), typeof(ErrorFilter).FullName, pars: matched.ToJson(JsonWritingOptions.CompactASCII)); } } }
public override string ToString() { return(m_Content.ToJson()); }