Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
    /// <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);
    }
Ejemplo n.º 10
0
        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);
        }