1 2 package org.ksoap2.transport; 3 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.net.URL; 8 import java.util.Iterator; 9 import java.util.LinkedList; 10 import java.util.Map; 11 import java.util.List; 12 import java.util.Set; 13 14 import javax.net.ssl.HostnameVerifier; 15 import javax.net.ssl.SSLSocketFactory; 16 import javax.net.ssl.HttpsURLConnection; 17 //import com.android.okhttp.internal.http.HttpsURLConnectionImpl; 18 import org.ksoap2.HeaderProperty; 19 20 /** 21 * HttpsServiceConnectionSE is a service connection that uses a https url connection and requires explicit setting of 22 * host, port and file. 23 * 24 * The explicit setting is necessary since pure url passing and letting the Java URL class parse the string does not 25 * work properly on Android. 26 * 27 * Links for reference: 28 * @see "http://stackoverflow.com/questions/2820284/ssl-on-android-strange-issue" 29 * @see "http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working-on-android-2-2-froyo" 30 * @see "http://code.google.com/p/android/issues/detail?id=2690" 31 * @see "http://code.google.com/p/android/issues/detail?id=2764" 32 * 33 * @see "https://gist.github.com/908048" There can be problems with the 34 * certificate of theof the server on older android versions. You can disable 35 * SSL for the versions only e.g. with an approach like this. 36 * 37 * @author Manfred Moser <manfred (at) simpligility.com> 38 */ 39 public class HttpsServiceConnectionSE implements ServiceConnection { 40 41 private HttpsURLConnection connection; 42 43 /** 44 * Create the transport with the supplied parameters. 45 * @param host the name of the host e.g. webservices.somewhere.com 46 * @param port the http port to connect on 47 * @param file the path to the file on the webserver that represents the 48 * webservice e.g. /api/services/myservice.jsp 49 * @param timeout the timeout for the connection in milliseconds 50 * @throws IOException 51 */ 52 public HttpsServiceConnectionSE(String host, int port, String file, 53 int timeout) throws IOException { 54 connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file) 55 .openConnection(); 56 updateConnectionParameters(timeout); 57 } 58 59 private void updateConnectionParameters(int timeout) { 60 connection.setConnectTimeout(timeout); 61 connection.setReadTimeout(timeout); // even if we connect fine we want to time out if we cant read anything.. 62 connection.setUseCaches(false); 63 connection.setDoOutput(true); 64 connection.setDoInput(true); 65 } 66 67 public void connect() throws IOException { 68 connection.connect(); 69 } 70 71 public void disconnect() { 72 connection.disconnect(); 73 } 74 75 public List getResponseProperties() { 76 Map properties = connection.getHeaderFields(); 77 Set keys = properties.keySet(); 78 List retList = new LinkedList(); 79 80 for (Iterator i = keys.iterator(); i.hasNext();) { 81 String key = (String) i.next(); 82 List values = (List) properties.get(key); 83 84 for (int j = 0; j < values.size(); j++) { 85 retList.add(new HeaderProperty(key, (String) values.get(j))); 86 } 87 } 88 89 return retList; 90 } 91 92 public void setRequestProperty(String key, String value) { 93 connection.setRequestProperty(key, value); 94 } 95 96 public void setRequestMethod(String requestMethod) throws IOException { 97 connection.setRequestMethod(requestMethod); 98 } 99 100 public void setFixedLengthStreamingMode(int contentLength) { 101 connection.setFixedLengthStreamingMode(contentLength); 102 } 103 104 public OutputStream openOutputStream() throws IOException { 105 return connection.getOutputStream(); 106 } 107 108 public InputStream openInputStream() throws IOException { 109 return connection.getInputStream(); 110 } 111 112 public InputStream getErrorStream() { 113 return connection.getErrorStream(); 114 } 115 116 public String getHost() { 117 return connection.getURL().getHost(); 118 } 119 120 public int getPort() { 121 return connection.getURL().getPort(); 122 } 123 124 public String getPath() { 125 return connection.getURL().getPath(); 126 } 127 128 public void setSSLSocketFactory(SSLSocketFactory sf) { 129 connection.setSSLSocketFactory(sf); 130 } 131 132 public void setHostnameVerifier(HostnameVerifier v) { 133 connection.setHostnameVerifier(v); 134 } 135 136 } 137