Hari Krishna
Hari Krishna

Reputation: 3568

what is 'proxy.mycompany1.local'

I just started working in Java networking protocols. I am trying to connect to the internet using my proxy server. When I see the post at 'https://www.tutorialspoint.com/javaexamples/net_poxy.htm', they set the http.proxyHost property to 'proxy.mycompany1.local'. I know I can set this to my proxy server IP, but I am curious to know why my program still works, even though I set it to some random string like "abcd".

A. What does 'proxy.mycompany1.local" stand for?

B. How come my program works, even though I set the http.proxyHost" to "abcd"?

Following is my working program:

import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URL;

public class TestProxy {
    public static void main(String s[]) throws Exception {
        try {

            System.setProperty("http.proxyHost", "abcd");
            System.setProperty("http.proxyPort", "8080");

            URL u = new URL("http://www.google.com");
            HttpURLConnection con = (HttpURLConnection) u.openConnection();
            System.out.println(con.getResponseCode() + " : " + con.getResponseMessage());

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(false);
        }
        Proxy proxy = (Proxy) ProxySelector.getDefault().select(new URI("http://www.google.com")).iterator().next();
        System.out.println("proxy Type : " + proxy.type());
        InetSocketAddress addr = (InetSocketAddress) proxy.address();
        if (addr == null) {
            System.out.println("No Proxy");
        } else {
            System.out.println("proxy hostname : " + addr.getHostName());
            System.out.println("proxy port : " + addr.getPort());
        }
    }
}

This is the output:

200 : OK
proxy Type : HTTP
proxy hostname : abcd
proxy port : 8080

Upvotes: 10

Views: 464

Answers (2)

Vladislav Kysliy
Vladislav Kysliy

Reputation: 3746

First of all, according System Properties tutorial.

Warning: Changing system properties is potentially dangerous and should be done with discretion. Many system properties are not reread after start-up and are there for informational purposes. Changing some properties may have unexpected side-effects.

And my experience say you can get unpleasant issues on your system when you change *.proxyHost properties. So I highly wouldn't recommend you to change system properties for this task.

Much better use something like:

//Proxy instance, proxy ip = 127.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

and authorisation on proxy:

Authenticator authenticator = new Authenticator() {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user",
                    "mypassword".toCharArray());
        }
    };
    Authenticator.setDefault(authenticator);

Now return to main questions:

A. 'proxy.mycompany1.local" is just example. You can use any hostname

B. Class URL uses java.net.PlainSocketImpl class via Socket. It tries to resolve proxy hostname 'abcd', swallow error and go to google directly. Just try to play with this code:

import java.net.*;
import java.io.*;

public class RequestURI {

    public static void main(String[] args) {
        int port = 8181;
        long startTime = System.currentTimeMillis();
        try {
//            System.getProperties().setProperty("http.proxyHost", "abcd");
//            System.getProperties().setProperty("http.proxyPort", Integer.toString(port));

            URL url = new URL("http://google.com");
            HttpURLConnection uc = (HttpURLConnection) url.openConnection();
            int resp = uc.getResponseCode();
            if (resp != 200) {
                throw new RuntimeException("Failed: Fragment is being passed as part of the RequestURI");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Run time in ms ="+ (System.currentTimeMillis() - startTime));
    }
}

You can see run time is bigger when you uncomment section with setProperty. Unsuccessful attempt to resolve hostname increases execution time.

Upvotes: 7

malaguna
malaguna

Reputation: 4223

First of all, proxy.mycompany1.local is just a host name, it is a sample, it is nothing special.

I tried your code in a non proxied network, and it worked as you described. I guess that url.openConnection() method ignores proxy settings, because if you manage your own proxy and use url.openConnection(proxy), then it fails with a java.net.UnknownHostException.

Here you are with a piece of code that fails:

SocketAddress addr = new InetSocketAddress("abcd", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
URL url = new URL("http://google.com");
URLConnection conn = url.openConnection(proxy);
InputStream in = conn.getInputStream();
in.close();

You can read more about Java Networking and Proxies.

Upvotes: 3

Related Questions