// read headers
is.setInputStream( m_socket.getInputStream( ) );
// parse all headers into hashtable
MimeHeaders requestHeaders = new MimeHeaders( );
int contentLength =
parseHeaders( is, buf, contentType, contentLocation, soapAction, httpRequest, fileName, cookie,
cookie2, authInfo, requestHeaders );
is.setContentLength( contentLength );
int paramIdx = fileName.toString( ).indexOf( '?' );
if ( paramIdx != -1 )
{
// Got params
String params = fileName.substring( paramIdx + 1 );
fileName.setLength( paramIdx );
log.debug( Messages.getMessage( "filename00",
fileName.toString( ) ) );
log.debug( Messages.getMessage( "params00", params ) );
if ( "wsdl".equalsIgnoreCase( params ) )
{
doWsdl = true;
}
if ( params.startsWith( "method=" ) )
{
methodName = params.substring( 7 );
}
}
// Real and relative paths are the same for the
// SimpleAxisServer
msgContext.setProperty( Constants.MC_REALPATH,
fileName.toString( ) );
msgContext.setProperty( Constants.MC_RELATIVE_PATH,
fileName.toString( ) );
msgContext.setProperty( Constants.MC_JWS_CLASSDIR, "jwsClasses" );
msgContext.setProperty( Constants.MC_HOME_DIR, "." );
// !!! Fix string concatenation
String url =
"http://" + getLocalHost( ) + ":" + m_server.getServerSocket( ).getLocalPort( ) + "/"
+ fileName.toString( );
msgContext.setProperty( MessageContext.TRANS_URL, url );
String filePart = fileName.toString( );
if ( filePart.startsWith( "axis/services/" ) )
{
String servicePart = filePart.substring( 14 );
int separator = servicePart.indexOf( '/' );
if ( separator > -1 )
{
msgContext.setProperty( "objectID",
servicePart.substring( separator + 1 ) );
servicePart = servicePart.substring( 0, separator );
}
msgContext.setTargetService( servicePart );
}
if ( authInfo.length( ) > 0 )
{
// Process authentication info
//authInfo = new StringBuffer("dXNlcjE6cGFzczE=");
byte[] decoded = Base64.decode( authInfo.toString( ) );
StringBuffer userBuf = new StringBuffer( );
StringBuffer pwBuf = new StringBuffer( );
StringBuffer authBuf = userBuf;
for ( int i = 0; i < decoded.length; i++ )
{
if ( (char) ( decoded[i] & 0x7f ) == ':' )
{
authBuf = pwBuf;
continue;
}
authBuf.append( (char) ( decoded[i] & 0x7f ) );
}
if ( log.isDebugEnabled( ) )
{
log.debug( Messages.getMessage( "user00",
userBuf.toString( ) ) );
}
msgContext.setUsername( userBuf.toString( ) );
msgContext.setPassword( pwBuf.toString( ) );
}
// if get, then return simpleton document as response
if ( httpRequest.toString( ).equals( "GET" ) )
{
OutputStream out = m_socket.getOutputStream( );
out.write( HTTP );
if ( fileName.length( ) == 0 )
{
out.write( "301 Redirect\nLocation: /axis/\n\n".getBytes( ) );
out.flush( );
return;
}
out.write( status );
if ( methodName != null )
{
String body = "<" + methodName + ">" +
// args +
"</" + methodName + ">";
String msgtxt =
"<SOAP-ENV:Envelope" + " xmlns:SOAP-ENV=\"" + Constants.URI_SOAP12_ENV + "\">"
+ "<SOAP-ENV:Body>" + body + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>";
ByteArrayInputStream istream = new ByteArrayInputStream( msgtxt.getBytes( ) );
requestMsg = new Message( istream );
}
else if ( doWsdl )
{
engine.generateWSDL( msgContext );
Document doc = (Document) msgContext.getProperty( "WSDL" );
if ( doc != null )
{
XMLUtils.normalize( doc.getDocumentElement( ) );
String response = XMLUtils.PrettyDocumentToString( doc );
byte[] respBytes = response.getBytes( );
out.write( XML_MIME_STUFF );
putInt( buf, out, respBytes.length );
out.write( SEPARATOR );
out.write( respBytes );
out.flush( );
return;
}
}
else if ( fileName.equals( "/" ) )
{
StringBuffer sb = new StringBuffer( );
sb.append( "<h2>And now... Some Services</h2>\n" );
Iterator i = engine.getConfig( ).getDeployedServices( );
sb.append( "<ul>\n" );
while ( i.hasNext( ) )
{
ServiceDesc sd = (ServiceDesc) i.next( );
sb.append( "<li>\n" );
sb.append( sd.getName( ) );
sb.append( " <a href=\"services/" );
sb.append( sd.getName( ) );
sb.append( "?wsdl\"><i>(wsdl)</i></a></li>\n" );
ArrayList operations = sd.getOperations( );
if ( !operations.isEmpty( ) )
{
sb.append( "<ul>\n" );
for ( Iterator it = operations.iterator( ); it.hasNext( ); )
{
OperationDesc desc = (OperationDesc) it.next( );
sb.append( "<li>" + desc.getName( ) );
}
sb.append( "</ul>\n" );
}
}
sb.append( "</ul>\n" );
byte[] bytes = sb.toString( ).getBytes( );
out.write( HTML_MIME_STUFF );
putInt( buf, out, bytes.length );
out.write( SEPARATOR );
out.write( bytes );
out.flush( );
return;
}
else
{
String filePath = fileName.toString( );
if ( filePath.startsWith( "/" ) )
{
filePath = filePath.substring( 1 );
}
File realPath = new File( m_docRootDir, filePath );
InputStream in = new BufferedInputStream( new FileInputStream( realPath ) );
//System.out.println( "Serving up " + realPath + " on a silver platter..." );
IoUtils.copy( in, out );
in.close( );
out.flush( );
return;
}
}
else
{
// this may be "" if either SOAPAction: "" or if no SOAPAction at all.
// for now, do not complain if no SOAPAction at all
String soapActionString = soapAction.toString( );
if ( soapActionString != null )
{
msgContext.setUseSOAPAction( true );
msgContext.setSOAPActionURI( soapActionString );
}
requestMsg = new Message( is,
false,
contentType.toString( ),
contentLocation.toString( ) );
}
// 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 );