1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.luni.internal.net.www.protocol.https;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStream;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.ProtocolException;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.Proxy;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URL;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Permission;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Principal;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.cert.Certificate;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.List;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Map;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3109133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilsonimport javax.net.ssl.HttpsURLConnection;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.net.ssl.SSLPeerUnverifiedException;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.net.ssl.SSLSocket;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3509133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilsonimport org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.internal.nls.Messages;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * HttpsURLConnection implementation.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
4109133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilsonpublic class HttpsURLConnectionImpl extends HttpsURLConnection {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Https engine to be wrapped
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final HttpsEngine httpsEngine;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // SSLSocket to be used for connection
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private SSLSocket sslSocket;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4909133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson    protected HttpsURLConnectionImpl(URL url, int port) {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(url);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine = new HttpsEngine(url, port);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5409133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson    protected HttpsURLConnectionImpl(URL url, int port, Proxy proxy) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(url);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine = new HttpsEngine(url, port, proxy);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getCipherSuite() {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sslSocket == null) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException(Messages.getString("luni.00")); //$NON-NLS-1$
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sslSocket.getSession().getCipherSuite();
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Certificate[] getLocalCertificates() {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sslSocket == null) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException(Messages.getString("luni.00")); //$NON-NLS-1$
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sslSocket.getSession().getLocalCertificates();
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Certificate[] getServerCertificates()
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws SSLPeerUnverifiedException {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sslSocket == null) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException(Messages.getString("luni.00")); //$NON-NLS-1$
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sslSocket.getSession().getPeerCertificates();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sslSocket == null) {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException(Messages.getString("luni.00")); //$NON-NLS-1$
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sslSocket.getSession().getPeerPrincipal();
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Principal getLocalPrincipal() {
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sslSocket == null) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException(Messages.getString("luni.00")); //$NON-NLS-1$
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sslSocket.getSession().getLocalPrincipal();
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void disconnect() {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.disconnect();
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public InputStream getErrorStream() {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getErrorStream();
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getRequestMethod() {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getRequestMethod();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getResponseCode() throws IOException {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getResponseCode();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getResponseMessage() throws IOException {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getResponseMessage();
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setRequestMethod(String method) throws ProtocolException {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setRequestMethod(method);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean usingProxy() {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.usingProxy();
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getInstanceFollowRedirects() {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getInstanceFollowRedirects();
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setInstanceFollowRedirects(boolean followRedirects) {
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setInstanceFollowRedirects(followRedirects);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void connect() throws IOException {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.connect();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getAllowUserInteraction() {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getAllowUserInteraction();
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object getContent() throws IOException {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getContent();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked") // Spec does not generify
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object getContent(Class[] types) throws IOException {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getContent(types);
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getContentEncoding() {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getContentEncoding();
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getContentLength() {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getContentLength();
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getContentType() {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getContentType();
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getDate() {
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getDate();
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getDefaultUseCaches() {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getDefaultUseCaches();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getDoInput() {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getDoInput();
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getDoOutput() {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getDoOutput();
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getExpiration() {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getExpiration();
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getHeaderField(int pos) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderField(pos);
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Map<String, List<String>> getHeaderFields() {
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderFields();
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Map<String, List<String>> getRequestProperties() {
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getRequestProperties();
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addRequestProperty(String field, String newValue) {
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.addRequestProperty(field, newValue);
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getHeaderField(String key) {
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderField(key);
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getHeaderFieldDate(String field, long defaultValue) {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderFieldDate(field, defaultValue);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getHeaderFieldInt(String field, int defaultValue) {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderFieldInt(field, defaultValue);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getHeaderFieldKey(int posn) {
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getHeaderFieldKey(posn);
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getIfModifiedSince() {
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getIfModifiedSince();
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public InputStream getInputStream() throws IOException {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getInputStream();
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getLastModified() {
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getLastModified();
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public OutputStream getOutputStream() throws IOException {
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getOutputStream();
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Permission getPermission() throws IOException {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getPermission();
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getRequestProperty(String field) {
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getRequestProperty(field);
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public URL getURL() {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getURL();
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getUseCaches() {
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getUseCaches();
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setAllowUserInteraction(boolean newValue) {
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setAllowUserInteraction(newValue);
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setDefaultUseCaches(boolean newValue) {
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setDefaultUseCaches(newValue);
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setDoInput(boolean newValue) {
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setDoInput(newValue);
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setDoOutput(boolean newValue) {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setDoOutput(newValue);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setIfModifiedSince(long newValue) {
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setIfModifiedSince(newValue);
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setRequestProperty(String field, String newValue) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setRequestProperty(field, newValue);
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setUseCaches(boolean newValue) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setUseCaches(newValue);
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setConnectTimeout(int timeout) {
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setConnectTimeout(timeout);
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getConnectTimeout() {
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getConnectTimeout();
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setReadTimeout(int timeout) {
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        httpsEngine.setReadTimeout(timeout);
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getReadTimeout() {
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.getReadTimeout();
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return httpsEngine.toString();
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * HttpsEngine
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
34909133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson    private class HttpsEngine extends HttpURLConnectionImpl {
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // In case of using proxy this field indicates
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if it is a SSL Tunnel establishing stage
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private boolean makingSSLTunnel;
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected HttpsEngine(URL url, int port) {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(url, port);
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected HttpsEngine(URL url, int port, Proxy proxy) {
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(url, port, proxy);
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void connect() throws IOException {
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (connected) {
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
36809133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            if (super.usingProxy() && !makingSSLTunnel) {
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // SSL Tunnel through the proxy was not established yet, do so
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                makingSSLTunnel = true;
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // first - make the connection
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                super.connect();
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // keep request method
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String save_meth = method;
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // make SSL Tunnel
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                method = "CONNECT"; //$NON-NLS-1$
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    doRequest();
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    endRequest();
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } finally {
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // restore initial request method
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    method = save_meth;
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (!connected) {
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new IOException(Messages.getString("luni.01", //$NON-NLS-1$
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            responseMessage, responseCode));
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // if there are some remaining data in the stream - read it out
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                InputStream is = connection.getInputStream();
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (is.available() != 0) {
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    is.read();
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                makingSSLTunnel = false;
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // no need in SSL tunnel
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                super.connect();
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!makingSSLTunnel) {
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sslSocket = connection.getSecureSocket(getSSLSocketFactory(), getHostnameVerifier());
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                setUpTransportIO(connection);
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected String requestString() {
40609133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            if (super.usingProxy()) {
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (makingSSLTunnel) {
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // we are making the SSL Tunneling, return remotehost:port
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    int port = url.getPort();
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return (port > 0) ? url.getHost() + ":" + port //$NON-NLS-1$
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    : url.getHost();
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // we has made SSL Tunneling, return /requested.data
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String file = url.getFile();
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (file == null || file.length() == 0) {
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    file = "/"; //$NON-NLS-1$
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return file;
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return super.requestString();
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
425