* The main workhorse method.
*/
public void run() {
byte buf[] = new byte[BUFSIZ];
// create an Axis server
AxisServer engine = server.getAxisServer();
// create and initialize a message context
MessageContext msgContext = new MessageContext(engine);
Message requestMsg;
// Reusuable, buffered, content length controlled, InputStream
NonBlockingBufferedInputStream is =
new NonBlockingBufferedInputStream();
// buffers for the headers we care about
StringBuffer soapAction = new StringBuffer();
StringBuffer httpRequest = new StringBuffer();
StringBuffer fileName = new StringBuffer();
StringBuffer cookie = new StringBuffer();
StringBuffer cookie2 = new StringBuffer();
StringBuffer authInfo = new StringBuffer();
StringBuffer contentType = new StringBuffer();
StringBuffer contentLocation = new StringBuffer();
Message responseMsg = null;
// prepare request (do as much as possible while waiting for the
// next connection). Note the next two statements are commented
// out. Uncomment them if you experience any problems with not
// resetting state between requests:
// msgContext = new MessageContext();
// requestMsg = new Message("", "String");
try {
msgContext.setTargetService(null);
} catch (AxisFault fault) {
}
msgContext.setResponseMessage(null);
msgContext.reset();
//msgContext.setProperty("transport", "HTTPTransport");
msgContext.setTransportName(transportName);
responseMsg = null;
try {
// assume the best
byte[] status = OK;
// assume we're not getting WSDL
boolean doWsdl = false;
// cookie for this session, if any
String cooky = null;
try {
// wipe cookies if we're doing sessions
if (server.isSessionUsed()) {
cookie.delete(0, cookie.length());
cookie2.delete(0, cookie2.length());
}
authInfo.delete(0, authInfo.length());
// read headers
is.setInputStream(socket.getInputStream());
// parse all headers into hashtable
int contentLength = parseHeaders(is, buf, contentType,
contentLocation, soapAction,
httpRequest, fileName,
cookie, cookie2, authInfo);
is.setContentLength(contentLength);
int paramIdx = fileName.toString().indexOf('?');
if (paramIdx != -1) {
// Got params
String params = fileName.substring(paramIdx + 1);
fileName.setLength(paramIdx);
log.debug(JavaUtils.getMessage("filename00",
fileName.toString()));
log.debug(JavaUtils.getMessage("params00",
params));
if ("wsdl".equalsIgnoreCase(params))
doWsdl = true;
}
// 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");
// !!! Fix string concatenation
String url = "http://" + getLocalHost() + ":" +
server.getServerSocket().getLocalPort() + "/" +
fileName.toString();
msgContext.setProperty(MessageContext.TRANS_URL, url);
String filePart = fileName.toString();
if (filePart.startsWith("axis/services/")) {
msgContext.setTargetService(filePart.substring(14));
}
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(JavaUtils.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 = socket.getOutputStream();
out.write(HTTP);
out.write(status);
if (doWsdl) {
engine.generateWSDL(msgContext);
Document doc = (Document) msgContext.getProperty("WSDL");
if (doc != null) {
String response = XMLUtils.DocumentToString(doc);
byte[] respBytes = response.getBytes();
out.write(XML_MIME_STUFF);
putInt(buf, out, respBytes.length);
out.write(SEPARATOR);
out.write(respBytes);
out.flush();
return;
}
}
StringBuffer sb = new StringBuffer();
sb.append("<h2>And now... Some Services</h2>\n");
Iterator i = engine.getConfig().getDeployedServices();
out.write("<ul>\n".getBytes());
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;
}
// 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()
);
msgContext.setRequestMessage(requestMsg);
// set up session, if any
if (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 = server.sessionIndex++;
cooky = "" + i;
}
msgContext.setSession(server.createSession(cooky));
}
// invoke the Axis engine
engine.invoke(msgContext);
// Retrieve the response from Axis
responseMsg = msgContext.getResponseMessage();
if (responseMsg == null) {
throw new AxisFault(JavaUtils.getMessage("nullResponse00"));