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