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(); } } }
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)); }
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; } }
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(); } } }