Question

J'écris pour Windows un outil de ligne de commande qui utilise libcurl pour télécharger des fichiers sur Internet.

Évidemment, le téléchargement ne fonctionne pas lorsque l'utilisateur est derrière un serveur proxy, car le proxy doit être configuré. Je souhaite cependant garder mon outil aussi simple que possible et ne pas surcharger l’utilisateur de la configuration du proxy. Mon outil n’ayant même pas de fichier de configuration, l’utilisateur devrait sinon passer les paramètres de proxy de chaque commande, ou définir une variable d’environnement ou un truc bien trop compliqué.

Donc, je pensais que le navigateur de tout le monde sera généralement déjà configuré correctement, le proxy configuré, etc. Cela sera vrai même pour les utilisateurs les plus élémentaires car sinon, "leur Internet ne fonctionnerait pas".

Je suppose donc que je peux savoir s'il faut utiliser un proxy en consultant les paramètres de proxy d'IE.

Comment puis-je m'y prendre? Plus spécifiquement:

  • Existe-t-il un jeu de " paramètres de proxy " sous Windows, utilisé par tous les navigateurs (probablement les IE), ou devrais-je écrire différentes routines pour IE, Firefox, Opera, etc.?
  • Je sais que je peux probablement lire les valeurs directement à partir des emplacements de registre appropriés si elles sont configurées manuellement, mais cela fonctionne-t-il également avec l'option "Détecter automatiquement le serveur proxy?" Dois-je même m'embêter avec cette option ou est-elle (presque) jamais utilisée?

Avant que les gens ne commencent à suggérer des alternatives: j'utilise C, donc je suis limité à l'API Win32 et je souhaite vraiment continuer à utiliser C et libcurl.

Était-ce utile?

La solution

La fonction recherchée est WinHttpGetIEProxyConfigForCurrentUser (), documentée à l'adresse http://msdn.microsoft.com/en-us/library/aa384096 (VS.85) .aspx . Cette fonction est utilisée par Firefox et Opera pour obtenir leurs paramètres de proxy par défaut, bien que vous puissiez les remplacer par navigateur. Ne fais pas ça, cependant. La bonne chose à faire (c'est ce que font les autres) consiste à obtenir les paramètres IE et à supposer qu'ils sont corrects, car ils le sont presque toujours.

Voici un exemple de la logique pertinente que vous devez adapter à vos besoins:

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
    }
}

Autres conseils

Voici un exemple de code complet comment appeler la méthode WinHttpGetIEProxyConfigForCurrentUser à partir de la bibliothèque winhttp.dll en C #

[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);
    }
}

Il existe des clés de registre pour ces valeurs auxquelles vous pourriez bien sûr accéder directement. Vous pouvez également le faire dans .NET sans trop de tracas. Je crois que l'objet WebClient négocie les paramètres de proxy pour vous en fonction des paramètres actuels. Cela ressemblerait à ceci en C #:

using System.Net;

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

Ou quelque chose proche de cela.

Pour Firefox / Seamonkey, le problème est un peu plus délicat à cause de l’existence de nombreux profils.

Si vous voulez supposer qu’il n’ya qu’un seul profil, il vous suffit de rechercher prefs.js. Vous analysez le paramètre network.proxy.type, puis vous l'utilisez pour déterminer les valeurs associées à lire.

Je travaille sur certains documents pour mozilla, alors posez vos questions de suivi ici (case wiki cochée), et je vais essayer de vous donner les informations dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top