. net原生应用程序相当于修改标题Firefox插件

本文关键字:标题 Firefox 插件 修改 相当于 原生 应用程序 net | 更新日期: 2023-09-27 18:07:00

我试图在c#中开发一个socks隧道应用程序,该应用程序能够通过使用添加和修改报头请求(类似于修改报头Firefox插件)打开网站,并通过代理(socks首选)隧道数据。请问有人能说明我可能需要的任何资源吗?或者任何可以执行相同功能的替代方案,我可以在此基础上构建的开源软件,等等。谢谢!

ps:应用程序还应该能够打开HTTPS和其他常见的网络协议

. net原生应用程序相当于修改标题Firefox插件

一种方法是使用HttpSys并创建一个本地代理服务器来处理环回127.0.0.1地址上的请求。您可以将系统代理更改为此地址/端口,并位于客户端和服务器之间。

这将允许你修改请求/响应包&头。这里有一个c#中这种方法的例子,我在下面修改了它来展示它是如何工作的。

public class MyProxy
{
    private readonly HttpListener listener;
    public MyProxy()
    {
        listener = new HttpListener();
    }
    public void Start()
    {
        listener.Prefixes.Add("http://*:8888/");
        listener.Prefixes.Add("https://*:8889/");
        listener.Start();
        Console.WriteLine("Proxy started, hit enter to stop");
        listener.BeginGetContext(GetContextCallback, null);
        Console.ReadLine();
        listener.Stop();
    }
    public void GetContextCallback(IAsyncResult result)
    {
        var context = listener.EndGetContext(result);
        listener.BeginGetContext(GetContextCallback, null);
        var request = context.Request;
        var response = context.Response;
        var url = request.Url;
        UriBuilder builder = new UriBuilder(url);
        builder.Port = url.Port == 8888 ? 80 : 443;
        url = builder.Uri;
        WebRequest webRequest = WebRequest.Create(url);
        webRequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
        WebResponse webResponse = webRequest.GetResponse();
        using (Stream reader = webResponse.GetResponseStream())
        {
            using (Stream writer = response.OutputStream)
            {
                reader.CopyTo(writer);
            }
        }
    }
}

这种方法的缺点是它的级别很低,并且会影响用户机器上的所有流量,这可能不是理想的。您必须处理SSL请求,并且它还会影响任何现有配置的代理。

另一种替代方法是使用Microsoft Internet Controls COM组件并扩展WebBrowser类。这里有一个SO问题显示了这种方法。不幸的是,. net名称空间中的WebBrowser版本没有实现请求响应对象。下面是有趣的部分。

public class ExtendedWebBrowser : WebBrowser
{
    ...
    void BeforeNavigate(object pDisp, ref object url, ref object flags,
                       ref object targetFrameName, ref object postData, 
                       ref object headers, ref bool cancel)
    {
         if (!headers.Contains("X-RequestFlag")
         {
             headers += "X-RequestFlag: true'r'n";
             // append custom header here
             // cancel current request
             cancel = true;
             // re-request with amended details
             Navigate((string)url, (string)targetFrameName, (byte[])postData, 
                      (string)headers);
         }
         else
         {
             base.BeforeNavigate(...);
         }
    }
}