public PandoraResponse doPost(PandoraRequest data) { try { //Build URL string url = data.Protocol + Config.BaseURL + data.getURLParameters(); Type expectedResponseType = data.expectedResponseType; //Convert data to raw bytes so we can stream it to the request, encrypting as necessary byte[] databuffer = serializeRequestObject(data); HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //Set the request headers request.Method = Config.RequestMethod; request.UserAgent = Config.RequestUserAgent; request.ContentType = Config.RequestContentType; request.Accept = Config.RequestAccept; request.ContentLength = databuffer.Length; //Get the request stream and send out data Stream stream = request.GetRequestStream(); stream.Write(databuffer, 0, databuffer.Length); stream.Close(); //Get the response WebResponse resp = request.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); string rawResponse = reader.ReadToEnd(); PandoraResponse response = JsonConvert.DeserializeObject <PandoraResponse>(rawResponse); //Debug //Console.WriteLine(url); //Console.WriteLine(rawResponse); if (response.stat == "ok") { IPandoraResponseResult resultObj = (IPandoraResponseResult)Activator.CreateInstance(expectedResponseType); resultObj.populate(Convert.ToString(response.result)); response.result = resultObj; } return(response); }catch (PandoraRequestURLFormatException eURL) { log("Couldn't do post -"); log("Malformed URL."); return(null); } }
private byte[] serializeRequestObject(PandoraRequest request) { //Set up serializer MemoryStream stream = new MemoryStream(); DataContractJsonSerializer serializer = new DataContractJsonSerializer(request.GetType()); StreamReader reader = new StreamReader(stream); //Serialize the object serializer.WriteObject(stream, request); //Read the object from the stream and convert to byte array stream.Position = 0; string result = reader.ReadToEnd(); if (request.needEncryption) { result = PBlowfish.Encrypt(result); } return(Encoding.ASCII.GetBytes(result)); }
private PandoraData ExecuteRequest(PandoraRequest request, WebProxy proxy) { try { ASCIIEncoding encoder = new ASCIIEncoding(); // build url for request to pandora servers string prefix = request.IsSecure ? "https://" : "http://"; string url = prefix + baseUrl; url += "method=" + request.MethodName; if (request.User != null) { url += String.Format("&user_id={0}", HttpUtility.UrlEncode(request.User.Id)); } if (request.Session != null) { url += String.Format("&auth_token={0}", HttpUtility.UrlEncode(request.UserAuthToken == null ? request.Session.PartnerAuthToken : request.UserAuthToken)); url += String.Format("&partner_id={0}", request.Session.PartnerId); } // build the post data for our request JsonSerializerSettings settings = new JsonSerializerSettings(); settings.NullValueHandling = NullValueHandling.Ignore; string postStr = JsonConvert.SerializeObject(request, settings); byte[] postData = encoder.GetBytes(request.IsEncrypted ? encrypter.Encrypt(postStr) : postStr); // configure our connection ServicePointManager.Expect100Continue = false; WebRequest webRequest = WebRequest.Create(url); webRequest.ContentType = "text/xml"; webRequest.ContentLength = postData.Length; webRequest.Method = "POST"; if (proxy != null) { webRequest.Proxy = proxy; } // send request to remote servers Stream os = webRequest.GetRequestStream(); os.Write(postData, 0, postData.Length); os.Close(); // retrieve reply from servers using (WebResponse response = webRequest.GetResponse()) { StreamReader sr = new StreamReader(response.GetResponseStream()); string replyStr = sr.ReadToEnd(); PandoraResponse reply = JsonConvert.DeserializeObject <PandoraResponse>(replyStr); // parse and throw any errors or return our result if (!reply.Success) { //Console.WriteLine(url); throw new PandoraException(reply); } if (request.ReturnType == null) { return(null); } return((PandoraData)JsonConvert.DeserializeObject(reply.Result.ToString(), request.ReturnType)); } } catch (Exception ex) { if (ex is PandoraException) { throw; } throw new PandoraException("Unexpected error communicating with server.", ex); } }