/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; /** * A container class for the http proxy info * @hide */ public class ProxyProperties implements Parcelable { private String mHost; private int mPort; private String mExclusionList; private String[] mParsedExclusionList; public ProxyProperties(String host, int port, String exclList) { mHost = host; mPort = port; setExclusionList(exclList); } private ProxyProperties(String host, int port, String exclList, String[] parsedExclList) { mHost = host; mPort = port; mExclusionList = exclList; mParsedExclusionList = parsedExclList; } // copy constructor instead of clone public ProxyProperties(ProxyProperties source) { if (source != null) { mHost = source.getHost(); mPort = source.getPort(); mExclusionList = source.getExclusionList(); mParsedExclusionList = source.mParsedExclusionList; } } public InetSocketAddress getSocketAddress() { InetSocketAddress inetSocketAddress = null; try { inetSocketAddress = new InetSocketAddress(mHost, mPort); } catch (IllegalArgumentException e) { } return inetSocketAddress; } public String getHost() { return mHost; } public int getPort() { return mPort; } // comma separated public String getExclusionList() { return mExclusionList; } // comma separated private void setExclusionList(String exclusionList) { mExclusionList = exclusionList; if (mExclusionList == null) { mParsedExclusionList = new String[0]; } else { String splitExclusionList[] = exclusionList.toLowerCase().split(","); mParsedExclusionList = new String[splitExclusionList.length * 2]; for (int i = 0; i < splitExclusionList.length; i++) { String s = splitExclusionList[i].trim(); if (s.startsWith(".")) s = s.substring(1); mParsedExclusionList[i*2] = s; mParsedExclusionList[(i*2)+1] = "." + s; } } } public boolean isExcluded(String url) { if (TextUtils.isEmpty(url) || mParsedExclusionList == null || mParsedExclusionList.length == 0) return false; Uri u = Uri.parse(url); String urlDomain = u.getHost(); if (urlDomain == null) return false; for (int i = 0; i< mParsedExclusionList.length; i+=2) { if (urlDomain.equals(mParsedExclusionList[i]) || urlDomain.endsWith(mParsedExclusionList[i+1])) { return true; } } return false; } public java.net.Proxy makeProxy() { java.net.Proxy proxy = java.net.Proxy.NO_PROXY; if (mHost != null) { try { InetSocketAddress inetSocketAddress = new InetSocketAddress(mHost, mPort); proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP, inetSocketAddress); } catch (IllegalArgumentException e) { } } return proxy; } @Override public String toString() { StringBuilder sb = new StringBuilder(); if (mHost != null) { sb.append("["); sb.append(mHost); sb.append("] "); sb.append(Integer.toString(mPort)); if (mExclusionList != null) { sb.append(" xl=").append(mExclusionList); } } else { sb.append("[ProxyProperties.mHost == null]"); } return sb.toString(); } @Override public boolean equals(Object o) { if (!(o instanceof ProxyProperties)) return false; ProxyProperties p = (ProxyProperties)o; if (mExclusionList != null && !mExclusionList.equals(p.getExclusionList())) return false; if (mHost != null && p.getHost() != null && mHost.equals(p.getHost()) == false) { return false; } if (mHost != null && p.mHost == null) return false; if (mHost == null && p.mHost != null) return false; if (mPort != p.mPort) return false; return true; } /** * Implement the Parcelable interface * @hide */ public int describeContents() { return 0; } @Override /* * generate hashcode based on significant fields */ public int hashCode() { return ((null == mHost) ? 0 : mHost.hashCode()) + ((null == mExclusionList) ? 0 : mExclusionList.hashCode()) + mPort; } /** * Implement the Parcelable interface. * @hide */ public void writeToParcel(Parcel dest, int flags) { if (mHost != null) { dest.writeByte((byte)1); dest.writeString(mHost); dest.writeInt(mPort); } else { dest.writeByte((byte)0); } dest.writeString(mExclusionList); dest.writeStringArray(mParsedExclusionList); } /** * Implement the Parcelable interface. * @hide */ public static final Creator CREATOR = new Creator() { public ProxyProperties createFromParcel(Parcel in) { String host = null; int port = 0; if (in.readByte() == 1) { host = in.readString(); port = in.readInt(); } String exclList = in.readString(); String[] parsedExclList = in.readStringArray(); ProxyProperties proxyProperties = new ProxyProperties(host, port, exclList, parsedExclList); return proxyProperties; } public ProxyProperties[] newArray(int size) { return new ProxyProperties[size]; } }; }