1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.transport;
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.IOException;
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.InputStream;
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.OutputStream;
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.net.URL;
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Iterator;
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.LinkedList;
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Map;
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.List;
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Set;
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport javax.net.ssl.HostnameVerifier;
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport javax.net.ssl.SSLSocketFactory;
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport javax.net.ssl.HttpsURLConnection;
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu//import com.android.okhttp.internal.http.HttpsURLConnectionImpl;
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.HeaderProperty;
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * HttpsServiceConnectionSE is a service connection that uses a https url connection and requires explicit setting of
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * host, port and file.
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The explicit setting is necessary since pure url passing and letting the Java URL class parse the string does not
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * work properly on Android.
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Links for reference:
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see "http://stackoverflow.com/questions/2820284/ssl-on-android-strange-issue"
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see "http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working-on-android-2-2-froyo"
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see "http://code.google.com/p/android/issues/detail?id=2690"
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see "http://code.google.com/p/android/issues/detail?id=2764"
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see "https://gist.github.com/908048" There can be problems with the
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * certificate of theof the server on older android versions. You can disable
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * SSL for the versions only e.g. with an approach like this.
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @author Manfred Moser <manfred@simpligility.com>
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class HttpsServiceConnectionSE implements ServiceConnection {
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    private HttpsURLConnection connection;
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Create the transport with the supplied parameters.
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param host the name of the host e.g. webservices.somewhere.com
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param port the http port to connect on
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param file the path to the file on the webserver that represents the
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * webservice e.g. /api/services/myservice.jsp
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param timeout the timeout for the connection in milliseconds
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @throws IOException
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public HttpsServiceConnectionSE(String host, int port, String file,
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int timeout) throws IOException {
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file)
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                .openConnection();
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        updateConnectionParameters(timeout);
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    private void updateConnectionParameters(int timeout) {
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setConnectTimeout(timeout);
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setReadTimeout(timeout); // even if we connect fine we want to time out if we cant read anything..
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setUseCaches(false);
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setDoOutput(true);
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setDoInput(true);
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void connect() throws IOException {
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.connect();
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void disconnect() {
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.disconnect();
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public List getResponseProperties() {
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Map properties = connection.getHeaderFields();
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Set keys = properties.keySet();
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        List retList = new LinkedList();
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (Iterator i = keys.iterator(); i.hasNext();) {
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            String key = (String) i.next();
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            List values = (List) properties.get(key);
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            for (int j = 0; j < values.size(); j++) {
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                retList.add(new HeaderProperty(key, (String) values.get(j)));
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return retList;
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setRequestProperty(String key, String value) {
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setRequestProperty(key, value);
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setRequestMethod(String requestMethod) throws IOException {
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setRequestMethod(requestMethod);
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setFixedLengthStreamingMode(int contentLength) {
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setFixedLengthStreamingMode(contentLength);
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public OutputStream openOutputStream() throws IOException {
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getOutputStream();
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public InputStream openInputStream() throws IOException {
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getInputStream();
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public InputStream getErrorStream() {
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getErrorStream();
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getHost() {
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getURL().getHost();
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getPort() {
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getURL().getPort();
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getPath() {
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return connection.getURL().getPath();
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setSSLSocketFactory(SSLSocketFactory sf) {
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setSSLSocketFactory(sf);
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setHostnameVerifier(HostnameVerifier v) {
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        connection.setHostnameVerifier(v);
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
137