1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany 2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Copyright (c) 2006, James Seigel, Calgary, AB., Canada 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 Yupackage org.ksoap2.transport; 23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*; 25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.net.*; 26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Iterator; 27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.LinkedList; 28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.List; 29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Map; 30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.Set; 31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.HeaderProperty; 33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/** 35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Connection for J2SE environments. 36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class ServiceConnectionSE implements ServiceConnection { 38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu private HttpURLConnection connection; 40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Constructor taking the url to the endpoint for this soap communication 43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @param url the url to open the connection to. 44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @throws IOException 45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public ServiceConnectionSE(String url) throws IOException { 47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this(null, url, ServiceConnection.DEFAULT_TIMEOUT); 48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public ServiceConnectionSE(Proxy proxy, String url) throws IOException { 51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this(proxy, url, ServiceConnection.DEFAULT_TIMEOUT); 52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Constructor taking the url to the endpoint for this soap communication 56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @param url the url to open the connection to. 57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @param timeout the connection and read timeout for the http connection in milliseconds 58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @throws IOException // 20 seconds 59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public ServiceConnectionSE(String url, int timeout) throws IOException { 61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this(null, url, timeout); 62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public ServiceConnectionSE(Proxy proxy, String url, int timeout) throws IOException { 65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection = (proxy == null) 66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ? (HttpURLConnection) new URL(url).openConnection() 67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu : (HttpURLConnection) new URL(url).openConnection(proxy); 68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setUseCaches(false); 69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setDoOutput(true); 70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setDoInput(true); 71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setConnectTimeout(timeout); 72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setReadTimeout(timeout); // even if we connect fine we want to time out if we cant read anything.. 73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void connect() throws IOException { 76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.connect(); 77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void disconnect() { 80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.disconnect(); 81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public List getResponseProperties() { 84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Map properties = connection.getHeaderFields(); 85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Set keys = properties.keySet(); 86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu List retList = new LinkedList(); 87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (Iterator i = keys.iterator(); i.hasNext();) { 89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String key = (String) i.next(); 90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu List values = (List) properties.get(key); 91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int j = 0; j < values.size(); j++) { 93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu retList.add(new HeaderProperty(key, (String) values.get(j))); 94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return retList; 98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setRequestProperty(String string, String soapAction) { 101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setRequestProperty(string, soapAction); 102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setRequestMethod(String requestMethod) throws IOException { 105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setRequestMethod(requestMethod); 106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * If the length of a HTTP request body is known ahead, sets fixed length 110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to enable streaming without buffering. Sets after connection will cause an exception. 111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @param contentLength the fixed length of the HTTP request body 113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * @see http://developer.android.com/reference/java/net/HttpURLConnection.html 114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu **/ 115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setFixedLengthStreamingMode(int contentLength) { 116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu connection.setFixedLengthStreamingMode(contentLength); 117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public OutputStream openOutputStream() throws IOException { 120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getOutputStream(); 121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public InputStream openInputStream() throws IOException { 124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getInputStream(); 125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public InputStream getErrorStream() { 128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getErrorStream(); 129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getHost() { 132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getURL().getHost(); 133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getPort() { 136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getURL().getPort(); 137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getPath() { 140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return connection.getURL().getPath(); 141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu} 143