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