Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
            }
        }