web-dev-qa-db-fra.com

Comment connaître les paramètres proxy du navigateur?

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

De toute évidence, le téléchargement ne fonctionne pas lorsque l'utilisateur se trouve 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é.

Je pensais donc que le navigateur de tout le monde était généralement déjà configuré correctement, que le proxy était 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 précisement:

  • Existe-t-il un ensemble de "paramètres de proxy" dans Windows, utilisé par tous les navigateurs (probablement ceux d'Internet Explorer), 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 "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 veux vraiment continuer à utiliser C et libcurl.

25
rix0rrr

La fonction que vous recherchez est WinHttpGetIEProxyConfigForCurrentUser (), documentée dans 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 simplement à obtenir les paramètres IE et à supposer qu'ils sont corrects, puisqu'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
    }
}
36
JSBձոգչ

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);
    }
}
3
Maksym Kozlenko

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.

1
justin.m.chase

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'y a qu'un seul profil, il vous suffit de rechercher prefs.js. Vous analysez le 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.

0
benc