public static async Task <T> CipheriseRequest <T>(this string strRequestURI, HttpStatusCode eExpectedStatus, string strPostJSON, string strSessionID = null, UpdateOut <T> UpdateCB = null) where T : CipheriseError, new() { try { T OutData = default(T); //Lambas cant capture the out/ref Data, use a temp instead. ProcessJSONDelegate JSONDelegate = (HttpStatusCode eStatus, Stream stream) => { if (eExpectedStatus != eStatus) { String.Format("Invalid HTTP status code: '{0}'. Expecting: '{1}'", eStatus.ToString(), eExpectedStatus.ToString()).TraceWarning(); bool bRet = false; CipheriseError E = FromJSON <CipheriseError>(stream); if ((E != null) && E.HasError()) { E.GetError().TraceError("Cipherise JSON Error: "); OutData = new T(); if (UpdateCB != null) { UpdateCB(ref OutData); } OutData.SetError(ref E); bRet = true; //Caller must check T.HasError() } #if DEBUG { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } using (StreamReader streamReader = new StreamReader(stream)) { string responseFromServer = streamReader.ReadToEnd(); responseFromServer.TraceError("Invalid response: "); streamReader.Close(); } } #endif return(bRet); } //bool bEmptyResponse2 = (OutData is EmptyResponse); bool bEmptyResponse = (typeof(EmptyResponse).IsAssignableFrom(typeof(T))); if (bEmptyResponse) { OutData = new T(); //return an empty response instead of NULL if (UpdateCB != null) { UpdateCB(ref OutData); } } else { #if DEBUG { byte[] aData = null; using (MemoryStream ms = new MemoryStream()) { stream.CopyTo(ms); aData = ms.ToArray(); ms.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(ms); reader.ReadToEnd().TraceVerbose("RESPONSE: "); } stream = new MemoryStream(aData); } #endif //DEBUG bool bValid = false; OutData = FromJSON <T>(stream); if (OutData != null) { if (UpdateCB != null) { UpdateCB(ref OutData); } bValid = OutData.Validate(); } if (bValid == false) { String.Format("Invalid data: '{0}'", typeof(T)).TraceError(); return(false); } } return(true); }; bool bRequest = await ForticodeRequest(strRequestURI, JSONDelegate, strPostJSON, strSessionID); if (bRequest) { return(OutData); } } catch (Exception e) { e.CatchMessage().TraceError(); } return(null); }
public static async Task <T> CipheriseRequest <T>(this string strRequestURI, string strPostJSON, string strSessionID, UpdateOut <T> UpdateCB = null) where T : CipheriseError, new() { return(await CipheriseRequest <T>(strRequestURI, HttpStatusCode.OK, strPostJSON, strSessionID, UpdateCB)); }