コード例 #1
0
 public void StartUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask)
 {
     try
     {
         var urlToFetch = urlSchemeTask.Request.Url.ToString();
         if (!urlToFetch.Contains("favicon"))
         {
             var safeResponse   = AsyncContext.Run(() => WebFetchService.FetchResourceAsync(urlToFetch));
             var stream         = new MemoryStream(safeResponse.Data);
             var response       = new NSUrlResponse(urlSchemeTask.Request.Url, safeResponse.MimeType, (nint)stream.Length, null);
             var currentWebView = webView as HybridWebViewRenderer;
             currentWebView.SetCurrentPageVersion(safeResponse.CurrentNrsVersion);
             currentWebView.SetLatestPageVersion(safeResponse.LatestNrsVersion);
             urlSchemeTask.DidReceiveResponse(response);
             urlSchemeTask.DidReceiveData(NSData.FromStream(stream));
             urlSchemeTask.DidFinish();
         }
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         if (ex.InnerException != null)
         {
             var stream   = new MemoryStream();
             var response = new NSUrlResponse(urlSchemeTask.Request.Url, "text/html", 0, null);
             urlSchemeTask.DidReceiveResponse(response);
             urlSchemeTask.DidReceiveData(NSData.FromStream(stream));
             urlSchemeTask.DidFinish();
         }
     }
 }
コード例 #2
0
        public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest request)
        {
            try
            {
                Logger.Info($"Requested Url: {request.Url.ToString()}");
                var urlToFetch    = request.Url.ToString().Replace(Constants.BufferText, string.Empty);
                var isHttpRequest = request.Url.Scheme == "https";
                if (isHttpRequest && !urlToFetch.Contains("favicon"))
                {
                    var requestHeaders = request.RequestHeaders;

                    if (requestHeaders.ContainsKey("Range"))
                    {
                        var options = new WebFetchOptions
                        {
                            Range = RequestHelpers.RangeStringToArray(requestHeaders["Range"])
                        };

                        var task         = WebFetchService.FetchResourceAsync(urlToFetch, options);
                        var safeResponse = task.WaitAndUnwrapException();

                        var stream   = new MemoryStream(safeResponse.Data);
                        var response = new WebResourceResponse(safeResponse.MimeType, "UTF-8", stream);
                        response.SetStatusCodeAndReasonPhrase(206, "Partial Content");
                        response.ResponseHeaders = new Dictionary <string, string>
                        {
                            { "Accept-Ranges", "bytes" },
                            { "content-type", safeResponse.MimeType },
                            { "Content-Range", safeResponse.Headers["Content-Range"] },
                            { "Content-Length", safeResponse.Headers["Content-Length"] },
                        };
                        return(response);
                    }
                    else
                    {
                        var safeResponse = WebFetchService.FetchResourceAsync(urlToFetch).Result;
                        var stream       = new MemoryStream(safeResponse.Data);
                        var response     = new WebResourceResponse(safeResponse.MimeType, "UTF-8", stream);
                        return(response);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);

                if (ex.InnerException != null)
                {
                    using (var stream = new MemoryStream())
                    {
                        var urlToFetch = request.Url.ToString().Replace(Constants.BufferText, string.Empty);
                        var mimeType   = MimeTypeMap.Singleton.GetMimeTypeFromExtension(urlToFetch) ?? "text/html";
                        var response   = new WebResourceResponse(mimeType, "UTF-8", stream);
                        response.SetStatusCodeAndReasonPhrase(404, "Not Found");
                        return(response);
                    }
                }
            }
            return(base.ShouldInterceptRequest(view, request));
        }
コード例 #3
0
        private void DownloadMedia()
        {
            try
            {
                var task             = WebFetchService.FetchResourceAsync(_imageDownloadData);
                var webFetchResponse = task.WaitAndUnwrapException();

                var bitmap = BitmapFactory.DecodeByteArray(
                    webFetchResponse.Data,
                    0,
                    webFetchResponse.Data.Length);

                if (bitmap == null)
                {
                    // work around as some jpg images are encoded incorrectly
                    FileHelper.SaveImageAtDownloads(webFetchResponse.Data, _fileName);
                }
                else
                {
                    FileHelper.ExportBitmapAsFile(bitmap, webFetchResponse.MimeType, _fileName);
                }
            }
            catch (Exception ex)
            {
                Logger.Debug(ex);
                throw;
            }
        }
コード例 #4
0
 public void StartUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask)
 {
     try
     {
         var urlToFetch = urlSchemeTask.Request.Url.ToString();
         if (!urlToFetch.Contains("favicon"))
         {
             var safeResponse = AsyncContext.Run(() => WebFetchService.FetchResourceAsync(urlToFetch));
             var stream       = new MemoryStream(safeResponse.Data);
             var response     = new NSUrlResponse(urlSchemeTask.Request.Url, safeResponse.MimeType, (nint)stream.Length, null);
             urlSchemeTask.DidReceiveResponse(response);
             urlSchemeTask.DidReceiveData(NSData.FromStream(stream));
             urlSchemeTask.DidFinish();
         }
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         if (ex.InnerException != null)
         {
             var urlToFetch = urlSchemeTask.Request.Url.ToString();
             var stream     = new MemoryStream();
             var mimeType   = MimeMapping.MimeUtility.GetMimeMapping(urlToFetch) ?? "text/html";
             var response   = new NSUrlResponse(urlSchemeTask.Request.Url, mimeType, 0, null);
             urlSchemeTask.DidReceiveResponse(response);
             urlSchemeTask.DidReceiveData(NSData.FromStream(stream));
             urlSchemeTask.DidFinish();
         }
     }
 }