/// <summary> /// Enqueues a request to be processed by the UnityMainThreadDispatcher. /// Unity /// </summary> /// <param name="request">An instance of UnityWebRequest.</param> public void EnqueueRequest(IUnityHttpRequest request) { lock (_requestsLock) { _requests.Enqueue(request); } }
/// <summary> /// Dequeues a request from the queue of pending requests. /// </summary> /// <returns>An instance of UnityWebRequest.</returns> public IUnityHttpRequest DequeueRequest() { IUnityHttpRequest request = null; lock (_requestsLock) { if (_requests.Count > 0) { request = _requests.Dequeue(); } } return(request); }
private void ProcessRequests() { IUnityHttpRequest unityHttpRequest = UnityRequestQueue.Instance.DequeueRequest(); if (unityHttpRequest != null) { this.StartCoroutine(InvokeRequest(unityHttpRequest)); } RuntimeAsyncResult runtimeAsyncResult = UnityRequestQueue.Instance.DequeueCallback(); if (runtimeAsyncResult != null && runtimeAsyncResult.Action != null) { try { runtimeAsyncResult.Action(runtimeAsyncResult.Request, runtimeAsyncResult.Response, runtimeAsyncResult.Exception, runtimeAsyncResult.AsyncOptions); } catch (Exception exception) { _logger.Error(exception, "An unhandled exception was thrown from the callback method {0}.", runtimeAsyncResult.Request.ToString()); } } Action action = UnityRequestQueue.Instance.DequeueMainThreadOperation(); if (action != null) { try { action(); } catch (Exception exception2) { _logger.Error(exception2, "An unhandled exception was thrown from the callback method"); } } NetworkReachability networkReachability = ServiceFactory.Instance.GetService <INetworkReachability>() as NetworkReachability; if (_currentNetworkStatus != networkReachability.NetworkStatus) { _currentNetworkStatus = networkReachability.NetworkStatus; networkReachability.OnNetworkReachabilityChanged(_currentNetworkStatus); } }
/// <summary> /// Makes a single web request using the WWW or UnityWebRequest API. /// </summary> /// <param name="request"></param> /// <returns>IEnumerator which indicated if the operation is pending.</returns> IEnumerator InvokeRequest(IUnityHttpRequest request) { // Fire the request var nr = ServiceFactory.Instance.GetService <INetworkReachability>() as Amazon.Util.Internal.PlatformServices.NetworkReachability; if (nr.NetworkStatus != NetworkStatus.NotReachable) { bool isWwwRequest = (request as UnityWwwRequest) != null; if (isWwwRequest) { var wwwRequest = new WWW((request as UnityWwwRequest).RequestUri.AbsoluteUri, request.RequestContent, request.Headers); if (wwwRequest == null) { yield return(null); } bool uploadCompleted = false; float prevProgress = 0; float currentProgress = 0; while (!wwwRequest.isDone) { if (request.RequestContent == null) { currentProgress = wwwRequest.progress; if (prevProgress != currentProgress) { if (DownloadProgress != null) { DownloadProgress(currentProgress); } } prevProgress = currentProgress; } var uploadProgress = wwwRequest.uploadProgress; if (!uploadCompleted) { request.OnUploadProgressChanged(uploadProgress); if (uploadProgress == 1) { uploadCompleted = true; } } yield return(null); } request.WwwRequest = wwwRequest; request.Response = new UnityWebResponseData(wwwRequest); } else { var unityRequest = request as UnityRequest; if (unityRequest == null) { yield return(null); } var unityWebRequest = new UnityWebRequestWrapper( unityRequest.RequestUri.AbsoluteUri, unityRequest.Method); unityWebRequest.DownloadHandler = new DownloadHandlerBufferWrapper(); if (request.RequestContent != null && request.RequestContent.Length > 0) { unityWebRequest.UploadHandler = new UploadHandlerRawWrapper(request.RequestContent); } bool uploadCompleted = false; foreach (var header in request.Headers) { unityWebRequest.SetRequestHeader(header.Key, header.Value); } var operation = unityWebRequest.Send(); float prevProgress = 0; float currentProgress = 0; while (!operation.isDone) { if (request.RequestContent == null) { currentProgress = unityWebRequest.DownloadProgress; if (prevProgress != currentProgress) { if (DownloadProgress != null) { DownloadProgress(currentProgress); } } prevProgress = currentProgress; } var uploadProgress = operation.progress; if (!uploadCompleted) { request.OnUploadProgressChanged(uploadProgress); if (uploadProgress == 1) { uploadCompleted = true; } } yield return(null); } request.WwwRequest = unityWebRequest; request.Response = new UnityWebResponseData(unityWebRequest); } } else { request.Exception = new WebException("Network Unavailable", WebExceptionStatus.ConnectFailure); } if (request.IsSync) { // For synchronous calls, signal the wait handle // so that the calling thread which waits on the wait handle // is unblocked. if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } request.WaitHandle.Set(); } else { if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } // For asychronous calls invoke the callback method with the // state object that was originally passed in. // Invoke the callback method for the request on the thread pool // after the web request is executed. This callback triggers the // post processing of the response from the server. ThreadPool.QueueUserWorkItem((state) => { try { request.Callback(request.AsyncResult); } catch (Exception exception) { // The callback method (HttpHandler.GetResponseCallback) and // subsequent calls to handler callbacks capture any exceptions // thrown from the runtime pipeline during post processing. // Log the exception, in case we get an unhandled exception // from the callback. _logger.Error(exception, "An exception was thrown from the callback method executed from" + "UnityMainThreadDispatcher.InvokeRequest method."); } }); } }
private IEnumerator InvokeRequest(IUnityHttpRequest request) { if ((ServiceFactory.Instance.GetService <INetworkReachability>() as NetworkReachability).NetworkStatus != 0) { if (request is UnityWwwRequest) { WWW wwwRequest = new WWW((request as UnityWwwRequest).RequestUri.AbsoluteUri, request.RequestContent, request.Headers); if (wwwRequest == null) { yield return((object)null); } bool uploadCompleted2 = false; while (!wwwRequest.get_isDone()) { float uploadProgress = wwwRequest.get_uploadProgress(); if (!uploadCompleted2) { request.OnUploadProgressChanged(uploadProgress); if (uploadProgress == 1f) { uploadCompleted2 = true; } } yield return((object)null); } request.WwwRequest = (IDisposable)wwwRequest; request.Response = new UnityWebResponseData(wwwRequest); } else { UnityRequest unityRequest = request as UnityRequest; if (unityRequest == null) { yield return((object)null); } UnityWebRequestWrapper unityWebRequest = new UnityWebRequestWrapper(unityRequest.RequestUri.AbsoluteUri, unityRequest.Method) { DownloadHandler = new DownloadHandlerBufferWrapper() }; if (request.RequestContent != null && request.RequestContent.Length != 0) { unityWebRequest.UploadHandler = new UploadHandlerRawWrapper(request.RequestContent); } bool uploadCompleted = false; foreach (KeyValuePair <string, string> header in request.Headers) { unityWebRequest.SetRequestHeader(header.Key, header.Value); } AsyncOperation operation = unityWebRequest.Send(); while (!operation.get_isDone()) { float progress = operation.get_progress(); if (!uploadCompleted) { request.OnUploadProgressChanged(progress); if (progress == 1f) { uploadCompleted = true; } } yield return((object)null); } request.WwwRequest = unityWebRequest; request.Response = new UnityWebResponseData(unityWebRequest); } } else { request.Exception = new WebException("Network Unavailable", WebExceptionStatus.ConnectFailure); } if (request.IsSync) { if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } request.WaitHandle.Set(); } else { if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } ThreadPool.QueueUserWorkItem(delegate { try { request.Callback(request.AsyncResult); } catch (Exception exception) { _logger.Error(exception, "An exception was thrown from the callback method executed fromUnityMainThreadDispatcher.InvokeRequest method."); } }); } }
/// <summary> /// Makes a single web request using the WWW or UnityWebRequest API. /// </summary> /// <param name="request"></param> /// <returns>IEnumerator which indicated if the operation is pending.</returns> IEnumerator InvokeRequest(IUnityHttpRequest request) { // Fire the request var nr = ServiceFactory.Instance.GetService<INetworkReachability>() as Amazon.Util.Internal.PlatformServices.NetworkReachability; if (nr.NetworkStatus != NetworkStatus.NotReachable) { bool isWwwRequest = (request as UnityWwwRequest) != null; if (isWwwRequest) { var wwwRequest = new WWW((request as UnityWwwRequest).RequestUri.AbsoluteUri, request.RequestContent, request.Headers); if (wwwRequest == null) { yield return null; } bool uploadCompleted = false; while (!wwwRequest.isDone) { var uploadProgress = wwwRequest.uploadProgress; if (!uploadCompleted) { request.OnUploadProgressChanged(uploadProgress); if (uploadProgress == 1) uploadCompleted = true; } yield return null; } request.WwwRequest = wwwRequest; request.Response = new UnityWebResponseData(wwwRequest); } else { var unityRequest = request as UnityRequest; if (unityRequest == null) { yield return null; } var unityWebRequest = new UnityWebRequestWrapper( unityRequest.RequestUri.AbsoluteUri, unityRequest.Method); unityWebRequest.DownloadHandler = new DownloadHandlerBufferWrapper(); if (request.RequestContent != null && request.RequestContent.Length > 0) unityWebRequest.UploadHandler = new UploadHandlerRawWrapper(request.RequestContent); bool uploadCompleted = false; foreach (var header in request.Headers) { unityWebRequest.SetRequestHeader(header.Key, header.Value); } var operation = unityWebRequest.Send(); while (!operation.isDone) { var uploadProgress = operation.progress; if (!uploadCompleted) { request.OnUploadProgressChanged(uploadProgress); if (uploadProgress == 1) uploadCompleted = true; } yield return null; } request.WwwRequest = unityWebRequest; request.Response = new UnityWebResponseData(unityWebRequest); } } else { request.Exception = new WebException("Network Unavailable", WebExceptionStatus.ConnectFailure); } if (request.IsSync) { // For synchronous calls, signal the wait handle // so that the calling thread which waits on the wait handle // is unblocked. if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } request.WaitHandle.Set(); } else { if (request.Response != null && !request.Response.IsSuccessStatusCode) { request.Exception = new HttpErrorResponseException(request.Response); } // For asychronous calls invoke the callback method with the // state object that was originally passed in. // Invoke the callback method for the request on the thread pool // after the web request is executed. This callback triggers the // post processing of the response from the server. ThreadPool.QueueUserWorkItem((state) => { try { request.Callback(request.AsyncResult); } catch (Exception exception) { // The callback method (HttpHandler.GetResponseCallback) and // subsequent calls to handler callbacks capture any exceptions // thrown from the runtime pipeline during post processing. // Log the exception, in case we get an unhandled exception // from the callback. _logger.Error(exception, "An exception was thrown from the callback method executed from" + "UnityMainThreadDispatcher.InvokeRequest method."); } }); } }