Как передать заголовок из cefsharpwebbrowser на веб-страницу (PHP) - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь передать значение заголовка в файлах PHP, когда браузер (cefSharpWebBrowser) запрашивает веб-страницу в WPF C#.

В моем кодовом файле PHP я пишу ниже logi c.

возможность просмотра заголовков HTTP, обращающихся к https://www. ****. com / temp_header_check. php, к которым можно получить доступ по этому пути:

эта строка означает отображение всех заголовков, которые мы передали этим PHP файлам

Что я пробовал:

Я пробовал ниже код для передачи значений заголовка для каждого запрошенного PHP файла в событии браузера BeforeResourceLoad. В этом коде я не получил никакой ошибки, но не вижу значения переданных заголовков в файлы PHP.

Попробуйте 1 ------------- ------

public class CustomResourceRequestHandler : ResourceRequestHandler
{
    private string _signature;
    public CustomResourceRequestHandler(string signature)
    {
        _signature = GetSetComanDetails.Signature;
    }

    protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
    {
        if (request.Url.Contains("https://****.com"))
        {
            if (!string.IsNullOrEmpty(GetSetComanDetails.Signature))
            {
                var headers = request.Headers;
                headers["s"] = GetSetComanDetails.Signature;
                request.Headers = headers;
                return CefReturnValue.Continue;
            }
            else return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
        }
        else return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
    }

}
public class CustomRequestHandler : RequestHandler
{
    private string _signature;
    public CustomRequestHandler(string signature)
    {
        _signature = GetSetComanDetails.Signature;
    }

    protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
    {
        if (request.Url.Contains("https://****.com") && request.Url.Contains(".php"))
        {
            if (!string.IsNullOrEmpty(GetSetComanDetails.Signature)) return new CustomResourceRequestHandler(GetSetComanDetails.Signature);
            else return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling);
        }
        else return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling);
    }
}

Это событие вызывается, когда мы вызываем URL в браузере CefSharp в WPF.

chromium = (ChromiumWebBrowser)this.FindName("cefSharpWebBrowser");
cefSharpWebBrowser.Address = "https://****/access.php?type=desktop";
chromium.RequestHandler = new CustomRequestHandler("");

Попробуйте 2 ------- ------------

Реализация приведенного ниже интерфейса

CefSharp/IRequestHandler.cs at cefsharp/43 · cefsharp/CefSharp · GitHub[^]

https://github.com/cefsharp/CefSharp/blob/cefsharp/43/CefSharp/IRequestHandler.cs

Попробуй 3 -------------------

chromium.ResourceHandlerFactory = new MyResourceHandlerFactory();

...

class MyResourceHandlerFactory : IResourceHandlerFactory
{
    public bool HasHandlers
    {
        get { return true; }
    }

    public IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request)
    {
        if (request.Url.StartsWith("http"))
            return new MyResourceHandler();
        return null;
    }
}

...

class MyResourceHandler : IResourceHandler
{
    private HttpWebRequest webRequest;
    private HttpWebResponse webResponse;
    private Stream requestStream;
    private byte[] requestBytes;
    ICallback callback;

    public Stream GetResponse(IResponse response, out long responseLength, out string redirectUrl)
    {
        responseLength = webResponse.ContentLength;
        redirectUrl = null;
        string type = webResponse.ContentType;
        // strip off the encoding, if present
        if (type.IndexOf("; ") > 0)
            type = type.Substring(0, type.IndexOf("; "));
        response.MimeType = type;
        // only a direct assignment works here, don't try to use other methods of the name/value collection;
        response.ResponseHeaders = webResponse.Headers;
        response.StatusCode = (int)webResponse.StatusCode;
        response.StatusText = webResponse.StatusDescription;
        // TODO return a wrapper around this stream to capture the response inline.
        return webResponse.GetResponseStream();
    }

    private void SendRequestBody(IAsyncResult result)
    {
        requestStream = webRequest.EndGetRequestStream(result);
        requestStream.BeginWrite(requestBytes, 0, requestBytes.Length, RequestSent, null);
    }

    private void RequestSent(IAsyncResult ar)
    {
        requestStream.EndWrite(ar);
        requestStream.Close();
        webRequest.BeginGetResponse(new AsyncCallback(Response), null);
    }

    private void Response(IAsyncResult ar)
    {
        webResponse = (HttpWebResponse)webRequest.EndGetResponse(ar);
        callback.Continue();
    }

    public bool ProcessRequestAsync(IRequest request, ICallback callback)
    {
        this.callback = callback;
        webRequest = (HttpWebRequest)WebRequest.Create(request.Url);
        webRequest.Method = request.Method;
        foreach (string key in request.Headers)
        {
            string value = request.Headers[key];
            // HttpWebRequest doesn't like it if you try to set these values through the Headers collection
            if ("Accept".Equals(key))
                webRequest.Accept = value;
            else if ("User-Agent".Equals(key))
                webRequest.UserAgent = value;
            else if ("Referer".Equals(key))
                webRequest.Referer = value;
            else if ("Content-Type".Equals(key))
                webRequest.ContentType = value;
            else if ("Content-Length".Equals(key))
                webRequest.ContentLength = Convert.ToInt32(value);
            else
                webRequest.Headers.Add(key, value);
        }
        if (!String.IsNullOrWhiteSpace(request.Body))
        {
            this.requestBytes = Encoding.UTF8.GetBytes(request.Body);
            webRequest.BeginGetRequestStream(new AsyncCallback(SendRequestBody), null);
        }
        else
        {
            webRequest.BeginGetResponse(new AsyncCallback(Response), null);
        }
        return true;
    }
}
...