/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.util.axis;
import com.liferay.portal.kernel.io.unsync.UnsyncBufferedInputStream;
import com.liferay.portal.kernel.io.unsync.UnsyncBufferedOutputStream;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.SystemProperties;
import com.liferay.portal.kernel.util.Validator;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.transport.http.HTTPSender;
/**
* @author Brian Wing Shun Chan
*/
public class SimpleHTTPSender extends HTTPSender {
public SimpleHTTPSender() {
String regexp = SystemProperties.get(
SimpleHTTPSender.class.getName() + ".regexp.pattern");
if (Validator.isNotNull(regexp)) {
_pattern = Pattern.compile(regexp);
}
else {
_pattern = null;
}
}
@Override
public void invoke(MessageContext messageContext) throws AxisFault {
String url = messageContext.getStrProp(MessageContext.TRANS_URL);
Matcher matcher = null;
if (_pattern != null) {
matcher = _pattern.matcher(url);
}
if ((matcher != null) && matcher.matches()) {
if (_log.isDebugEnabled()) {
_log.debug("A match was found for " + url);
}
_invoke(messageContext, url);
}
else {
super.invoke(messageContext);
}
}
private void _invoke(MessageContext messageContext, String url)
throws AxisFault {
try {
String userName = messageContext.getUsername();
String password = messageContext.getPassword();
if ((userName != null) && (password != null)) {
Authenticator.setDefault(
new SimpleAuthenticator(userName, password));
}
URL urlObj = new URL(url);
URLConnection urlConnection = urlObj.openConnection();
_writeToConnection(urlConnection, messageContext);
_readFromConnection(urlConnection, messageContext);
}
catch (Exception e) {
throw AxisFault.makeFault(e);
}
finally {
Authenticator.setDefault(null);
}
}
private void _readFromConnection(
URLConnection urlConnection, MessageContext messageContext)
throws Exception {
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
InputStream inputStream = httpURLConnection.getErrorStream();
if (inputStream == null) {
inputStream = urlConnection.getInputStream();
}
inputStream = new UnsyncBufferedInputStream(inputStream, 8192);
String contentType = urlConnection.getContentType();
String contentLocation = urlConnection.getHeaderField(
"Content-Location");
Message message = new Message(
inputStream, false, contentType, contentLocation);
message.setMessageType(Message.RESPONSE);
messageContext.setResponseMessage(message);
}
private void _writeToConnection(
URLConnection urlConnection, MessageContext messageContext)
throws Exception {
urlConnection.setDoOutput(true);
Message message = messageContext.getRequestMessage();
String contentType = message.getContentType(
messageContext.getSOAPConstants());
urlConnection.setRequestProperty("Content-Type", contentType);
if (messageContext.useSOAPAction()) {
urlConnection.setRequestProperty(
"SOAPAction", messageContext.getSOAPActionURI());
}
OutputStream outputStream = new UnsyncBufferedOutputStream(
urlConnection.getOutputStream(), 8192);
message.writeTo(outputStream);
outputStream.flush();
}
private static final Log _log = LogFactoryUtil.getLog(
SimpleHTTPSender.class);
private final Pattern _pattern;
}