protected override RequestHandlingFashion ProcessRequestAsync(CefRequest request, CefCallback callback) { Task.Run(async() => { try { var httpRequest = WebRequest.CreateHttp(request.Url); var headers = request.GetHeaderMap(); foreach (var key in request.GetHeaderMap().AllKeys) { httpRequest.Headers.Add(key, headers[key]); } var response = await httpRequest.GetResponseAsync(); Response = response.GetResponseStream(); Headers = response.Headers; // we have to smash any existing value here Headers.Remove(AccessControlAllowOriginHeaderKey); Headers.Add(AccessControlAllowOriginHeaderKey, "*"); } catch { // we should catch exceptions.. network errors cannot crash the app } finally { callback.Continue(); } }); return(RequestHandlingFashion.ContinueAsync); }
protected override bool ProcessRequest(CefRequest request, CefCallback callback) { var requestNo = Interlocked.Increment(ref _requestNo); var response = new StringBuilder(); response.AppendFormat("<pre>\n"); response.AppendFormat("Requests processed by DemoAppResourceHandler: {0}\n", requestNo); response.AppendFormat("Method: {0}\n", request.Method); response.AppendFormat("URL: {0}\n", request.Url); response.AppendLine(); response.AppendLine("Headers:"); var headers = request.GetHeaderMap(); foreach (string key in headers) { foreach (var value in headers.GetValues(key)) { response.AppendFormat("{0}: {1}\n", key, value); } } response.AppendLine(); response.AppendFormat("</pre>\n"); responseData = Encoding.UTF8.GetBytes(response.ToString()); callback.Continue(); return(true); }
protected override bool ProcessRequest(CefRequest request, CefCallback callback) { var requestNo = Interlocked.Increment(ref _requestNo); var response = new StringBuilder(); response.AppendFormat("<pre>\n"); response.AppendFormat("Requests processed by DemoAppResourceHandler: {0}\n", requestNo); response.AppendFormat("Method: {0}\n", request.Method); response.AppendFormat("URL: {0}\n", request.Url); response.AppendLine(); response.AppendLine("Headers:"); var headers = request.GetHeaderMap(); foreach (string key in headers) { foreach (var value in headers.GetValues(key)) { response.AppendFormat("{0}: {1}\n", key, value); } } response.AppendLine(); response.AppendFormat("</pre>\n"); responseData = Encoding.UTF8.GetBytes(response.ToString()); callback.Continue(); return true; }
/// <summary> /// 创建 WebRequest /// </summary> /// <param name="request">CefRequest</param> /// <returns>WebRequest</returns> public static WebRequest Create(CefRequest request) { var uri = new Uri(request.Url); var headers = request.GetHeaderMap(); (byte[] rawData, string[] uploadFiles) = GetPostData(request); var webRequest = new WebRequest(uri, request.Method, headers, rawData, uploadFiles, request); return(webRequest); }
/// <summary> /// Builds http request message from cef request /// </summary> /// <param name="cefRequest"></param> protected virtual HttpRequestMessage BuildHttpRequest(CefRequest cefRequest) { var httpRequest = new HttpRequestMessage(GetHttpMethod(cefRequest.Method), cefRequest.Url); var cefHeaders = cefRequest.GetHeaderMap(); foreach (var key in cefHeaders.AllKeys) { httpRequest.Headers.TryAddWithoutValidation(key, cefHeaders.GetValues(key)); } if (cefRequest.PostData != null && cefRequest.PostData.Count > 0) { httpRequest.Content = new StreamContent(new CefPostDataStream(cefRequest.PostData.GetElements())); } return(httpRequest); }
protected override bool OnBeforeResourceLoad(CefBrowser browser, CefFrame frame, CefRequest request) { bool ua = ConfigHelper2.GetBoolValue("UseUserAgent"); if (ua) { var map = request.GetHeaderMap(); if (map.Get("user-agent") != "" && GlobalCefGlue.UserAgent != "") { map.Set("user-agent", GlobalCefGlue.UserAgent); } } return(base.OnBeforeResourceLoad(browser, frame, request)); }
/// <summary> /// Read the request, then process it through the OWIN pipeline /// then populate the response properties. /// </summary> /// <param name="request">request</param> /// <param name="callback">callback</param> /// <returns>always returns true as we'll handle all requests this handler is registered for.</returns> public override CefReturnValue ProcessRequestAsync(CefRequest request, CefCallback callback) { var requestBody = Stream.Null; if (request.Method == "POST") { using (var postData = request.PostData) { if (postData != null) { var postDataElements = postData.GetElements(); var firstPostDataElement = postDataElements.First(); var bytes = firstPostDataElement.GetBytes(); requestBody = new MemoryStream(bytes, 0, bytes.Length); //TODO: Investigate how to process multi part POST data //var charSet = request.GetCharSet(); //foreach (var element in elements) //{ // if (element.Type == PostDataElementType.Bytes) // { // var body = element.GetBody(charSet); // } //} } } } var uri = new Uri(request.Url); var requestHeaders = request.GetHeaderMap(); //Add Host header as per http://owin.org/html/owin.html#5-2-hostname requestHeaders.Add("Host", uri.Host + (uri.Port > 0 ? (":" + uri.Port) : "")); var owinRequest = new ResourceRequest(request.Url, request.Method, requestHeaders, requestBody); //PART 2 - Spawn a new task to execute the OWIN pipeline //We execute this in an async fashion and return true so other processing //can occur Task.Run(async() => { try { //Call into the OWIN pipeline var owinResponse = await RequestInterceptor.ProcessRequest(_appFunc, owinRequest); //Populate the response properties Stream = owinResponse.Stream; ResponseLength = owinResponse.Stream.Length; StatusCode = owinResponse.StatusCode; var responseHeaders = owinResponse.Headers; if (responseHeaders.ContainsKey("Content-Type")) { var contentType = responseHeaders["Content-Type"].First(); MimeType = contentType.Split(';').First(); } else { MimeType = DefaultMimeType; } //Add the response headers from OWIN to the Headers NameValueCollection foreach (var responseHeader in responseHeaders) { //It's possible for headers to have multiple values foreach (var val in responseHeader.Value) { Headers.Add(responseHeader.Key, val); } } } catch (Exception ex) { int statusCode = (int)HttpStatusCode.InternalServerError; var responseData = GetByteArray("Error: " + ex.ToString(), System.Text.Encoding.UTF8, true); //Populate the response properties Stream = new MemoryStream(responseData); ResponseLength = responseData.Length; StatusCode = statusCode; MimeType = "text/html"; } //Once we've finished populating the properties we execute the callback //Callback wraps an unmanaged resource, so let's explicitly Dispose when we're done using (callback) { callback.Continue(); } }); return(CefReturnValue.ContinueAsync); }
protected override bool ProcessRequest(CefRequest request, CefCallback callback) { var requestNo = Interlocked.Increment(ref _requestNo); var response = new StringBuilder(); var headers = request.GetHeaderMap(); foreach (string key in headers) { foreach (var value in headers.GetValues(key)) { //此处通知某某方法的执行情况 //状态,XX方法,执行情况(1 或者 0) // response.AppendFormat("{0}: {1}\n", key, value); } } response.AppendFormat("ok"); var d1 = GlobalVar.ExtractPar(request.Url); // GlobalVar.Notifyjs2Csahrp(d1["statue"], d1["method"], d1["result"]); LogManager.WriteLog(d1["statue"] + d1["method"] + d1["result"]); if (d1.ContainsKey("encoding") && d1["encoding"] == "gb2312") { GlobalVar.jsTmpValue = HttpUtility.UrlDecode(d1["result"], Encoding.GetEncoding("gb2312")); } else { GlobalVar.jsTmpValue = HttpUtility.UrlDecode(d1["result"], Encoding.UTF8); } LogManager.WriteLog("IsloadOkAutoResetEvent 释放"); GlobalVar.IsloadOkAutoResetEvent.Set(); /* * response.AppendFormat("<pre>\n"); * response.AppendFormat("Requests processed by DemoAppResourceHandler: {0}\n", requestNo); * * response.AppendFormat("Method: {0}\n", request.Method); * response.AppendFormat("URL: {0}\n", request.Url); * * response.AppendLine(); * response.AppendLine("Headers:"); * var headers = request.GetHeaderMap(); * foreach (string key in headers) * { * foreach (var value in headers.GetValues(key)) * { * response.AppendFormat("{0}: {1}\n", key, value); * } * } * response.AppendLine(); * * response.AppendFormat("</pre>\n");*/ responseData = Encoding.UTF8.GetBytes(response.ToString()); callback.Continue(); return(true); }
/// <summary> /// Read the request, then process it through the OWIN pipeline /// then populate the response properties. /// </summary> /// <param name="request">request</param> /// <param name="callback">callback</param> /// <returns>always returns true as we'll handle all requests this handler is registered for.</returns> public override CefReturnValue ProcessRequestAsync(CefRequest request, CefCallback callback) { var requestBody = Stream.Null; if (request.Method == "POST") { using var postData = request.PostData; if (postData is not null) { var postDataElements = postData.GetElements(); var firstPostDataElement = postDataElements.First(); var bytes = firstPostDataElement.GetBytes(); requestBody = new MemoryStream(bytes, 0, bytes.Length); } } var uri = new Uri(request.Url); var requestHeaders = request.GetHeaderMap(); //Add Host header as per http://owin.org/html/owin.html#5-2-hostname requestHeaders.Add("Host", uri.Host + (uri.Port > 0 ? (":" + uri.Port) : "")); Task.Run(async() => { IChromelyResource chromelyResource = new ChromelyResource(); try { // Call into the OWIN pipeline var owinRequest = new ResourceRequest(request.Url, request.Method, requestHeaders, requestBody); var owinResponse = await RequestInterceptor.ProcessRequest(_owinPipeline.AppFunc, owinRequest); chromelyResource = new ChromelyResource() { Content = owinResponse.Stream as MemoryStream, MimeType = owinResponse.Headers.GetMimeType(), StatusCode = (HttpStatusCode)owinResponse.StatusCode, StatusText = owinResponse.ReasonPhrase, Headers = owinResponse.Headers }; if (chromelyResource.StatusCode.IsClientErrorCode() || chromelyResource.StatusCode.IsServerErrorCode()) { chromelyResource = await _errorHandler.HandleErrorAsync(request.Url, chromelyResource, null); } } catch (Exception exception) { chromelyResource = await _errorHandler.HandleErrorAsync(request.Url, chromelyResource, exception); } //Populate the response properties Stream = chromelyResource.Content ?? Stream.Null; ResponseLength = (chromelyResource.Content == null) ? 0 : chromelyResource.Content.Length; StatusCode = (int)chromelyResource.StatusCode; MimeType = chromelyResource.MimeType; foreach (var header in chromelyResource.Headers) { //It's possible for headers to have multiple values foreach (var val in header.Value) { Headers.Add(header.Key, val); } } //Once we've finished populating the properties we execute the callback //Callback wraps an unmanaged resource, so let's explicitly Dispose when we're done using (callback) { callback.Continue(); } }); return(CefReturnValue.ContinueAsync); }
protected override bool Open(CefRequest request, out bool handleRequest, CefCallback callback) { var uri = new Uri(request.Url); var headers = request.GetHeaderMap(); if (!string.IsNullOrEmpty(headers.Get("range"))) { var rangeString = headers.Get("range"); var group = System.Text.RegularExpressions.Regex.Match(rangeString, @"(?<start>\d+)-(?<end>\d*)")?.Groups; if (group != null) { if (!string.IsNullOrEmpty(group["start"].Value) && int.TryParse(group["start"].Value, out int startPos)) { _buffStartPostition = startPos; } if (!string.IsNullOrEmpty(group["end"].Value) && int.TryParse(group["end"].Value, out int endPos)) { _buffEndPostition = endPos; } } _isPartContent = true; } _readStreamOffset = 0; if (_buffStartPostition.HasValue) { _readStreamOffset = _buffStartPostition.Value; } byte[] postData = null; var uploadFiles = new List <string>(); if (request.PostData != null) { var items = request.PostData.GetElements(); if (items != null && items.Length > 0) { var bytes = new List <byte>(); foreach (var item in items) { var buffer = item.GetBytes(); //var size = (int)item.BytesCount; switch (item.ElementType) { case CefPostDataElementType.Bytes: bytes.AddRange(buffer); break; case CefPostDataElementType.File: uploadFiles.Add(item.GetFile()); break; } } postData = bytes.ToArray(); bytes = null; } } var method = request.Method; var resourceRequest = new ResourceRequest(uri, method, headers, postData, uploadFiles.ToArray(), request); handleRequest = false; Task.Run(() => { try { Infos.Add($"[{request.Method}]"); Infos.Add($"{resourceRequest.RequestUrl}"); _resourceResponse = GetResourceResponse(resourceRequest); if (_resourceResponse == null) { //callback.Cancel(); //return; throw new NullReferenceException($"ResourceResponse should not be null."); } if (DisableCORS) { _resourceResponse.Headers.Set(ACCESS_CONTROL_ALLOW_HEADERS, "*"); _resourceResponse.Headers.Set(ACCESS_CONTROL_ALLOW_METHODS, "*"); _resourceResponse.Headers.Set(X_FRAME_OPTIONS, "ALLOWALL"); if (!string.IsNullOrEmpty(request.GetHeaderByName("origin"))) { _resourceResponse.Headers.Set(ACCESS_CONTROL_ALLOW_ORIGIN, request.GetHeaderByName("origin")); _resourceResponse.Headers.Set(ACCESS_CONTROL_MAX_AGE, "3600"); } else { _resourceResponse.Headers.Set(ACCESS_CONTROL_ALLOW_ORIGIN, "*"); } } Infos.Add($"{(int)_resourceResponse.HttpStatus} {_resourceResponse.HttpStatus}"); } catch (Exception ex) { Logger.Error(ex, "ResourceHandler"); callback.Cancel(); } }, _cancellationTokenSource.Token).ContinueWith(t => callback.Continue()); return(true); }