1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.net;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents proxy server settings. A created instance of {@code
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Proxy} stores a type and an address and is immutable. There are three types
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of proxies:
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>DIRECT</li>
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>HTTP</li>
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>SOCKS</li></ul
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Proxy {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Represents the proxy type setting {@code Proxy.Type.DIRECT}. It tells
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * protocol handlers that there is no proxy to be used. The address is set
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to {@code null}.
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final Proxy NO_PROXY = new Proxy();
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Proxy.Type type;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private SocketAddress address;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code Proxy} instance. {@code SocketAddress} must NOT be
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} when {@code type} is either {@code Proxy.Type.HTTP} or
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Proxy.Type.SOCKS}. To create a {@code Proxy} instance representing
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the proxy type {@code Proxy.Type.DIRECT}, use {@code Proxy.NO_PROXY}
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instead of this constructor.
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the proxy type of this instance.
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sa
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the proxy address of this instance.
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code type} is set to {@code
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             Proxy.Type.DIRECT} or the value for {@code SocketAddress} is
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code null}.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Proxy(Proxy.Type type, SocketAddress sa) {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Don't use DIRECT type to construct a proxy instance directly.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * SocketAddress must NOT be null.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
61b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (type == Type.DIRECT || sa == null) {
62b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("Illegal Proxy.Type or SocketAddress argument");
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.type = type;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = sa;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a Proxy instance, which is Proxy.DIRECT type with null
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketAddress. This constructor is used for NO_PROXY.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Proxy() {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        type = Type.DIRECT;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = null;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the type of this {@code Proxy} instance.
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the stored proxy type.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Proxy.Type type() {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return type;
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the address of this {@code Proxy} instance.
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the stored proxy address or {@code null} if the proxy type is
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code DIRECT}.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketAddress address() {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return address;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a textual representation of this {@code Proxy} instance. The string
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * includes the two parts {@code type.toString()} and {@code
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address.toString()} if {@code address} is not {@code null}.
100f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the representing string of this proxy.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
10575108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        StringBuilder builder = new StringBuilder();
10675108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        if (type != null) {
10775108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes            builder.append(type.toString());
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
10975108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        builder.append("@");
11075108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        if (type != Proxy.Type.DIRECT && address != null) {
11175108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes            builder.append(address.toString());
11275108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        }
11375108771bf4b7de62e05f3f6da23ff7e02f7595fElliott Hughes        return builder.toString();
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified {@code obj} to this {@code Proxy} instance and
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns whether they are equal or not. The given object must be an
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instance of {@code Proxy} with the same address and the same type value
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to be equal.
121f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this instance.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the given object represents the same {@code
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         Proxy} as this instance, {@code false} otherwise.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean equals(Object obj) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(obj instanceof Proxy)) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Proxy another = (Proxy) obj;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // address is null when and only when it's NO_PROXY.
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (type == another.type) && address.equals(another.address);
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the hashcode for this {@code Proxy} instance.
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hashcode value for this Proxy instance.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int hashCode() {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int ret = 0;
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ret += type.hashCode();
150b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (address != null) {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ret += address.hashCode();
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ret;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Enum} class for the proxy type. Possible options are {@code
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * DIRECT}, {@code HTTP} and {@code SOCKS}.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public enum Type {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Direct connection. Connect without any proxy.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DIRECT,
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * HTTP type proxy. It's often used by protocol handlers such as HTTP,
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * HTTPS and FTP.
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HTTP,
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * SOCKS type proxy.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SOCKS
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
178