using System.Collections; using System.Text; using Best.HTTP.Examples.Helpers; using Best.HTTP.Response; using UnityEngine; namespace Best.HTTP.Examples { /// /// Example showing the usage of download streaming using the DownloadContentStream class. /// In this example content processing is done on the Unity main thread wrapped in a coroutine. /// class DownStreamSample : SampleBase { #pragma warning disable 0649, 0169 [Header("Sample Fields")] /// /// GameObject that will be used as a root for new UI objects. /// [SerializeField] private RectTransform _contentRoot; /// /// Prefab of a UI object with a Text field. /// [SerializeField] private TextListItem _listItemPrefab; #pragma warning restore /// /// Address of the used end point. /// private string _baseAddress = "https://besthttpwebgldemo.azurewebsites.net/sse"; /// /// Cached reference to the HTTPRequest instance. /// private HTTPRequest _request; protected override void Start() { base.Start(); // Create a regular get request with a regular callback too. We still need a callback, // because it might encounter an error before able to start a download. _request = HTTPRequest.CreateGet(this._baseAddress, OnRequestFinishedCallack); // Request a notification when download starts. This callback will be fired when // the status code suggests that we can expect actual content (2xx status codes). _request.DownloadSettings.OnDownloadStarted += OnDownloadStarted; // Don't want to retry when there's a failure _request.RetrySettings.MaxRetries = 0; // Start processing the request _request.Send(); AddUIText("Connecting..."); } private void OnDownloadStarted(HTTPRequest req, HTTPResponse resp, DownloadContentStream stream) { AddUIText("Download started!"); // We can expect content from the server, start our logic. StartCoroutine(ParseContent(stream)); } IEnumerator ParseContent(DownloadContentStream stream) { try { while (!stream.IsCompleted) { // Try to take out a download segment from the Download Stream. if (stream.TryTake(out var buffer)) { // Make sure that the buffer is released back to the BufferPool. using var _ = buffer.AsAutoRelease(); try { // Try to create a string from the downloaded content var str = Encoding.UTF8.GetString(buffer.Data, buffer.Offset, buffer.Count).TrimEnd(); // And display it in the UI AddUIText(str); } catch { } } yield return null; } } finally { // Don't forget to Dispose the stream! stream.Dispose(); } } private void OnRequestFinishedCallack(HTTPRequest req, HTTPResponse resp) { if (_request == null) return; string log = null; if (req.State == HTTPRequestStates.Finished) { if (!resp.IsSuccess) log = resp.StatusCode.ToString(); } else log = req.State.ToString(); AddUIText(log); _request = null; } private void OnDestroy() { _request?.Abort(); _request = null; } void AddUIText(string text) => Instantiate(this._listItemPrefab, this._contentRoot) .SetText(text); } }