1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *  Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions:
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The  above copyright notice and this permission notice shall be included in
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software.
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE.
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Contributor(s): John D. Beatty, Dave Dash, F. Hunter, Alexander Krebs,
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *                 Lars Mehrmann, Sean McDaniel, Thomas Strang, Renaud Tognelli
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * */
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.transport;
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.List;
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.zip.GZIPInputStream;
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*;
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.net.MalformedURLException;
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.net.Proxy;
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.net.URL;
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.*;
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.serialization.SoapSerializationEnvelope;
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*;
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * A J2SE based HttpTransport layer.
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class HttpTransportSE extends Transport {
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    private ServiceConnection serviceConnection;
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Creates instance of HttpTransportSE with set url
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param url
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the destination to POST SOAP data
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(String url) {
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(null, url);
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Creates instance of HttpTransportSE with set url and defines a
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * proxy server to use to access it
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param proxy
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Proxy information or <code>null</code> for direct access
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param url
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * The destination to POST SOAP data
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(Proxy proxy, String url) {
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(proxy, url);
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Creates instance of HttpTransportSE with set url
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param url
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the destination to POST SOAP data
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param timeout
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *   timeout for connection and Read Timeouts (milliseconds)
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(String url, int timeout) {
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(url, timeout);
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(Proxy proxy, String url, int timeout) {
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(proxy, url, timeout);
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Creates instance of HttpTransportSE with set url
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param url
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the destination to POST SOAP data
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param timeout
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *   timeout for connection and Read Timeouts (milliseconds)
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param contentLength
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *   Content Lenght in bytes if known in advance
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(String url, int timeout, int contentLength) {
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(url, timeout);
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpTransportSE(Proxy proxy, String url, int timeout, int contentLength) {
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super(proxy, url, timeout);
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * set the desired soapAction header field
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param soapAction
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the desired soapAction
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param envelope
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the envelope containing the information for the soap call.
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @throws IOException
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @throws XmlPullParserException
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void call(String soapAction, SoapEnvelope envelope) throws IOException,
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            XmlPullParserException {
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        call(soapAction, envelope, null);
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * set the desired soapAction header field
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param soapAction
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the desired soapAction
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param envelope
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            the envelope containing the information for the soap call.
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param headers
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *              a list of HeaderProperties to be http header properties when establishing the connection
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return <code>CookieJar</code> with any cookies sent by the server
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @throws IOException
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @throws XmlPullParserException
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public List call(String soapAction, SoapEnvelope envelope, List headers)
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException, XmlPullParserException {
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (soapAction == null) {
138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            soapAction = "\"\"";
139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        System.out.println("call action:" + soapAction);
142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        byte[] requestData = createRequestData(envelope, "UTF-8");
143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (requestData != null) {
145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            requestDump = debug ? new String(requestData) : null;
146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else {
148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            requestDump = null;
149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        responseDump = null;
151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        System.out.println("requestDump:" + requestDump);
153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        ServiceConnection connection = getServiceConnection();
154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        System.out.println("connection:" + connection);
155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setRequestProperty("User-Agent", USER_AGENT);
157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        // SOAPAction is not a valid header for VER12 so do not add
158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        // it
159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        // @see "http://code.google.com/p/ksoap2-android/issues/detail?id=67
160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        System.out.println("envelope:" + envelope);
161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (envelope != null) {
162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (envelope.version != SoapSerializationEnvelope.VER12) {
163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                connection.setRequestProperty("SOAPAction", soapAction);
164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (envelope.version == SoapSerializationEnvelope.VER12) {
167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                connection.setRequestProperty("Content-Type", CONTENT_TYPE_SOAP_XML_CHARSET_UTF_8);
168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else {
169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                connection.setRequestProperty("Content-Type", CONTENT_TYPE_XML_CHARSET_UTF_8);
170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestProperty("Connection", "close");
173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestProperty("Accept-Encoding", "gzip");
174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestProperty("Content-Length", "" + requestData.length);
175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            //M: Retry for HTTP Authentication
177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            //connection.setFixedLengthStreamingMode(requestData.length);
178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            // Pass the headers provided by the user along with the call
180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (headers != null) {
181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                for (int i = 0; i < headers.size(); i++) {
182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    HeaderProperty hp = (HeaderProperty) headers.get(i);
183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    connection.setRequestProperty(hp.getKey(), hp.getValue());
184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestMethod("POST");
188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else {
191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestProperty("Connection", "close");
192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestProperty("Accept-Encoding", "gzip");
193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            connection.setRequestMethod("GET");
194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (requestData != null) {
197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            OutputStream os = connection.openOutputStream();
198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            os.write(requestData, 0, requestData.length);
200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            os.flush();
201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            os.close();
202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            requestData = null;
203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        InputStream is;
205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        List retHeaders = null;
206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        boolean gZippedContent = false;
207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        boolean bcaCert = false;
208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            retHeaders = connection.getResponseProperties();
211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            System.out.println("[HttpTransportSE] retHeaders = " + retHeaders);
212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            for (int i = 0; i < retHeaders.size(); i++) {
213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                HeaderProperty hp = (HeaderProperty) retHeaders.get(i);
214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                // HTTP response code has null key
215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (null == hp.getKey()) {
216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    continue;
217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                // ignoring case since users found that all smaller case is used on some server
219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                // and even if it is wrong according to spec, we rather have it work..
220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (hp.getKey().equalsIgnoreCase("Content-Encoding")
221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        && hp.getValue().equalsIgnoreCase("gzip")) {
222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    gZippedContent = true;
223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (gZippedContent) {
226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                is = getUnZippedInputStream(connection.openInputStream());
227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else {
228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                is = connection.openInputStream();
229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (IOException e) {
231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (gZippedContent) {
232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                is = getUnZippedInputStream(connection.getErrorStream());
233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else {
234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                is = connection.getErrorStream();
235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (is == null) {
238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                connection.disconnect();
239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                throw (e);
240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (debug) {
244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ByteArrayOutputStream bos = new ByteArrayOutputStream();
245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            byte[] buf = new byte[8192];
246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            while (true) {
248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                int rd = is.read(buf, 0, 8192);
249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (rd == -1) {
250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                bos.write(buf, 0, rd);
253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            bos.flush();
256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf = bos.toByteArray();
257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            responseDump = new String(buf);
259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            System.out.println("responseDump:" + responseDump);
261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            is.close();
262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            is = new ByteArrayInputStream(buf);
263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (envelope != null) {
266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            parseResponse(envelope, is);
267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retHeaders;
270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
272997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    private InputStream getUnZippedInputStream(InputStream inputStream) throws IOException {
273997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        /* workaround for Android 2.3
274997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu           (see http://stackoverflow.com/questions/5131016/)
275997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        */
276997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
277997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return (GZIPInputStream) inputStream;
278997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (ClassCastException e) {
279997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return new GZIPInputStream(inputStream);
280997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
281997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
282997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
283997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public ServiceConnection getServiceConnection() throws IOException {
284997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (serviceConnection == null) {
285997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            System.out.println("new ServiceConnectionSE:" + proxy + " " + url + " " + timeout);
286997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            serviceConnection = new ServiceConnectionSE(proxy, url, timeout);
287997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
288997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return serviceConnection;
289997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
290997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
291997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getHost() {
292997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
293997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        String retVal = null;
294997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
295997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
296997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            retVal = new URL(url).getHost();
297997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (MalformedURLException e) {
298997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
299997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
300997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
301997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retVal;
302997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
303997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
304997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getPort() {
305997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
306997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int retVal = -1;
307997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
308997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
309997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            retVal = new URL(url).getPort();
310997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (MalformedURLException e) {
311997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
312997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
313997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
314997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retVal;
315997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
316997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
317997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getPath() {
318997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
319997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        String retVal = null;
320997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
321997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
322997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            retVal = new URL(url).getPath();
323997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (MalformedURLException e) {
324997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
325997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
326997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
327997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retVal;
328997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
329997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
330997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getQuery() {
331997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
332997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        String retVal = null;
333997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
334997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
335997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            retVal = new URL(url).getQuery();
336997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (MalformedURLException e) {
337997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
338997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
339997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
340997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retVal;
341997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
342997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
343997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
344997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @hide
345997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
346997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public byte[] getRequestData(SoapEnvelope envelope, String encoding) {
347997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
348997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return createRequestData(envelope, encoding);
349997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (Exception e) {
350997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
351997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
352997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
353997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return null;
354997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
355997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
356