ServerWorker worker = (ServerWorker) msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
HttpResponse response = worker.getResponse();
OMOutputFormat format = NhttpUtils.getOMOutputFormat(msgContext);
MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(msgContext);
response.setHeader(
HTTP.CONTENT_TYPE,
messageFormatter.getContentType(msgContext, format, msgContext.getSoapAction()));
// return http 500 when a SOAP fault is returned
if (msgContext.getEnvelope().getBody().hasFault()) {
response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
}
// if this is a dummy message to handle http 202 case with non-blocking IO
// set the status code to 202 and the message body to an empty byte array (see below)
if (Utils.isExplicitlyTrue(msgContext, NhttpConstants.SC_ACCEPTED) &&
msgContext.getProperty(
Sandesha2Constants.MessageContextProperties.SEQUENCE_ID) == null) {
response.setStatusCode(HttpStatus.SC_ACCEPTED);
}
// set any transport headers
Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
if (transportHeaders != null && !transportHeaders.values().isEmpty()) {
Iterator iter = transportHeaders.keySet().iterator();
while (iter.hasNext()) {
Object header = iter.next();
Object value = transportHeaders.get(header);
if (value != null && header instanceof String && value instanceof String) {
response.setHeader((String) header, (String) value);
}
}
}
worker.getServiceHandler().commitResponse(worker.getConn(), response);
OutputStream out = worker.getOutputStream();
try {
if (Utils.isExplicitlyTrue(msgContext, NhttpConstants.SC_ACCEPTED) &&
msgContext.getProperty(
Sandesha2Constants.MessageContextProperties.SEQUENCE_ID) == null) {
// see comment above on the reasoning
out.write(new byte[0]);
} else {
messageFormatter.writeTo(msgContext, format, out, true);
}
out.close();
} catch (IOException e) {
handleException("IO Error sending response message", e);
}