< Summary

Class:MainScripts.DCL.ServiceProviders.OpenSea.RequestController
Assembly:OpenSea_Internal
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestController.cs
Covered lines:8
Uncovered lines:56
Coverable lines:64
Total lines:176
Line coverage:12.5% (8 of 64)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:11
Method coverage:18.1% (2 of 11)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
RequestController(...)0%110100%
Dispose()0%110100%
FetchNFT(...)0%6200%
FetchOwnedNFT(...)0%6200%
SendRequest(...)0%2100%
OnRequestFailed(...)0%2100%
OnRequestFailed(...)0%2100%
AddToCache(...)0%6200%
AddToCache(...)0%6200%
RemoveFromCache(...)0%2100%
RemoveFromCache(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestController.cs

#LineLine coverage
 1using DCL;
 2using MainScripts.DCL.ServiceProviders.OpenSea.RequestHandlers;
 3using MainScripts.DCL.ServiceProviders.OpenSea.Requests;
 4using System;
 5using System.Collections.Generic;
 6using UnityEngine;
 7using UnityEngine.Networking;
 8using Environment = DCL.Environment;
 9
 10namespace MainScripts.DCL.ServiceProviders.OpenSea
 11{
 12    public class RequestController : IDisposable
 13    {
 14        private readonly KernelConfig kernelConfig;
 15        private const bool VERBOSE = false;
 16
 17        private const string EDITOR_USER_AGENT =
 18            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102
 19
 20        private const string EDITOR_REFERRER = "https://play.decentraland.org";
 21
 13022        internal readonly RequestScheduler.RequestScheduler requestScheduler = new ();
 13023        private readonly Dictionary<string, RequestBase<OpenSeaNftDto>> cacheAssetResponses = new ();
 13024        private readonly Dictionary<string, RequestBase<OpenSeaManyNftDto>> cacheSeveralAssetsResponse = new ();
 25
 13026        public RequestController(KernelConfig kernelConfig)
 27        {
 13028            this.kernelConfig = kernelConfig;
 13029            requestScheduler.OnRequestReadyToSend += SendRequest;
 13030        }
 31
 26032        public void Dispose() { requestScheduler.OnRequestReadyToSend -= SendRequest; }
 33
 34        public RequestBase<OpenSeaNftDto> FetchNFT(string chain, string contractAddress, string tokenId)
 35        {
 036            if (cacheAssetResponses.TryGetValue(RequestAssetSingle.GetId(contractAddress, tokenId), out RequestBase<Open
 037                return request;
 38
 039            var newRequest = new RequestAssetSingle(chain, contractAddress, tokenId);
 40
 041            AddToCache(newRequest);
 42
 043            newRequest.OnFail += OnRequestFailed;
 44
 045            var requestHandler = new SingleAssetRequestHandler(newRequest, this, kernelConfig);
 046            requestScheduler.EnqueueRequest(requestHandler);
 47
 048            return newRequest;
 49        }
 50
 51        public RequestBase<OpenSeaManyNftDto> FetchOwnedNFT(string address)
 52        {
 053            if (cacheSeveralAssetsResponse.TryGetValue(RequestOwnedNFTs.GetId(address), out RequestBase<OpenSeaManyNftDt
 54            {
 055                return request;
 56            }
 57
 058            var newRequest = new RequestOwnedNFTs(address);
 59
 060            AddToCache(newRequest);
 61
 062            newRequest.OnFail += OnRequestFailed;
 63
 064            var requestHandler = new OwnedNFTRequestHandler(newRequest, this, kernelConfig);
 065            requestScheduler.EnqueueRequest(requestHandler);
 66
 067            return newRequest;
 68        }
 69
 70        private void SendRequest(IRequestHandler requestHandler)
 71        {
 072            string url = requestHandler.GetUrl();
 73
 74            if (VERBOSE)
 75                Debug.Log($"RequestController: Send Request: {url}");
 76
 077            Dictionary<string, string> headers = new Dictionary<string, string>();
 78
 79#if (UNITY_EDITOR) || (UNITY_STANDALONE)
 080            headers.Add("User-Agent", EDITOR_USER_AGENT);
 081            headers.Add("referrer", EDITOR_REFERRER);
 82#endif
 83
 84            // NOTE: In this case, as this code is implementing a very specific retries system (including delays), we us
 85            //              custom WebRequest system without retries (requestAttemps = 1) and let the current code to ap
 086            WebRequestAsyncOperation asyncOp = (WebRequestAsyncOperation) Environment.i.platform.webRequest.Get(
 87                url,
 88                requestAttemps: 1,
 89                disposeOnCompleted: true,
 90                headers: headers);
 91
 092            asyncOp.completed += operation =>
 93            {
 094                UnityWebRequest unityWebRequest = operation.webRequest;
 095                bool shouldTryToRetry = true;
 096                string serverResponse = unityWebRequest.downloadHandler.text;
 97
 98                if (VERBOSE)
 99                    Debug.Log($"RequestController: Request completed: success? {unityWebRequest.result == UnityWebReques
 100
 0101                if (unityWebRequest.result == UnityWebRequest.Result.Success)
 102                {
 0103                    requestHandler.SetApiResponse(serverResponse,
 104                        () =>
 105                        {
 106                            if (VERBOSE)
 107                                Debug.Log($"RequestController: Request Succeeded: {url}");
 108
 0109                            shouldTryToRetry = false;
 0110                        },
 111                        error =>
 112                        {
 0113                            serverResponse = $"RequestController: Parse Request Error: {url}: {error}";
 114
 115                            if (VERBOSE)
 116                                Debug.Log(serverResponse);
 0117                        });
 118                }
 119
 0120                if (shouldTryToRetry)
 121                {
 0122                    if (requestHandler.CanRetry())
 123                    {
 0124                        requestHandler.Retry();
 125                    }
 126                    else
 127                    {
 0128                        requestHandler.SetApiResponseError($"[{url}] {serverResponse}");
 129                    }
 130                }
 131
 0132                unityWebRequest.Dispose();
 0133            };
 0134        }
 135
 136        private void OnRequestFailed(RequestBase<OpenSeaManyNftDto> request)
 137        {
 0138            request.OnFail -= OnRequestFailed;
 139
 0140            RemoveFromCache(request);
 0141        }
 142
 143        private void OnRequestFailed(RequestBase<OpenSeaNftDto> request)
 144        {
 0145            request.OnFail -= OnRequestFailed;
 146
 0147            RemoveFromCache(request);
 0148        }
 149
 150        private void AddToCache(RequestBase<OpenSeaNftDto> request)
 151        {
 0152            if (cacheAssetResponses.ContainsKey(request.requestId))
 0153                return;
 154
 0155            cacheAssetResponses.Add(request.requestId, request);
 0156        }
 157
 158        private void AddToCache(RequestBase<OpenSeaManyNftDto> request)
 159        {
 0160            if (cacheSeveralAssetsResponse.ContainsKey(request.requestId))
 0161                return;
 162
 0163            cacheSeveralAssetsResponse.Add(request.requestId, request);
 0164        }
 165
 166        private void RemoveFromCache(RequestBase<OpenSeaNftDto> request)
 167        {
 0168            cacheAssetResponses.Remove(request.requestId);
 0169        }
 170
 171        private void RemoveFromCache(RequestBase<OpenSeaManyNftDto> request)
 172        {
 0173            cacheSeveralAssetsResponse.Remove(request.requestId);
 0174        }
 175    }
 176}