}
// 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 (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(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.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, responseEncoding);
}
// Send it on its way...
OutputStream out = socket.getOutputStream();
out.write(HTTP);
out.write(status);
//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);
if (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());
}
// 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);
if (responseMsg != null)
responseMsg.writeTo(out);