Accéder à un service http peut être compliqué quand les proxys rentrent en jeu. Ces services font office de pont entre une machine et un réseau. Mais le problème, c’est que pour configurer une application pour utiliser un proxy, il faut déjà le connaître ou le découvrir, ce qui n’est pas toujours aisé.
Proxy-vole est une librairie sous licence BSD destinée à régler ce type de problème. Elle propose des fonctions très simples pour détecter les proxys HTTP configurés sur un système. Elle permet aussi d’utiliser les proxys détectés au sein d’une application Java de façon transparente. Le but de cet article est d’expliquer pourquoi et comment utiliser Proxy-Vole. Pour bien comprendre l’intérêt de cet outil, nous nous intéresserons d’abord aux solutions mises à disposition nativement par la JVM.
1 – Utiliser les outils du Java standard , une approche terre à terre :
Le Java standard propose plusieurs solutions pour utiliser des proxys. Cependant, ces moyens connaissent certaines limitations pénibles, que nous allons détailler ici.
Pour plus d’informations sur le sujet, la documentation Oracle détaille tous les mécanismes abordés dans cette partie : http://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html
Première approche :
Au lancement de la JVM, il est possible de spécifier une propriété pour lui demander de détecter automatiquement les proxys définis sur le système :
"-Djava.net.useSystemProxies=true".
Le problème avec cette méthode, c’est qu’elle ne scanne pas les configurations définies dans les navigateurs Web du système.
Une autre approche :
Pour pallier à cela, on peut définir manuellement le proxy que doit utiliser l’application, grâce à 2 propriétés systèmes :
http.proxyHost
et
http.proxyPort.
Deux points noirs apparaissent ici :
- Le client doit redéfinir les paramètres du proxy spécialement pour l’application.
- Le développeur doit fournir un point d’accès dans l’application dans ce but.
Il existe un dernier problème avec le Java standard : la méthode PAC. PAC désigne un simple script JavaScript qui, pour toute URL qu’il reçoit en entrée, renvoie l’adresse d’un proxy HTTP à utiliser pour accéder au service en question. Une sorte d’annuaire dynamique de proxys.
La JVM n’a aucun mécanisme pour gérer ce genre de cas. Tout client voulant donc utiliser cette approche devra donc chercher ailleurs une solution ailleurs que dans les outils standards du JDK.
Une question se pose maintenant. Comment se débarrasser des limites soulevées ?
2 – Balayer les limitations avec Proxy-Vole
Le but de Proxy-Vole est de proposer une fonctionnalité proche du Java standard, mais plus poussée. Pour se faire, elle se base sur une détection automatique des proxys, avec quelques différences :
- Elle peut scanner les configurations des navigateurs installés.
- On peut la configurer pour personnaliser la méthode de détection des proxys.
- Elle est capable de détecter et d’utiliser les scripts PAC.
Passons à la pratique avec un exemple d’utilisation :
/* Creating a new proxy research strategy will initiate proxy-vole to * scan os configuration and system default browser */ ProxySearch pSearch = ProxySearch.getDefaultProxySearch(); /* It's possible to configure components to scan. For example, according * to detected OS, we will change research parameters */ final String osName = System.getProperty("os.name").toLowerCase(); if (osName.startsWith("windows")) { pSearch.addStrategy(ProxySearch.Strategy.IE); pSearch.addStrategy(ProxySearch.Strategy.WIN); } else if (osName.startsWith("linux")) { pSearch.addStrategy(ProxySearch.Strategy.GNOME); pSearch.addStrategy(ProxySearch.Strategy.KDE); pSearch.addStrategy(ProxySearch.Strategy.FIREFOX); } else { pSearch.addStrategy(ProxySearch.Strategy.OS_DEFAULT); } // For proxy-vole to be effective, it must be registered to the JVM ProxySelector.setDefault(pSearch.getProxySelector()); // Now, all connections will automatically use detected proxy parameters try (new URL("http://tile.openstreetmap.org").openStream()) { // You can now read your data }
3 – Conclusion
Gérer la connexion à des proxys HTTP, avec le JDK standard pour seul outil, c’est possible. Mais la gestion de proxys dynamiques via des scripts PAC n’est pas possible… A moins d’intégrer un interpréteur JavaScript dans votre code, et de récupérer le dit script par vos propres moyens. De plus, les paramètres de recherche des configurations existantes sont assez limitées.
Intégrer Proxy-Vole permet de :
- Récupérer la moindre configuration réseau qui se cacherait sur votre système.
- Utiliser des scripts PAC sans surcoût de développement.
Et intégrer Proxy-vole, c’est facile parce que :
- C’est du BSD.
- Les mécanismes proposés sont des extensions du Java standard (ProxySelector).
- La syntaxe est concise.
Le site officiel du projet ici
Son clone GitHub par là