protected override void WireRequest(int attempt, string id, string method, ApiParamsWriterDelegate parameters, ApiCallSucceededDelegate resultHandler) { string widgetType = null; // 1. write the request using (Stream requestStream = new MemoryStream()) { StreamWriter sw = new StreamWriter(requestStream); try { WriteRequest(id, method, parameters, sw); sw.Flush(); requestStream.Seek(0, SeekOrigin.Begin); // 2. validate the json in the request: compare it with json defined in a file JsonData dataFromFile = null, dataFromRequest = null; using (StreamReader sr = new StreamReader(requestStream)) dataFromRequest = JsonMapper.ToObject(new JsonReader(sr)); if ("messaging.send_form".Equals(method)) widgetType = (string)dataFromRequest["params"]["form"]["type"]; using (StreamReader sr = new StreamReader(GetRequestInputStream(method, widgetType))) dataFromFile = JsonMapper.ToObject(new JsonReader(sr)); Assert.IsNotNull(dataFromFile); Assert.IsNotNull(dataFromRequest); // TODO: find a way to compare the 2 JsonObjects without having to update the thrid-party src code bool areEqual = dataFromFile.Equals(dataFromRequest); if (!areEqual) { string jsonFromFile = dataFromFile.ToJson(); string jsonFromRequest = dataFromRequest.ToJson(); // set a breakpoint here Assert.IsTrue(dataFromFile.Equals(dataFromRequest), "\n" + jsonFromFile + "\n!=\n" + jsonFromRequest); } } finally { sw.Dispose(); } } // 3. read and process the response from a json file using (StreamReader sr = new StreamReader(GetResponseInputStream(method))) ReadAndProcessResponse(resultHandler, sr); }
protected virtual void WireRequest(int attempt, string id, string method, ApiParamsWriterDelegate parameters, ApiCallSucceededDelegate resultHandler) { var webRequest = WebRequest.Create (ApiLocation) as HttpWebRequest; webRequest.ContentType = "application/json-rpc"; webRequest.Headers.Add ("X-Nuntiuz-API-Key", ApiKey); webRequest.Method = "POST"; Stream requestStream = webRequest.GetRequestStream(); using (StreamWriter sw = new StreamWriter(requestStream)) WriteRequest(id, method, parameters, sw); HttpWebResponse response = null; string errorMessage = null; try { response = webRequest.GetResponse () as HttpWebResponse; } catch (WebException we) { errorMessage = we.ToString (); System.Diagnostics.Trace.Write ("Exception occurred while sending request.\n" + errorMessage); } if (response == null || response.StatusCode != HttpStatusCode.OK) { if (attempt < 4) WireRequest (attempt + 1, id, method, parameters, resultHandler); else { throw new ApiException (-1, errorMessage, null); } return; } using (StreamReader sr = new StreamReader(response.GetResponseStream())) ReadAndProcessResponse(resultHandler, sr); }
protected void ReadAndProcessResponse(ApiCallSucceededDelegate resultHandler, StreamReader sr) { JsonReader reader = new JsonReader(sr); reader.Read(); if (reader.Token != JsonToken.ObjectStart) throw new ParseException("Unexpected token read!"); while (reader.Read()) { if (reader.Token == JsonToken.ObjectEnd) break; if (reader.Token != JsonToken.PropertyName) throw new ParseException("Unexpected token read!"); string field = (string)reader.Value; if (!reader.Read()) throw new ParseException("Unexpected end of stream!"); switch (field) { case "error": if (reader.Token == JsonToken.ObjectStart) ReadAndProcessError(reader); break; case "result": resultHandler(reader); break; default: break; } } }