using System;
using System.Threading.Tasks;
using Best.HTTP.Examples.Helpers;
using Best.HTTP.Hosts.Settings;
using Best.HTTP.Shared;
using UnityEngine;
namespace Best.HTTP.Examples
{
///
/// Demonstrates the usage of HTTPManager.PerHostSettings to set rules and configurations on a per-host basis.
///
class PerHostManagerSample : 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 two Text fields.
///
[SerializeField]
private MultiTextListItem _listItemPrefab;
///
/// Prefab of a UI object with Text and (Raw)Image fields.
///
[SerializeField]
private TextWithImageListItem _listItemWithImagePrefab;
#pragma warning restore
readonly Uri host_1 = new Uri("https://besthttpwebgldemo.azurewebsites.net");
readonly string[] host_1_image_paths = new string[] { "/images/Demo/Two.png", "/images/Demo/Three.png" };
readonly Uri host_2 = new Uri("https://httpbingo.org");
readonly string[] host_2_image_paths = new string[] { "/image/jpeg", "/image/png" };
protected override async void Start()
{
base.Start();
#if (!UNITY_WEBGL || UNITY_EDITOR) && !BESTHTTP_DISABLE_ALTERNATE_SSL
CreateUIItem("Disabling HTTP/2 globally, all following request should done over HTTP/1.");
// Get the global/fallback settings.
var globalSettings = HTTPManager.PerHostSettings.Get("*");
// Turn off connection pooling
globalSettings.HTTP1ConnectionSettings.TryToReuseConnections = false;
// Turn off HTTP/2 connections.
globalSettings.HTTP2ConnectionSettings.EnableHTTP2Connections = false;
await DownloadImages();
CreateUIItem("Enabling HTTP/2 for only a couple hosts");
// Add new settings. New connections to these hosts will use these settings instead of the global one.
// By default both connection pooling and HTTP/2 are enabled, downloading the images again will be done over HTTP/2.
HTTPManager.PerHostSettings.Add(host_1, new HostSettings());
HTTPManager.PerHostSettings.Add(host_2, new HostSettings());
#else
CreateUIItem("Please note that this sample can't work under WebGL!");
#endif
await DownloadImages();
}
async Task DownloadImages()
{
// Images from the first host
foreach (var path in host_1_image_paths)
{
var request = HTTPRequest.CreateGet(new Uri(host_1, path));
request.DownloadSettings.DisableCache = true;
var resp = await request.GetHTTPResponseAsync();
CreateUIItemWithImage(host_1.Host)
.SetStatusText($"http/{resp.HTTPVersion}")
.SetImage(resp.DataAsTexture2D);
}
// Images from the second host
foreach (var path in host_2_image_paths)
{
var request = HTTPRequest.CreateGet(new Uri(host_2, path));
request.DownloadSettings.DisableCache = true;
var resp = await request.GetHTTPResponseAsync();
CreateUIItemWithImage(host_2.Host)
.SetStatusText($"http/{resp.HTTPVersion}")
.SetImage(resp.DataAsTexture2D);
}
}
private void OnDisable()
=> HTTPManager.PerHostSettings.Clear();
MultiTextListItem CreateUIItem(string str)
=> Instantiate(this._listItemPrefab, this._contentRoot)
.SetText(str) as MultiTextListItem;
TextWithImageListItem CreateUIItemWithImage(string str)
=> Instantiate(this._listItemWithImagePrefab, this._contentRoot)
.SetText(str) as TextWithImageListItem;
}
}