Frage

Ich schreibe ein Kommandozeilen-Tool für Windows, das Libcurl verwendet Dateien aus dem Internet herunterzuladen.

Offensichtlich ist, dass das Herunterladen nicht, wenn der Benutzer hinter einem Proxy-Server, weil der Proxy konfiguriert werden muss. Ich möchte mein Werkzeug so einfach wie möglich aber halten und haben den Benutzer nicht zu belasten, die den Proxy zu konfigurieren. Mein Werkzeug nicht einmal eine Konfigurationsdatei haben, so dass der Benutzer ansonsten in den Proxy-Einstellungen auf jedem Befehl passieren würde, oder eine Umgebungsvariable gesetzt, etc. zu jagen -. Viel zu viel Aufwand

So dachte ich, das Browser jeder wird in der Regel bereits richtig eingerichtet werden, Proxy konfiguriert und alles. Dies wird auch für den grundlegendste Benutzer wahr sein, weil sonst „ihr Internet nicht funktionieren würde“.

Also ich herausfinden, dass ich herausfinden kann, ob ein Proxy verwenden, indem Sie auf IE-Proxy-Einstellungen suchen.

Wie gehe ich dazu? Genauer gesagt:

  • Gibt es eine Reihe von "Proxy-Einstellungen" in Windows, von allen Browsern verwendet wird (wahrscheinlich IE), oder würde ich verschiedene Routinen für IE, Firefox, Opera zu schreiben, etc?
  • Ich weiß, dass ich wahrscheinlich die Werte direkt aus den entsprechenden Registrierungsstellen lesen können, wenn sie manuell konfiguriert werden, aber bedeutet dies auch die Arbeit mit „automatisch Proxy-Server erkennen?“ Ich muss auch bei dieser Option die Mühe machen, oder ist es (fast) nie benutzt?

Vor dem Start Leute darauf hindeutet Alternativen. Ich bin mit C, also bin ich auf der Win32-API beschränkt, und ich möchte wirklich, wirklich mit C und Libcurl halten

War es hilfreich?

Lösung

Die Funktion, die Sie suchen ist WinHttpGetIEProxyConfigForCurrentUser (), die unter http://msdn.microsoft.com/en-us/library/aa384096 (VS.85) aspx . Diese Funktion wird von Firefox und Opera verwendet, um ihre Proxy-Einstellungen standardmäßig zu bekommen, obwohl man sie pro-Browser außer Kraft setzen kann. obwohl Tu das nicht. Das Richtige zu tun (das ist, was alle anderen auch tun) ist nur noch die IE-Einstellungen zu erhalten und davon ausgehen, dass sie richtig sind, da sie fast immer sind.

Hier ist eine Probe der entsprechenden Logik, die Sie für Ihre Bedürfnisse anpassen sollten:

if( WinHttpGetIEProxyConfigForCurrentUser( &ieProxyConfig ) )
{
    if( ieProxyConfig.fAutoDetect )
    {
        fAutoProxy = TRUE;
    }

    if( ieProxyConfig.lpszAutoConfigUrl != NULL )
    {
        fAutoProxy = TRUE;
        autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl;
    }
}
else
{
    // use autoproxy
    fAutoProxy = TRUE;
}

if( fAutoProxy )
{
    if ( autoProxyOptions.lpszAutoConfigUrl != NULL )
    {
        autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
    }
    else
    {
        autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
        autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
    }

    // basic flags you almost always want
    autoProxyOptions.fAutoLogonIfChallenged = TRUE;

    // here we reset fAutoProxy in case an auto-proxy isn't actually
    // configured for this url
    fAutoProxy = WinHttpGetProxyForUrl( hiOpen, pwszUrl, &autoProxyOptions, &autoProxyInfo );
}

if ( fAutoProxy )
{
    // set proxy options for libcurl based on autoProxyInfo
}
else
{
    if( ieProxyConfig.lpszProxy != NULL )
    {
        // IE has an explicit proxy. set proxy options for libcurl here
        // based on ieProxyConfig
        //
        // note that sometimes IE gives just a single or double colon
        // for proxy or bypass list, which means "no proxy"
    }
    else
    {
        // there is no auto proxy and no manually configured proxy
    }
}

Andere Tipps

Dies ist das komplette Codebeispiel, wie WinHttpGetIEProxyConfigForCurrentUser Methode aus winhttp.dll Bibliothek in C # nennen

[TestClass]
public class UnitTest1
{
    [StructLayout(LayoutKind.Sequential)]
    public struct WinhttpCurrentUserIeProxyConfig
    {
        [MarshalAs(UnmanagedType.Bool)]
        public bool AutoDetect;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string AutoConfigUrl;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string Proxy;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string ProxyBypass;

    }

    [DllImport("winhttp.dll", SetLastError = true)]
    static extern bool WinHttpGetIEProxyConfigForCurrentUser(ref WinhttpCurrentUserIeProxyConfig pProxyConfig);

    [TestMethod]
    public void TestMethod1()
    {
        var config = new WinhttpCurrentUserIeProxyConfig();

        WinHttpGetIEProxyConfigForCurrentUser(ref config);

        Console.WriteLine(config.Proxy);
        Console.WriteLine(config.AutoConfigUrl);
        Console.WriteLine(config.AutoDetect);
        Console.WriteLine(config.ProxyBypass);
    }
}

Es gibt Registrierungsschlüssel für diese Werte, die Sie direkt natürlich bekommen können. Sie können auch ohne viel Aufwand an all dies in .NET tun. Ich glaube, das WebClient-Objekt die Proxy-Einstellungen für Sie verhandelt basierend auf den aktuellen Einstellungen. Dies wie dies in C # aussehen:

using System.Net;

string url = "http://www.example.com";
WebClient client = new WebClient();
byte[] fileBuffer = client.DownloadFile(url);

oder etwas nahe an.

Für Firefox / Seamonkey, das Problem ist ein wenig komplizierter, weil die Existenz von vielen Profilen.

Wenn Sie wollen annehmen, dass es nur ein Profil ist, dann müssen Sie nur prefs.js finden. Sie analysieren die network.proxy.type, und dann zu entscheiden, verwenden, die damit verbundenen Werte zu lesen.

Ich arbeite für mozilla auf einigen Dokumenten, so Fragen Ihre followup setzen hier (geprüft Wiki-Box), und ich werde versuchen, Ihnen die Informationen zu geben, die Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top