重定向/覆盖资源请求,而无需更改CefSharp中的实际文件URL

时间:2019-04-16 15:20:45

标签: c# cefsharp

在CefSharp中,我需要将所有资源/文件请求从一个域(例如fileserver.com)重定向到另一个域(例如myfileserver.com),该域有时会进行一些修改以镜像相同的文件(例如更改的graphics / .png文件)。

我尝试用IRequestHandler实现一个OnBeforeResourceLoad,它将检查并转发所有从fileserver.commyfileserver.com的资源请求。例如:

public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
    string originalUrl = request.Url;
    if (request.Url.contains("http://fileserver.com"))
    {
        Console.WriteLine("fileserver.com: " + request.Url);

        string filename = GetFileName(request.Url);
        // e.g. http://fileserver.com/abc.png = abc.png

        // We want to use the files from myfileserver.com instead
        request.Url = "http://myfileserver.com/" + filename;
    }

    callback.Dispose();
    return CefReturnValue.Continue;
}

现在,上面的代码应该可以工作了(可以与HTML img标记一起使用),问题是fileserver.com用于Flash游戏,我认为它不能处理此类问题。正确重定向,因为它仍然希望从真实URL中获取文件,并且由于从URL中取消了原始URL,因此导致fileserver.commyfileserver.com中没有文件/图形被加载到Flash游戏中。重定向。

因此,我认为我必须执行重定向/覆盖fileserver.com请求的资源,而无需进行实际的URL更改。

作为替代方案,我一直试图将IResponseFilterIResponseFilter.Filter一起使用以直接覆盖文件[bytes?]而不是重定向。但是,我完全不知道该怎么做。

这里有一些伪代码,说明我如何想象它会如何工作(我现在在磁盘上有myfileserver.com个文件):

FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
{
    // For example, fileserver.com has requested file abc.png
    // Read bytes from my local version of the file from fileserver.com
    byte[] myLocalFileBytes = File.ReadAllBytes("myfileserver\\abc.png"); // name of requested file, not very sure how to retrieve this here

    // Write my file to the requested file from fileserver.com to replace it
    memoryStream.Write(myLocalFileBytes, 0, myLocalFileBytes.Length);
    // This is obviously completely wrong and probably even the wrong place, sorry!

    return FilterStatus.Done;
}

(我从filter in CefSharp repo那里得到了这个主意,因为我找不到其他方法来尝试不进行URL重定向而覆盖文件,但是不知道如何使其读取我的本地文件并在请求的文件上写入文件)

我的另一个想法是让myfileserver.com假装实际上是fileserver.com,但认为不可能。

我没有尝试像这样读取/写入内存的经验,所以我不知道该怎么办。谢谢您的帮助或反馈。

0 个答案:

没有答案