in modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java [192:320]
public void run() {
// to support Sandesha.. if there isn't a response message context, we cannot read any
// response and populate it with the soap envelope
if (responseMsgCtx == null) {
return;
}
try {
if (in != null) {
Header cType = response.getFirstHeader(HTTP.CONTENT_TYPE);
String contentType;
if (cType != null) {
// This is the most common case - Most of the time servers send the Content-Type
contentType = cType.getValue();
} else {
// Server hasn't sent the header - Try to infer the content type
contentType = inferContentType();
}
String charSetEnc = BuilderUtil.getCharSetEncoding(contentType);
if (charSetEnc == null) {
charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
}
responseMsgCtx.setProperty(
Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
// workaround for Axis2 TransportUtils.createSOAPMessage() issue, where a response
// of content type "text/xml" is thought to be REST if !MC.isServerSide(). This
// question is still under debate and due to the timelines, I am commiting this
// workaround as Axis2 1.2 is about to be released and Synapse 1.0
responseMsgCtx.setServerSide(false);
SOAPEnvelope envelope;
try {
envelope = TransportUtils.createSOAPMessage(
responseMsgCtx,
HTTPTransportUtils.handleGZip(responseMsgCtx, in),
contentType);
} catch (OMException e) {
// handle non SOAP and POX/REST payloads (probably text/html)
String errorMessage = "Unexpected response received. HTTP response code : "
+ this.response.getStatusLine().getStatusCode() + " HTTP status : "
+ this.response.getStatusLine().getReasonPhrase() + " exception : "
+ e.getMessage();
log.warn(errorMessage);
if (log.isDebugEnabled()) {
log.debug(errorMessage, e);
log.debug("Creating the SOAPFault to be injected...");
}
SOAPFactory factory = OMAbstractFactory.getSOAP11Factory();
envelope = factory.getDefaultFaultEnvelope();
SOAPFaultDetail detail = factory.createSOAPFaultDetail();
detail.setText(errorMessage);
envelope.getBody().getFault().setDetail(detail);
SOAPFaultReason reason = factory.createSOAPFaultReason();
reason.setText(errorMessage);
envelope.getBody().getFault().setReason(reason);
SOAPFaultCode code = factory.createSOAPFaultCode();
code.setText(Integer.toString(this.response.getStatusLine().getStatusCode()));
envelope.getBody().getFault().setCode(code);
}
responseMsgCtx.setServerSide(true);
responseMsgCtx.setEnvelope(envelope);
} else {
// there is no response entity-body
responseMsgCtx.setProperty(NhttpConstants.NO_ENTITY_BODY, Boolean.TRUE);
responseMsgCtx.setEnvelope(OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope());
}
// copy the HTTP status code as a message context property with the key HTTP_SC to be
// used at the sender to set the propper status code when passing the message
int statusCode = this.response.getStatusLine().getStatusCode();
responseMsgCtx.setProperty(NhttpConstants.HTTP_SC, statusCode);
if (statusCode >= 400) {
responseMsgCtx.setProperty(NhttpConstants.FAULT_MESSAGE, NhttpConstants.TRUE);
}
responseMsgCtx.setProperty(NhttpConstants.NON_BLOCKING_TRANSPORT, true);
if (endpointURLPrefix != null) {
responseMsgCtx.setProperty(NhttpConstants.ENDPOINT_PREFIX, endpointURLPrefix);
}
// process response received
try {
AxisEngine.receive(responseMsgCtx);
} catch (AxisFault af) {
// This will be reached if an exception is thrown within an Axis2 handler
String errorMessage = "Fault processing response message through Axis2: " +
af.getMessage();
log.warn(errorMessage);
if (log.isDebugEnabled()) {
log.debug(errorMessage, af);
log.debug("Directly invoking SynapseCallbackReceiver after setting " +
"error properties");
}
responseMsgCtx.setProperty(
NhttpConstants.SENDING_FAULT, Boolean.TRUE);
responseMsgCtx.setProperty(
NhttpConstants.ERROR_CODE, NhttpConstants.RESPONSE_PROCESSING_FAILURE);
responseMsgCtx.setProperty(
NhttpConstants.ERROR_MESSAGE, errorMessage.split("\n")[0]);
responseMsgCtx.setProperty(
NhttpConstants.ERROR_DETAIL, JavaUtils.stackToString(af));
responseMsgCtx.setProperty(
NhttpConstants.ERROR_EXCEPTION, af);
responseMsgCtx.getAxisOperation().getMessageReceiver().receive(responseMsgCtx);
}
} catch (AxisFault af) {
log.error("Fault creating response SOAP envelope", af);
} catch (XMLStreamException e) {
log.error("Error creating response SOAP envelope", e);
} catch (IOException e) {
log.error("Error closing input stream from which message was read", e);
} finally {
// this is the guaranteed location to close the RESPONSE_SOURCE_CHANNEL that was used
// to read the response back from the server.
try {
if (in != null) {
in.close();
}
} catch (IOException ignore) {}
}
}