// Transfer HTTP headers to MIME headers for request message.
MimeHeaders requestMimeHeaders = requestMsg.getMimeHeaders( );
for ( Iterator i = requestHeaders.getAllHeaders( ); i.hasNext( ); )
{
MimeHeader requestHeader = (MimeHeader) i.next( );
requestMimeHeaders.addHeader( requestHeader.getName( ),
requestHeader.getValue( ) );
}
msgContext.setRequestMessage( requestMsg );
// put character encoding of request to message context
// in order to reuse it during the whole process.
String requestEncoding = (String) requestMsg.getProperty( SOAPMessage.CHARACTER_SET_ENCODING );
if ( requestEncoding != null )
{
msgContext.setProperty( SOAPMessage.CHARACTER_SET_ENCODING, requestEncoding );
}
// set up session, if any
if ( m_server.isSessionUsed( ) )
{
// did we get a cookie?
if ( cookie.length( ) > 0 )
{
cooky = cookie.toString( ).trim( );
}
else if ( cookie2.length( ) > 0 )
{
cooky = cookie2.toString( ).trim( );
}
// if cooky is null, cook up a cooky
if ( cooky == null )
{
// fake one up!
// make it be an arbitrarily increasing number
// (no this is not thread safe because ++ isn't atomic)
int i = SimpleAxisServer.sessionIndex++;
cooky = "" + i;
}
msgContext.setSession( m_server.createSession( cooky ) );
}
// invoke the Axis engine
engine.invoke( msgContext );
// Retrieve the response from Axis
responseMsg = msgContext.getResponseMessage( );
if ( responseMsg == null )
{
status = NOCONTENT;
}
}
catch ( Exception e )
{
AxisFault af;
if ( e instanceof AxisFault )
{
af = (AxisFault) e;
log.debug( Messages.getMessage( "serverFault00" ),
af );
QName faultCode = af.getFaultCode( );
if ( Constants.FAULT_SOAP12_SENDER.equals( faultCode ) )
{
status = SENDER;
}
else if ( "Server.Unauthorized".equals( af.getFaultCode( ).getLocalPart( ) ) )
{
status = UNAUTH; // SC_UNAUTHORIZED
}
else
{
status = ISE; // SC_INTERNAL_SERVER_ERROR
}
}
else
{
status = ISE; // SC_INTERNAL_SERVER_ERROR
af = AxisFault.makeFault( e );
}
// There may be headers we want to preserve in the
// response message - so if it's there, just add the
// FaultElement to it. Otherwise, make a new one.
responseMsg = msgContext.getResponseMessage( );
if ( responseMsg == null )
{
responseMsg = new Message( af );
responseMsg.setMessageContext( msgContext );
}
else
{
try
{
SOAPEnvelope env = responseMsg.getSOAPEnvelope( );
env.clearBody( );
env.addBodyElement( new SOAPFault( (AxisFault) e ) );
}
catch ( AxisFault fault )
{
// Should never reach here!
}
}
}
// synchronize the character encoding of request and response
String responseEncoding = (String) msgContext.getProperty( SOAPMessage.CHARACTER_SET_ENCODING );
if ( ( responseEncoding != null ) && ( responseMsg != null ) )
{
responseMsg.setProperty( SOAPMessage.CHARACTER_SET_ENCODING, responseEncoding );
}
// Send it on its way...
OutputStream out = m_socket.getOutputStream( );
out.write( HTTP );
out.write( status );
if ( responseMsg != null )
{
if ( m_server.isSessionUsed( ) && ( null != cooky ) && ( 0 != cooky.trim( ).length( ) ) )
{
// write cookie headers, if any
// don't sweat efficiency *too* badly
// optimize at will
StringBuffer cookieOut = new StringBuffer( );
cookieOut.append( "\r\nSet-Cookie: " ).append( cooky ).append( "\r\nSet-Cookie2: " ).append( cooky );
// OH, THE HUMILITY! yes this is inefficient.
out.write( cookieOut.toString( ).getBytes( ) );
}
//out.write(XML_MIME_STUFF);
out.write( ( "\r\n" + HTTPConstants.HEADER_CONTENT_TYPE + ": "
+ responseMsg.getContentType( msgContext.getSOAPConstants( ) ) ).getBytes( ) );
// Writing the length causes the entire message to be decoded twice.
//out.write(("\r\n" + HTTPConstants.HEADER_CONTENT_LENGTH + ": " + responseMsg.getContentLength()).getBytes());
// putInt(out, response.length);
// Transfer MIME headers to HTTP headers for response message.
for ( Iterator i = responseMsg.getMimeHeaders( ).getAllHeaders( ); i.hasNext( ); )
{
MimeHeader responseHeader = (MimeHeader) i.next( );
out.write( '\r' );
out.write( '\n' );
out.write( responseHeader.getName( ).getBytes( ) );
out.write( headerEnder );
out.write( responseHeader.getValue( ).getBytes( ) );
}
out.write( SEPARATOR );
responseMsg.writeTo( out );
}