private void MakeRequestViaWebRequest(string url, string data, string authType, string authKey, Action <string, PlayFabError> callback) { byte[] payload = System.Text.Encoding.UTF8.GetBytes(data); //TODO: make closure it's own method. Thread workerThread = new Thread(() => { HttpWebRequest request = null; HttpWebResponse response = null; try { request = (HttpWebRequest)WebRequest.Create(url); //Prevents hitting a proxy is no proxy is available. request.Proxy = null; //TODO: Add support for proxy's. request.Headers.Add("X-ReportErrorAsSuccess", "true"); // Without this, we have to catch WebException instead, and manually decode the result request.Headers.Add("X-PlayFabSDK", PlayFabVersion.getVersionString()); if (authType != null) { request.Headers.Add(authType, authKey); } request.ContentType = "application/json"; request.Method = "POST"; request.KeepAlive = PlayFabSettings.RequestKeepAlive; request.Timeout = PlayFabSettings.RequestTimeout; //Get Request Stream and send data in the body. using (var stream = request.GetRequestStream()) { stream.Write(payload, 0, payload.Length); } response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { using (var stream = new System.IO.StreamReader(response.GetResponseStream())) { var result = stream.ReadToEnd(); //Lock for protection of simultaneous API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = result, error = null }; _RunOnMainThreadQueue.Enqueue(cbc); } } } else { var error = GeneratePfError(response.StatusCode, PlayFabErrorCode.ServiceUnavailable, "Failed to connect to PlayFab server", null); //Lock for protection of simultaneous API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = null, error = error }; _RunOnMainThreadQueue.Enqueue(cbc); } } } catch (WebException e) { HttpStatusCode httpCode = response == null ? HttpStatusCode.ServiceUnavailable : response.StatusCode; var error = GeneratePfError(httpCode, PlayFabErrorCode.ServiceUnavailable, e.ToString(), null); //Lock for protection of simultaneous API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = null, error = error }; _RunOnMainThreadQueue.Enqueue(cbc); } } catch (Exception e) { Debug.LogException(e); // If it's an unexpected exception, we should log it noisily HttpStatusCode httpCode = response == null ? HttpStatusCode.ServiceUnavailable : response.StatusCode; var error = GeneratePfError(httpCode, PlayFabErrorCode.ServiceUnavailable, e.ToString(), null); //Lock for protection of simultaneous API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = null, error = error }; _RunOnMainThreadQueue.Enqueue(cbc); } } pendingMessages -= 1; }); workerThread.Start(); }
private void MakeRequestViaWebRequest(string url, string data, string authType, string authKey, Action <string, string> callback) { byte[] payload = System.Text.Encoding.UTF8.GetBytes(data); //TODO: make closure it's own method. Thread workerThread = new Thread(() => { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); //Prevents hitting a proxy is no proxy is available. request.Proxy = null; //TODO: Add support for proxy's. request.Headers.Add("X-ReportErrorAsSuccess", "true"); request.Headers.Add("X-PlayFabSDK", PlayFabVersion.getVersionString()); if (authType != null) { request.Headers.Add(authType, authKey); } request.ContentType = "application/json"; request.Method = "POST"; request.KeepAlive = PlayFabSettings.RequestKeepAlive; request.Timeout = PlayFabSettings.RequestTimeout; //Get Request Stream and send data in the body. using (var stream = request.GetRequestStream()) { stream.Write(payload, 0, payload.Length); } //Debug.LogFormat("Response Code: {0}", response.StatusCode); var response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { using (var stream = new System.IO.StreamReader(response.GetResponseStream())) { var result = stream.ReadToEnd(); //Lock for protection of simuiltanious API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = result, error = null }; _RunOnMainThreadQueue.Enqueue(cbc); } } } else { var error = GetResonseCodeResult(response.StatusCode); var errorString = GenerateJsonError((int)response.StatusCode, error, 1123, error, error); //Lock for protection of simuiltanious API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = errorString, error = null }; _RunOnMainThreadQueue.Enqueue(cbc); } } } catch (Exception e) { Debug.Log(e.Message); Debug.Log(e.StackTrace); var errorString = GenerateJsonError(500, e.Message, 1123, e.Message, e.Message); //Lock for protection of simuiltanious API calls. lock (_RunOnMainThreadQueue) { var cbc = new CallBackContainer() { action = callback, result = errorString, error = null }; _RunOnMainThreadQueue.Enqueue(cbc); } } }); workerThread.Start(); }