I have a Java application that is trying to access a web service via http proxy. The Java app is 3rd party app for which we don\'t have access to source code.
Its la
Finally I figured out by trial and error. Passing java.net.useSystemProxies=true along with https.proxyPort, https.proxyHost resolved this.
Basically the java vm command line got
-Djava.net.useSystemProxies=true -Dhttps.proxyPort=80 -Dhttps.proxyHost=proxyserver.mycompany.com
I didn't have to pass https.proxyUser, https.proxyPassword. I believe proxy authentication used the same credentials as my login NTLM credentials.
One also needs to specify NT domain for NTLM authnetication to work.
-Dhttp.proxyUser=MyDomain/username
or by setting
-Dhttp.auth.ntlm.domain=MyDomain
And you also MUST explicitly instruct HttpClient to take system properties into account, which it does not do by default
CloseableHttpClient client = HttpClients.createSystem();
or
CloseableHttpClient client = HttpClients.custom()
.useSystemProperties()
.build();
A working example with Apache HttpClient 4.5.*
Note: It does not work unless you use HttpClients.custom().useSystemProperties().build();
System.setProperty("http.proxyHost" , "myhost");
System.setProperty("http.proxyPort" , "myport");
System.setProperty("http.proxyUser" , "myuser");
System.setProperty("http.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("http://www.google.com");
CloseableHttpResponse httpResponse = httpclient.execute(httpGet);
try {
System.out.println(httpResponse.getStatusLine());
for (Header header : response.getAllHeaders()) {
System.out.println("header " + header.getName() + " - " + header.getValue());
}
String responseString = EntityUtils.toString(httpResponse.getEntity());
System.out.println("responseString :" + responseString);
} finally {
response.close();
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
httpclient.close();
}
Instead of using System.setProperty you can set the properties with
-Dhttp.proxyHost="myhost" -Dhttp.proxyPort="myport" -Dhttp.proxyUser=myuser -Dhttp.proxyPassword="mypassword"
Important: If you try to access a HTTPS service you have to change the properties to https It also does not work if you use https.* properties and you access a http URL
System.setProperty("https.proxyHost" , "myhost");
System.setProperty("https.proxyPort" , "myport");
System.setProperty("https.proxyUser" , "myuser");
System.setProperty("https.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("https://www.google.com");
API: https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/
Pure Java - without Apache HttpClient
You can set the same https.proxyHost etc properties if you use the java.net.HttpURLConnection class
Always respect using https.proxyHost etc for https://... connections and http.proxyHost etc for http://... connections!
String uri = "https://www.google.com/";
HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
InputStream response = connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine; int x = 0;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
x++; if (x > 4) { break;}
}
in.close();
response.close();