/// <summary>
        /// Sends a JSON request.
        /// </summary>
        /// <typeparam name="T">Type of response.</typeparam>
        /// <param name="verb">HTTP verb.</param>
        /// <param name="url">Complete endpoint url.</param>
        /// <param name="payload">Object to send.</param>
        /// <returns></returns>
        private IAsyncToken <HttpResponse <T> > SendRequest <T>(
            HttpVerb verb,
            string url,
            object payload)
        {
            Log.Info(this,
                     "{0} {1}",
                     verb.ToString().ToUpperInvariant(),
                     url);

            var token = new AsyncToken <HttpResponse <T> >();

            byte[] bytes = null;
            if (null != payload)
            {
                _serializer.Serialize(payload, out bytes);
            }

            var request = new WWW(
                url,
                bytes,
                HeaderDictionary());

            _bootstrapper.BootstrapCoroutine(Wait(request, token));

            return(token);
        }
        /// <summary>
        /// Sends a JSON request.
        /// </summary>
        /// <typeparam name="T">Type of response.</typeparam>
        /// <param name="verb">HTTP verb.</param>
        /// <param name="url">Complete endpoint url.</param>
        /// <param name="payload">Object to send.</param>
        /// <returns></returns>
        private IAsyncToken <HttpResponse <T> > SendRequest <T>(
            HttpVerb verb,
            string url,
            object payload)
        {
            var data        = Services.ResolveServiceData(url);
            var service     = data.Item1;
            var resolvedUrl = data.Item2;
            var headers     = data.Item3;

            Log(verb.ToString(), resolvedUrl, service, payload);

            var token = new AsyncToken <HttpResponse <T> >();

            byte[] bytes = null;
            if (null != payload)
            {
                _serializer.Serialize(payload, out bytes);
            }

            var request = new WWW(
                resolvedUrl,
                bytes,
                HeaderDictionary(headers));

            _bootstrapper.BootstrapCoroutine(Wait(request, token));

            return(token);
        }
        /// <inheritdoc cref="IHttpService"/>
        public IAsyncToken <HttpResponse <byte[]> > Download(string url)
        {
            var token = new AsyncToken <HttpResponse <byte[]> >();

            var request = UnityWebRequest.Get(url);

            _requestsOut.Add(request);

            ApplyHeaders(Headers, request);

            _bootstrapper.BootstrapCoroutine(Wait(
                                                 request,
                                                 token,
                                                 SerializationType.Raw));

            return(token);
        }
        /// <inheritdoc />
        public IAsyncToken <HttpResponse <byte[]> > Download(string url)
        {
            var token = new AsyncToken <HttpResponse <byte[]> >();

            var request = UnityWebRequest.Get(url);

            _requestsOut.Add(request);

            var service = Services.Process(request);

            // Log after Processing
            Log("GET", url, service);

            _bootstrapper.BootstrapCoroutine(Wait(
                                                 request,
                                                 token,
                                                 SerializationType.Raw));

            return(token);
        }