Esempio n. 1
0
        static IDownload FetchWithCors(this IResourceLoader loader, Url url, ResourceRequest request, CorsSetting setting, OriginBehavior behavior)
        {
            var download = loader.DownloadAsync(new ResourceRequest(request.Source, url)
            {
                Origin = request.Origin,
                IsManualRedirectDesired = true
            });

            return(download.Wrap(response =>
            {
                if (response.IsRedirected())
                {
                    url.Href = response.Headers.GetOrDefault(HeaderNames.Location, url.Href);

                    if (request.Origin.Is(url.Origin))
                    {
                        return loader.FetchWithCors(new ResourceRequest(request.Source, url)
                        {
                            IsCookieBlocked = request.IsCookieBlocked,
                            IsSameOriginForced = request.IsSameOriginForced,
                            Origin = request.Origin
                        }, setting, behavior);
                    }

                    return loader.FetchWithCors(url, request, setting, behavior);
                }
                else
                {
                    return download;
                }
            }));
        }
Esempio n. 2
0
 private IDownload DownloadWithCors(ResourceRequest request)
 {
     return(_loader.FetchWithCors(new CorsRequest(request)
     {
         Setting = _link.CrossOrigin.ToEnum(CorsSetting.None),
         Behavior = OriginBehavior.Taint,
         Integrity = _document.Options.GetProvider <IIntegrityProvider>()
     }));
 }
Esempio n. 3
0
        /// <summary>
        /// Performs a potentially CORS-enabled fetch from the given URI by
        /// using an asynchronous GET request. For more information see:
        /// http://www.w3.org/TR/html5/infrastructure.html#potentially-cors-enabled-fetch
        /// </summary>
        /// <param name="loader">The resource loader to use.</param>
        /// <param name="request">The request to issue.</param>
        /// <param name="setting">The cross origin settings to use.</param>
        /// <param name="behavior">
        /// The default behavior in case it is undefined.
        /// </param>
        /// <returns>
        /// The task that will eventually give the resource's response data.
        /// </returns>
        public static IDownload FetchWithCors(this IResourceLoader loader, ResourceRequest request, CorsSetting setting, OriginBehavior behavior)
        {
            var url = request.Target;

            if (request.Origin == url.Origin || url.Scheme == ProtocolNames.Data || url.Href == "about:blank")
            {
                return(loader.FetchWithCors(url, request, setting, behavior));
            }
            else if (setting == CorsSetting.Anonymous || setting == CorsSetting.UseCredentials)
            {
                return(loader.FetchWithCors(request, setting));
            }
            else if (setting == CorsSetting.None)
            {
                return(loader.FetchWithoutCors(request, behavior));
            }

            throw new DomException(DomError.Network);
        }
Esempio n. 4
0
        public Task Process(ResourceRequest request)
        {
            if (_loader != null && Engine != null)
            {
                var setting  = _script.CrossOrigin.ToEnum(CorsSetting.None);
                var behavior = OriginBehavior.Taint;
                _download = _loader.FetchWithCors(request, setting, behavior);
                return(_download.Task);
            }

            return(null);
        }
Esempio n. 5
0
        public Task ProcessAsync(ResourceRequest request)
        {
            if (_loader != null && Engine != null)
            {
                Download = _loader.FetchWithCors(new CorsRequest(request)
                {
                    Behavior  = OriginBehavior.Taint,
                    Setting   = _script.CrossOrigin.ToEnum(CorsSetting.None),
                    Integrity = _document.Options.GetProvider <IIntegrityProvider>()
                });
                return(Download.Task);
            }

            return(null);
        }
Esempio n. 6
0
        private static IDownload FetchFromSameOrigin(this IResourceLoader loader, Url url, CorsRequest cors)
        {
            var request  = cors.Request;
            var download = loader.DownloadAsync(new ResourceRequest(request.Source, url)
            {
                Origin = request.Origin,
                IsManualRedirectDesired = true
            });

            return(download.Wrap(response =>
            {
                if (response.IsRedirected())
                {
                    url.Href = response.Headers.GetOrDefault(HeaderNames.Location, url.Href);

                    return request.Origin.Is(url.Origin) ?
                    loader.FetchWithCors(cors.RedirectTo(url)) :
                    loader.FetchFromSameOrigin(url, cors);
                }

                return cors.CheckIntegrity(download);
            }));
        }