in modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java [647:836]
public void responseReceived(final NHttpClientConnection conn) {
setServerContextAttribute(NhttpConstants.RES_HEADER_ARRIVAL_TIME,
System.currentTimeMillis(), conn);
HttpContext context = conn.getContext();
HttpResponse response = conn.getHttpResponse();
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_CONTINUE) {
if (log.isDebugEnabled()) {
log.debug("Received a 100 Continue response");
}
// according to the HTTP 1.1 specification HTTP status 100 continue implies that
// the response will be followed, and the client should just ignore the 100 Continue
// and wait for the response
return;
}
ClientConnectionDebug ccd = (ClientConnectionDebug)
conn.getContext().getAttribute(CLIENT_CONNECTION_DEBUG);
if (ccd != null) {
ccd.recordResponseStartTime(response.getStatusLine().toString());
}
// Have we sent out our request fully in the first place? if not, forget about it now..
Axis2HttpRequest req
= (Axis2HttpRequest) conn.getContext().getAttribute(AXIS2_HTTP_REQUEST);
if (req != null) {
req.setCompleted(true);
if (log.isDebugEnabled()) {
log.debug("Response Received for Request : " + req);
}
if (!req.isSendingCompleted()) {
req.getMsgContext().setProperty(
NhttpConstants.ERROR_CODE, NhttpConstants.SEND_ABORT);
SharedOutputBuffer outputBuffer = (SharedOutputBuffer)
conn.getContext().getAttribute(REQUEST_SOURCE_BUFFER);
if (outputBuffer != null) {
outputBuffer.shutdown();
}
if (log.isDebugEnabled()) {
log.debug("Remote server aborted request being sent and replied : " + conn
+ " for request : " + conn.getContext().getAttribute(
NhttpConstants.HTTP_REQ_METHOD));
}
context.setAttribute(NhttpConstants.DISCARD_ON_COMPLETE, Boolean.TRUE);
if (metrics != null) {
metrics.incrementFaultsSending(NhttpConstants.SEND_ABORT, req.getMsgContext());
}
}
}
switch (response.getStatusLine().getStatusCode()) {
case HttpStatus.SC_ACCEPTED : {
if (log.isDebugEnabled()) {
log.debug("Received a 202 Accepted response");
}
// sometimes, some http clients sends an "\r\n" as the content body with a
// HTTP 202 OK.. we will just get it into this temp buffer and ignore it..
ContentInputBuffer inputBuffer = new SharedInputBuffer(8, allocator);
context.setAttribute(RESPONSE_SINK_BUFFER, inputBuffer);
// create a dummy message with an empty SOAP envelope and a property
// NhttpConstants.SC_ACCEPTED set to Boolean.TRUE to indicate this is a
// placeholder message for the transport to send a HTTP 202 to the
// client. Should / would be ignored by any transport other than
// nhttp. For example, JMS would not send a reply message for one-way
// operations.
MessageContext outMsgCtx =
(MessageContext) context.getAttribute(OUTGOING_MESSAGE_CONTEXT);
MessageReceiver mr = outMsgCtx.getAxisOperation().getMessageReceiver();
// the following check is to support the dual channel invocation. Hence the
// response will be sent as a new request to the client over a different channel
// client sends back a 202 Accepted response to synapse and we need to neglect that
// 202 Accepted message
if (!outMsgCtx.isPropertyTrue(NhttpConstants.IGNORE_SC_ACCEPTED)) {
try {
MessageContext responseMsgCtx = outMsgCtx.getOperationContext().
getMessageContext(WSDL2Constants.MESSAGE_LABEL_IN);
if (responseMsgCtx == null ||
outMsgCtx.getOptions().isUseSeparateListener() ||
outMsgCtx.getOperationContext().isComplete()) {
if (responseMsgCtx != null &&
responseMsgCtx.getProperty("synapse.send") == null) {
return;
}
} else if (outMsgCtx.getOptions().isUseSeparateListener()) {
// Since we need to notify the SynapseCallback receiver to remove the
// call backs registered we set a custom property
setHeaders(context, response, outMsgCtx, responseMsgCtx);
outMsgCtx.setProperty(NhttpConstants.HTTP_202_RECEIVED, "true");
mr.receive(outMsgCtx);
return;
}
if (responseMsgCtx == null) {
return;
}
setHeaders(context, response, outMsgCtx, responseMsgCtx);
responseMsgCtx.setServerSide(true);
responseMsgCtx.setDoingREST(outMsgCtx.isDoingREST());
responseMsgCtx.setProperty(MessageContext.TRANSPORT_IN,
outMsgCtx.getProperty(MessageContext.TRANSPORT_IN));
responseMsgCtx.setTransportIn(outMsgCtx.getTransportIn());
responseMsgCtx.setTransportOut(outMsgCtx.getTransportOut());
responseMsgCtx.setAxisMessage(outMsgCtx.getAxisOperation().
getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
responseMsgCtx.setOperationContext(outMsgCtx.getOperationContext());
responseMsgCtx.setConfigurationContext(outMsgCtx.getConfigurationContext());
responseMsgCtx.setTo(null);
if (!outMsgCtx.isDoingREST() && !outMsgCtx.isSOAP11()) {
responseMsgCtx.setEnvelope(OMAbstractFactory.getSOAP12Factory().getDefaultEnvelope());
} else {
responseMsgCtx.setEnvelope(OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope());
}
responseMsgCtx.setProperty(AddressingConstants.
DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.TRUE);
responseMsgCtx.setProperty(NhttpConstants.SC_ACCEPTED, Boolean.TRUE);
mr.receive(responseMsgCtx);
} catch (org.apache.axis2.AxisFault af) {
log.debug("Unable to report back " +
"202 Accepted state to the message receiver");
}
}
return;
}
case HttpStatus.SC_OK : {
processResponse(conn, context, response);
return;
}
case HttpStatus.SC_INTERNAL_SERVER_ERROR: {
if (warnOnHttp500(response)) {
log.warn(getErrorMessage("Received an internal server error : "
+ response.getStatusLine().getReasonPhrase(), conn));
}
processResponse(conn, context, response);
return;
}
default : {
if (log.isDebugEnabled()) {
log.debug(getErrorMessage("HTTP status code received : " +
response.getStatusLine().getStatusCode() + " :: " +
response.getStatusLine().getReasonPhrase(), conn));
}
Header contentType = response.getFirstHeader(HTTP.CONTENT_TYPE);
if (contentType != null) {
if ((contentType.getValue().indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) >= 0)
|| contentType.getValue().indexOf(
SOAP12Constants.SOAP_12_CONTENT_TYPE) >=0) {
if (log.isDebugEnabled()) {
log.debug("Received an unexpected response with a SOAP payload");
}
} else if (contentType.getValue().indexOf("html") == -1) {
if (log.isDebugEnabled()) {
log.debug("Received an unexpected response with a POX/REST payload");
}
} else {
log.warn(getErrorMessage("Received an unexpected response - " +
"of content type : " + contentType.getValue() +
" and status code : " + response.getStatusLine().getStatusCode() +
" with reason : " +
response.getStatusLine().getReasonPhrase(), conn));
}
} else {
if (log.isDebugEnabled()) {
log.debug(getErrorMessage("Received a response - " +
"without a content type with status code : " +
response.getStatusLine().getStatusCode() + " and reason : " +
response.getStatusLine().getReasonPhrase(), conn));
}
}
processResponse(conn, context, response);
}
}
}