001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.codehaus.activesoap.transport.http;
019
020 import org.apache.commons.logging.Log;
021 import org.apache.commons.logging.LogFactory;
022 import org.codehaus.activesoap.transport.Invocation;
023 import org.codehaus.activesoap.transport.TransportClientSupport;
024
025 import java.io.BufferedReader;
026 import java.io.IOException;
027 import java.io.InputStream;
028 import java.io.InputStreamReader;
029 import java.io.OutputStreamWriter;
030 import java.io.Reader;
031 import java.io.StringReader;
032 import java.io.Writer;
033 import java.net.HttpURLConnection;
034 import java.net.MalformedURLException;
035 import java.net.URL;
036
037 /**
038 * @version $Revision: 1.3 $
039 */
040 public class HttpTransportClient extends TransportClientSupport {
041 private static final Log log = LogFactory.getLog(HttpTransportClient.class);
042
043 private URL url;
044
045 public HttpTransportClient(URL url) {
046 this.url = url;
047 }
048
049 public HttpTransportClient(String url) throws MalformedURLException {
050 this(new URL(url));
051 }
052
053 public void invokeOneWay(Invocation invocation, Reader request) throws Exception {
054 invoke(invocation, request);
055 }
056
057
058 public Reader invokeRequest(Invocation invocation, Reader request) throws Exception {
059 String text = invoke(invocation, request);
060 if (log.isTraceEnabled()) {
061 log.trace("Received: " + text);
062 }
063 return new StringReader(text);
064 }
065
066 public void close() throws Exception {
067 }
068
069 // Properties
070 //-------------------------------------------------------------------------
071 public URL getUrl() {
072 return url;
073 }
074
075 public void setUrl(URL url) {
076 this.url = url;
077 }
078
079 // Implementation methods
080 //-------------------------------------------------------------------------
081 protected String invoke(Invocation invocation, Reader request) throws Exception {
082 HttpURLConnection connection = createConnection();
083 BufferedReader in = null;
084 Writer writer = null;
085 try {
086 writer = new OutputStreamWriter(connection.getOutputStream());
087 in = invocation.asBufferedReader(request);
088 while (true) {
089 String line = in.readLine();
090 if (line == null) {
091 break;
092 }
093 writer.write(line);
094 writer.write("\n");
095 }
096 in.close();
097 in = null;
098
099 writer.flush();
100 int answer = connection.getResponseCode();
101 if (answer != HttpURLConnection.HTTP_OK) {
102 throw new Exception("Failed to perform HTTP POST. Response: " + answer);
103 }
104
105 return getText(connection.getInputStream());
106 }
107 finally {
108 if (in != null) {
109 try {
110 in.close();
111 }
112 catch (IOException e) {
113 // ignore
114 }
115 }
116 if (writer != null) {
117 try {
118 writer.close();
119 }
120 catch (IOException e) {
121 // ignore
122 }
123 }
124 connection.disconnect();
125 }
126 }
127
128 protected String getText(InputStream inputStream) throws IOException {
129 StringBuffer buffer = new StringBuffer();
130 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
131 while (true) {
132 String line = in.readLine();
133 if (line == null) {
134 break;
135 }
136 else {
137 buffer.append(line);
138 buffer.append("\n");
139 }
140 }
141 return buffer.toString();
142 }
143
144 protected HttpURLConnection createConnection() throws IOException {
145 URL url = getUrl();
146 if (url == null) {
147 throw new IllegalArgumentException("No 'url' property configured. Cannot perform invocation");
148 }
149 HttpURLConnection answer = (HttpURLConnection) url.openConnection();
150 answer.setDoInput(true);
151 answer.setDoOutput(true);
152 answer.setRequestMethod("POST");
153 configureConnection(answer);
154 answer.connect();
155 return answer;
156 }
157
158 /**
159 * A pluggable Strategy pattern allowing a connection to be configured
160 */
161 protected void configureConnection(HttpURLConnection connection) {
162 }
163
164 }