| FlashAxisServiceServlet.java |
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.net.axis.server;
import org.jboss.axis.transport.http.HTTPConstants;
import org.jboss.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* A AxisServlet that allows the Flash player/plugin to interact with the
* Axis SOAP engine despite the inability to generate the SOAPAction HTTP
* header. It spoofs the header by looking at the request parameters and
* generating a derived HttpServletRequestWrapper class to appear to migrate
* those that should actually be HTTP headers into the header. This class
* then just calls its base class's implementation of doPost().
*
* For example, if you were invoking the Hello World SOAP example, you would
* append:
*
* ?SOAPAction=\"Hello\"
*
* to the service context:
*
* /axisflash/flashservices/Hello
*
* <h3> Change History </h3>
* <ul>
* <li> jung, 02.05.2002: Outsourced the strings. </li>
* </ul>
* @author <a href="mailto:fbrier@multideck.com">Frederick N. Brier</a>
* @created 22.04.2002
* @version $Revision: 1.7.6.1 $
*/
public class FlashAxisServiceServlet extends AxisServiceServlet
{
/**
* This is a spoofing class whose sole purpose is to make it appear that
* the HTTP "SOAPAction" parameter is actually an HTTP Header attribute.
*/
public class FilteredHttpServletRequest extends HttpServletRequestWrapper
{
/** we keep the parameter here */
protected String soapAction;
/**
* Constructs an instance with the soapAction set to the value of the
* HTTP "SOAPAction" parameter.
* @param req - HttpServletRequest that is getting spoofed
* @exception IllegalArgumentException is thrown if either the request
* already had a SOAPAction header or if there is no SOAPAction
* parameter.
*/
public FilteredHttpServletRequest(HttpServletRequest req)
throws IllegalArgumentException
{
super(req);
soapAction = (String)req.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
if (null != soapAction)
{
// SOAPAction provided. Don't need spoofed request.
log.error(Constants.ERR_EXISTING_HEADER);
throw new IllegalArgumentException(Constants.ERR_EXISTING_HEADER);
}
soapAction = getParameter(HTTPConstants.HEADER_SOAP_ACTION);
if (null == soapAction)
{
log.error(Constants.ERR_MISSING_PARM);
throw new IllegalArgumentException(Constants.ERR_MISSING_PARM);
}
log.trace("FilteredHttpServletRequest.ctor(): Matched SOAPAction parameter");
} // of FilteredHttpServletRequest constructor
/**
* If there is a SOAPAction HTTP parameter, return that value instead of NULL.
* Otherwise, default to the base class behavior.
* @param name - a String specifying the header name
* @returns a String containing the value of the SOAPAction HTTP parameter if
* that is what is requested via the name parameter, otherwise returns the
* expected HTTP Header value, or null if the request does not have a header
* of that name
*/
public String getHeader(String name)
{
log.trace("FlashAxisServiceServlet.FilteredHttpServletRequest.getHeader()");
if (name.equals(HTTPConstants.HEADER_SOAP_ACTION))
{
log.trace("getHeader(): Matched SOAPAction header request");
return soapAction;
}
else
{
log.trace("getHeader(): Not a SOAPAction header request, called base class method.");
return super.getHeader(name);
}
} // of method getHeader
} // of class FilteredHttpServletRequest
/**
* The instance logger for the service. Not using a class logger
* because we want to dynamically obtain the logger name from
* concrete sub-classes.
*/
protected Logger log;
/**
* Creates new AxisServlet
*/
public FlashAxisServiceServlet()
{
super();
log = Logger.getLogger(getClass());
log.trace("Constructing");
}
/**
* This method sits on top of the AxisService.doPost() acting as a filter
* by first creating a FilterHttpServletRequest and passing it to the base
* class implementation.
* @param req - an HttpServletRequest object that contains the request the
* client has made of the servlet
* @param resp - an HttpServletResponse object that contains the response
* the servlet sends to the client
* @exception IOException if an input or output error is detected when the
* servlet handles the request
* @exception ServletException if the request for the POST could not be
* handled
*/
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
HttpServletRequest newReq = req;
try
{
newReq = new FilteredHttpServletRequest(req);
log.trace("doPost(): Successfully created a FilteredHttpServletRequest object.");
}
catch (IllegalArgumentException e)
{
log.error("doPost(): Failed to create a FilteredHttpServletRequest object. Use original HttpServletRequest.");
}
super.doPost(newReq, res);
}
}| FlashAxisServiceServlet.java |