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