use of org.apache.synapse.endpoints.OAuthConfiguredHTTPEndpoint in project wso2-synapse by wso2.
the class OAuthUtils method retryOnOAuthFailure.
/**
* Method to check whether retry is needed.
*
* @param httpEndpoint OAuth Configured HTTP Endpoint related to the message context
* @param synapseInMsgCtx MessageContext that has been received
* @param synapseOutMsgCtx Corresponding outgoing Synapse MessageContext for the above received MessageContext
* @return true if the call needs to be retried
*/
public static boolean retryOnOAuthFailure(OAuthConfiguredHTTPEndpoint httpEndpoint, MessageContext synapseInMsgCtx, MessageContext synapseOutMsgCtx) {
Boolean hasRetried = (Boolean) synapseOutMsgCtx.getProperty(OAuthConstants.RETRIED_ON_OAUTH_FAILURE);
if (hasRetried != null && hasRetried) {
return false;
}
org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) synapseInMsgCtx).getAxis2MessageContext();
Object statusCode = axis2MessageContext.getProperty(PassThroughConstants.HTTP_SC);
if (statusCode != null) {
try {
int httpStatus = Integer.parseInt(axis2MessageContext.getProperty(PassThroughConstants.HTTP_SC).toString());
if (httpStatus == OAuthConstants.HTTP_SC_UNAUTHORIZED) {
return true;
}
} catch (NumberFormatException e) {
log.warn("Unable to set the HTTP status code from the property " + PassThroughConstants.HTTP_SC + " with value: " + statusCode);
}
}
return false;
}
use of org.apache.synapse.endpoints.OAuthConfiguredHTTPEndpoint in project wso2-synapse by wso2.
the class SynapseCallbackReceiver method handleMessage.
/**
* Handle the response or error (during a failed send) message received for an outgoing request
*
* @param messageID Request message ID
* @param response the Axis2 MessageContext that has been received and has to be handled
* @param synapseOutMsgCtx the corresponding (outgoing) Synapse MessageContext for the above
* Axis2 MC, that holds Synapse specific information such as the error
* handler stack and local properties etc.
* @throws AxisFault if the message cannot be processed
*/
private void handleMessage(String messageID, MessageContext response, org.apache.synapse.MessageContext synapseOutMsgCtx, AsyncCallback callback) throws AxisFault {
// apply the tenant information to the out message context
TenantInfoConfigurator configurator = synapseOutMsgCtx.getEnvironment().getTenantInfoConfigurator();
if (configurator != null) {
configurator.applyTenantInfo(synapseOutMsgCtx);
}
Boolean isConcurrencyThrottleEnabled = (Boolean) synapseOutMsgCtx.getProperty(SynapseConstants.SYNAPSE_CONCURRENCY_THROTTLE);
if (isConcurrencyThrottleEnabled != null && isConcurrencyThrottleEnabled) {
ConcurrentAccessController concurrentAccessController = (ConcurrentAccessController) synapseOutMsgCtx.getProperty(SynapseConstants.SYNAPSE_CONCURRENT_ACCESS_CONTROLLER);
int available = concurrentAccessController.incrementAndGet();
int concurrentLimit = concurrentAccessController.getLimit();
if (log.isDebugEnabled()) {
log.debug("Concurrency Throttle : Connection returned" + " :: " + available + " of available of " + concurrentLimit + " connections");
}
ConcurrentAccessReplicator concurrentAccessReplicator = (ConcurrentAccessReplicator) synapseOutMsgCtx.getProperty(SynapseConstants.SYNAPSE_CONCURRENT_ACCESS_REPLICATOR);
String throttleKey = (String) synapseOutMsgCtx.getProperty(SynapseConstants.SYNAPSE_CONCURRENCY_THROTTLE_KEY);
if (concurrentAccessReplicator != null) {
concurrentAccessReplicator.replicate(throttleKey, true);
}
}
// get the original message context that went through the OAuth Configured HTTP endpoint
// this is used to retry the call when there is any oauth related issue
org.apache.synapse.MessageContext originalMC = MessageCache.getInstance().removeMessageContext(synapseOutMsgCtx.getMessageID());
Object o = response.getProperty(SynapseConstants.SENDING_FAULT);
if (o != null && Boolean.TRUE.equals(o)) {
// This path hits with a fault. Sequence mediator threads should not remove faultSequence.
// SynapseCallbackReceiver thread should handle the faultStack.
// We have to clone the message context to avoid Intermittently ConcurrentModificationException when request
// burst on passthrough transport
Axis2MessageContext axis2MC = (Axis2MessageContext) synapseOutMsgCtx;
axis2MC.setAxis2MessageContext(MessageHelper.cloneAxis2MessageContext(((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext(), true, true, false));
Pipe pipe = (Pipe) ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext().getProperty(PassThroughConstants.PASS_THROUGH_PIPE);
SourceConfiguration sourceConfiguration = (SourceConfiguration) ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext().getProperty("PASS_THROUGH_SOURCE_CONFIGURATION");
if (pipe != null && pipe.isSerializationComplete() && sourceConfiguration != null) {
NHttpServerConnection conn = (NHttpServerConnection) ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext().getProperty("pass-through.Source-Connection");
Pipe newPipe = new Pipe(conn, sourceConfiguration.getBufferFactory().getBuffer(), "source", sourceConfiguration);
newPipe.setDiscardable(true);
((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext().setProperty(PassThroughConstants.PASS_THROUGH_PIPE, newPipe);
}
// there is a sending fault. propagate the fault to fault handlers.
Stack faultStack = synapseOutMsgCtx.getFaultStack();
if (faultStack != null && !faultStack.isEmpty()) {
// fault envelope
try {
synapseOutMsgCtx.getEnvelope().build();
} catch (Exception x) {
synapseOutMsgCtx.setEnvelope(response.getEnvelope());
}
Exception e = (Exception) response.getProperty(SynapseConstants.ERROR_EXCEPTION);
synapseOutMsgCtx.setProperty(SynapseConstants.SENDING_FAULT, Boolean.TRUE);
synapseOutMsgCtx.setProperty(SynapseConstants.ERROR_CODE, response.getProperty(SynapseConstants.ERROR_CODE));
synapseOutMsgCtx.setProperty(SynapseConstants.ERROR_MESSAGE, response.getProperty(SynapseConstants.ERROR_MESSAGE));
synapseOutMsgCtx.setProperty(SynapseConstants.ERROR_DETAIL, response.getProperty(SynapseConstants.ERROR_DETAIL));
synapseOutMsgCtx.setProperty(SynapseConstants.ERROR_EXCEPTION, e);
/* Clear the NO_KEEPALIVE property to prevent closing response connection when going through
the fault sequence due to sender error. Since the axis2 message context used here
is the same axis2 message context used in request path and the intention of this property
is to Disable HTTP keep alive for outgoing requests only. If it is required this can be put
in fault sequence.
*/
((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext().removeProperty(PassThroughConstants.NO_KEEPALIVE);
if (synapseOutMsgCtx.getEnvironment().isContinuationEnabled()) {
synapseOutMsgCtx.setContinuationEnabled(true);
}
if (log.isDebugEnabled()) {
log.debug("[Failed Request Message ID : " + messageID + "]" + " [New to be Retried Request Message ID : " + synapseOutMsgCtx.getMessageID() + "]");
}
Integer errorCode = (Integer) response.getProperty(SynapseConstants.ERROR_CODE);
// If a timeout has occured and the timeout action of the callback is to discard the message
if (errorCode != null && errorCode == SynapseConstants.NHTTP_CONNECTION_TIMEOUT && callback.getTimeOutAction() == SynapseConstants.DISCARD) {
// Do not execute any fault sequences. Discard message
if (log.isWarnEnabled()) {
log.warn("Synapse timed out for the request with Message ID : " + messageID + ". Ignoring fault handlers since the timeout action is DISCARD");
}
faultStack.removeAllElements();
} else {
((FaultHandler) faultStack.pop()).handleFault(synapseOutMsgCtx, null);
}
}
} else {
// there can always be only one instance of an Endpoint in the faultStack of a message
// if the send was successful, so remove it before we proceed any further
Stack faultStack = synapseOutMsgCtx.getFaultStack();
Endpoint successfulEndpoint = null;
if (faultStack != null && !faultStack.isEmpty() && faultStack.peek() instanceof Endpoint) {
successfulEndpoint = (Endpoint) faultStack.pop();
}
if (log.isDebugEnabled()) {
log.debug("Synapse received an asynchronous response message");
log.debug("Received To: " + (response.getTo() != null ? response.getTo().getAddress() : "null"));
log.debug("SOAPAction: " + (response.getSoapAction() != null ? response.getSoapAction() : "null"));
log.debug("WSA-Action: " + (response.getWSAAction() != null ? response.getWSAAction() : "null"));
String[] cids = null;
try {
cids = response.getAttachmentMap().getAllContentIDs();
} catch (Exception ex) {
// partially read stream could lead to corrupted attachment map and hence this exception
// corrupted attachment map leads to inconsistent runtime exceptions and behavior
// discard the attachment map for the fault handler invocation
// ensure the successful completion for fault handler flow
response.setAttachmentMap(null);
log.error("Synapse encountered an exception when reading attachments from bytes stream. " + "Hence Attachments map is dropped from the message context.", ex);
}
if (cids != null && cids.length > 0) {
for (String cid : cids) {
log.debug("Attachment : " + cid);
}
}
log.debug("Body : \n" + response.getEnvelope());
}
MessageContext axisOutMsgCtx = ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext();
// Processes 'Accept-Encoding'
ResponseAcceptEncodingProcessor.process(response, axisOutMsgCtx);
response.setServiceContext(null);
response.setOperationContext(axisOutMsgCtx.getOperationContext());
response.setAxisMessage(axisOutMsgCtx.getAxisOperation().getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
// set properties on response
response.setServerSide(true);
response.setProperty(CorrelationConstants.CORRELATION_ID, axisOutMsgCtx.getProperty(CorrelationConstants.CORRELATION_ID));
response.setProperty(SynapseConstants.ISRESPONSE_PROPERTY, Boolean.TRUE);
response.setProperty(MessageContext.TRANSPORT_OUT, axisOutMsgCtx.getProperty(MessageContext.TRANSPORT_OUT));
response.setProperty(org.apache.axis2.Constants.OUT_TRANSPORT_INFO, axisOutMsgCtx.getProperty(org.apache.axis2.Constants.OUT_TRANSPORT_INFO));
response.setTransportIn(axisOutMsgCtx.getTransportIn());
response.setTransportOut(axisOutMsgCtx.getTransportOut());
// response.setDoingREST(axisOutMsgCtx.isDoingREST()); This information already present, hence removing
if (axisOutMsgCtx.isDoingMTOM() && (axisOutMsgCtx.getProperty(org.apache.axis2.Constants.Configuration.ENABLE_MTOM) == null || Boolean.getBoolean((String) axisOutMsgCtx.getProperty(org.apache.axis2.Constants.Configuration.ENABLE_MTOM)) == true)) {
response.setDoingMTOM(true);
response.setProperty(org.apache.axis2.Constants.Configuration.ENABLE_MTOM, org.apache.axis2.Constants.VALUE_TRUE);
}
if (axisOutMsgCtx.isDoingSwA()) {
response.setDoingSwA(true);
response.setProperty(org.apache.axis2.Constants.Configuration.ENABLE_SWA, org.apache.axis2.Constants.VALUE_TRUE);
}
// property state to original state.
if (axisOutMsgCtx.getProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES) != null) {
response.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, axisOutMsgCtx.getProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES));
} else {
response.removeProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES);
}
Object messageType = axisOutMsgCtx.getProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE);
if (!HTTPConstants.MEDIA_TYPE_X_WWW_FORM.equals(messageType)) {
// copy the message type property that's used by the out message to the
// response message
response.setProperty(org.apache.axis2.Constants.Configuration.MESSAGE_TYPE, messageType);
}
if (axisOutMsgCtx.getMessageID() != null) {
response.setRelationships(new RelatesTo[] { new RelatesTo(axisOutMsgCtx.getMessageID()) });
}
response.setReplyTo(axisOutMsgCtx.getReplyTo());
response.setFaultTo(axisOutMsgCtx.getFaultTo());
if (axisOutMsgCtx.isPropertyTrue(NhttpConstants.IGNORE_SC_ACCEPTED)) {
response.setProperty(NhttpConstants.FORCE_SC_ACCEPTED, Constants.VALUE_TRUE);
}
// axis2 client options still contains properties such as policy files used in
// outgoing request. Need to remove those.
removeUnwantedClientOptions(response);
// create the synapse message context for the response
Axis2MessageContext synapseInMessageContext = new Axis2MessageContext(response, synapseOutMsgCtx.getConfiguration(), synapseOutMsgCtx.getEnvironment());
synapseInMessageContext.setResponse(true);
Object obj = synapseOutMsgCtx.getProperty(SynapseConstants.FORCE_ERROR_PROPERTY);
String errorOnSOAPFault = (String) obj;
boolean failOver = isChildOfFailOverEP(successfulEndpoint);
if (Constants.VALUE_TRUE.equals(errorOnSOAPFault) && successfulEndpoint != null) {
if (log.isDebugEnabled()) {
log.debug("FORCE_ERROR_ON_SOAP_FAULT is true, checking for SOAPFault");
}
try {
org.apache.axis2.context.MessageContext axis2MsgCtx = ((Axis2MessageContext) synapseInMessageContext).getAxis2MessageContext();
MessageHandlerProvider.getMessageHandler(axis2MsgCtx).buildMessage(axis2MsgCtx, true);
} catch (Exception e) {
// handleException("Error while building message", e, synapseInMessageContext);
}
if ((synapseInMessageContext.getEnvelope() != null) && synapseInMessageContext.getEnvelope().hasFault()) {
invokeHandlers(synapseInMessageContext);
if (log.isDebugEnabled()) {
log.debug("SOAPFault found in response message, forcing endpoint " + successfulEndpoint.getName() + " to fail");
}
// setup new pipe configuration..if failure happens (this will be setup as the source writer and during the TargetContext
// clean up operation the writer will be reset and pull to the buffer
MessageContext axis2OUTMC = ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext();
NHttpServerConnection conn = (NHttpServerConnection) axis2OUTMC.getProperty("pass-through.Source-Connection");
SourceConfiguration sourceConfiguration = (SourceConfiguration) axis2OUTMC.getProperty("PASS_THROUGH_SOURCE_CONFIGURATION");
if (conn != null && sourceConfiguration != null) {
Pipe pipe = new Pipe(conn, sourceConfiguration.getBufferFactory().getBuffer(), "source", sourceConfiguration);
axis2OUTMC.setProperty(PassThroughConstants.PASS_THROUGH_PIPE, pipe);
}
synapseOutMsgCtx.setProperty(SynapseConstants.SENDING_FAULT, Boolean.TRUE);
synapseOutMsgCtx.setProperty(SynapseConstants.ERROR_CODE, SynapseConstants.ENDPOINT_CUSTOM_ERROR);
for (Object key : synapseOutMsgCtx.getPropertyKeySet()) {
synapseInMessageContext.setProperty((String) key, synapseOutMsgCtx.getProperty((String) key));
}
if (failOver) {
// we may required to handle same message for failover cases only other than that
// should treat based on the incoming message
((FaultHandler) successfulEndpoint).handleFault(synapseOutMsgCtx, null);
} else {
faultStack = synapseOutMsgCtx.getFaultStack();
if (faultStack != null) {
synapseInMessageContext.getFaultStack().addAll(faultStack);
((FaultHandler) successfulEndpoint).handleFault(synapseInMessageContext, null);
}
}
return;
} else {
successfulEndpoint.onSuccess();
if (failOver) {
popFailOverEPFromFaultStack(synapseOutMsgCtx);
}
}
} else if (successfulEndpoint != null) {
successfulEndpoint.onSuccess();
if (failOver) {
popFailOverEPFromFaultStack(synapseOutMsgCtx);
}
}
synapseInMessageContext.setTo(new EndpointReference(AddressingConstants.Final.WSA_ANONYMOUS_URL));
synapseInMessageContext.setTracingState(synapseOutMsgCtx.getTracingState());
synapseInMessageContext.setMessageFlowTracingState(synapseOutMsgCtx.getMessageFlowTracingState());
for (Object key : synapseOutMsgCtx.getPropertyKeySet()) {
synapseInMessageContext.setProperty((String) key, synapseOutMsgCtx.getProperty((String) key));
}
if (successfulEndpoint instanceof OAuthConfiguredHTTPEndpoint) {
OAuthConfiguredHTTPEndpoint httpEndpoint = (OAuthConfiguredHTTPEndpoint) successfulEndpoint;
if (originalMC != null && OAuthUtils.retryOnOAuthFailure(httpEndpoint, synapseInMessageContext, synapseOutMsgCtx)) {
httpEndpoint.retryCallWithNewToken(originalMC);
return;
}
}
// Copy SequenceCallStack from original MC to the new MC
Boolean isContinuationCall = (Boolean) synapseOutMsgCtx.getProperty(SynapseConstants.CONTINUATION_CALL);
if (isContinuationCall != null && isContinuationCall) {
// Set the message direction
if (!synapseOutMsgCtx.isResponse()) {
synapseInMessageContext.setResponse(false);
}
Stack<ContinuationState> seqContinuationStates = synapseOutMsgCtx.getContinuationStateStack();
for (int i = 0; i < seqContinuationStates.size(); i++) {
synapseInMessageContext.pushContinuationState(seqContinuationStates.get(i));
}
faultStack = synapseOutMsgCtx.getFaultStack();
if (faultStack != null) {
synapseInMessageContext.getFaultStack().addAll(faultStack);
}
}
// If this response is related to session affinity endpoints -Server initiated session
Dispatcher dispatcher = (Dispatcher) synapseOutMsgCtx.getProperty(SynapseConstants.PROP_SAL_ENDPOINT_CURRENT_DISPATCHER);
if (dispatcher != null && dispatcher.isServerInitiatedSession()) {
dispatcher.updateSession(synapseInMessageContext);
}
// send the response message through the synapse mediation flow
try {
synapseOutMsgCtx.getEnvironment().injectMessage(synapseInMessageContext);
} catch (Exception syne) {
// introduced to handle runtime exceptions which are occurred inside Synapse handlers
// partially read stream could lead to corrupted attachment map and hence this exception
// corrupted attachment map leads to inconsistent runtime exceptions and behavior
// discard the attachment map for the fault handler invocation
// ensure the successful completion for fault handler flow
// even we drop attachment map for both cases messages which have attachment /
// messages which do not have attachments it would still not be any impact.
// However setting attachment map to null for messages which do not have attachments is not required.
// introduced due to the fact conflicts between Axiom exceptions for attachment/ non attachments cases
// and performance impact that could cause of regular expression matching of exceptional stack traces.
Axis2MessageContext axis2smc = (Axis2MessageContext) synapseInMessageContext;
org.apache.axis2.context.MessageContext axis2MessageCtx = axis2smc.getAxis2MessageContext();
// Set correct status code
axis2MessageCtx.setProperty(PassThroughConstants.HTTP_SC, HttpStatus.SC_INTERNAL_SERVER_ERROR);
axis2MessageCtx.setAttachmentMap(null);
Stack stack = synapseInMessageContext.getFaultStack();
if (stack != null && !stack.isEmpty()) {
((FaultHandler) stack.pop()).handleFault(synapseInMessageContext, syne);
} else {
log.error("Synapse encountered an exception, " + "No error handlers found - [Message Dropped]\n" + syne.getMessage());
}
}
}
}
use of org.apache.synapse.endpoints.OAuthConfiguredHTTPEndpoint in project wso2-synapse by wso2.
the class BlockingMsgSender method send.
/**
* Blocking Invocation
*
* @param endpointDefinition the endpoint being sent to.
* @param synapseInMsgCtx the outgoing synapse message.
* @throws AxisFault on errors.
*/
public void send(EndpointDefinition endpointDefinition, MessageContext synapseInMsgCtx) throws AxisFault {
if (log.isDebugEnabled()) {
log.debug("Start Sending the Message ");
}
org.apache.axis2.context.MessageContext axisInMsgCtx = ((Axis2MessageContext) synapseInMsgCtx).getAxis2MessageContext();
org.apache.axis2.context.MessageContext axisOutMsgCtx = new org.apache.axis2.context.MessageContext();
String endpointReferenceValue = null;
if (endpointDefinition.getAddress() != null) {
endpointReferenceValue = endpointDefinition.getAddress();
} else if (axisInMsgCtx.getTo() != null) {
endpointReferenceValue = axisInMsgCtx.getTo().getAddress();
} else {
handleException("Service url, Endpoint or 'To' header is required");
}
EndpointReference epr = new EndpointReference(endpointReferenceValue);
axisOutMsgCtx.setTo(epr);
AxisService anonymousService;
if (endpointReferenceValue != null && endpointReferenceValue.startsWith(Constants.TRANSPORT_LOCAL)) {
configurationContext = axisInMsgCtx.getConfigurationContext();
anonymousService = AnonymousServiceFactory.getAnonymousService(configurationContext.getAxisConfiguration(), LOCAL_ANON_SERVICE);
} else {
anonymousService = AnonymousServiceFactory.getAnonymousService(null, configurationContext.getAxisConfiguration(), endpointDefinition.isAddressingOn() | endpointDefinition.isReliableMessagingOn(), endpointDefinition.isReliableMessagingOn(), endpointDefinition.isSecurityOn(), false);
}
axisOutMsgCtx.setConfigurationContext(configurationContext);
axisOutMsgCtx.setEnvelope(axisInMsgCtx.getEnvelope());
axisOutMsgCtx.setProperty(HTTPConstants.NON_ERROR_HTTP_STATUS_CODES, axisInMsgCtx.getProperty(HTTPConstants.NON_ERROR_HTTP_STATUS_CODES));
axisOutMsgCtx.setProperty(HTTPConstants.ERROR_HTTP_STATUS_CODES, axisInMsgCtx.getProperty(HTTPConstants.ERROR_HTTP_STATUS_CODES));
axisOutMsgCtx.setProperty(SynapseConstants.DISABLE_CHUNKING, axisInMsgCtx.getProperty(SynapseConstants.DISABLE_CHUNKING));
axisOutMsgCtx.setProperty(SynapseConstants.NO_KEEPALIVE, axisInMsgCtx.getProperty(SynapseConstants.NO_KEEPALIVE));
axisOutMsgCtx.setProperty(SynapseConstants.NO_DEFAULT_CONTENT_TYPE, axisInMsgCtx.getProperty(SynapseConstants.NO_DEFAULT_CONTENT_TYPE));
// Fill MessageContext
BlockingMsgSenderUtils.fillMessageContext(endpointDefinition, axisOutMsgCtx, synapseInMsgCtx);
if (JsonUtil.hasAJsonPayload(axisInMsgCtx)) {
JsonUtil.cloneJsonPayload(axisInMsgCtx, axisOutMsgCtx);
}
Options clientOptions;
if (initClientOptions) {
clientOptions = new Options();
} else {
clientOptions = axisInMsgCtx.getOptions();
clientOptions.setTo(epr);
}
// Fill Client options
BlockingMsgSenderUtils.fillClientOptions(endpointDefinition, clientOptions, synapseInMsgCtx);
// Update To url if mock-service exists for unit test
MediatorPropertyUtils.updateSendToUrlForMockServices(endpointDefinition, synapseInMsgCtx, axisOutMsgCtx);
anonymousService.getParent().addParameter(SynapseConstants.HIDDEN_SERVICE_PARAM, "true");
ServiceGroupContext serviceGroupContext = new ServiceGroupContext(configurationContext, (AxisServiceGroup) anonymousService.getParent());
ServiceContext serviceCtx = serviceGroupContext.getServiceContext(anonymousService);
axisOutMsgCtx.setServiceContext(serviceCtx);
// Invoke
boolean isOutOnly = isOutOnly(synapseInMsgCtx, axisOutMsgCtx);
try {
if (isOutOnly) {
sendRobust(axisOutMsgCtx, clientOptions, anonymousService, serviceCtx, synapseInMsgCtx);
final String httpStatusCode = String.valueOf(axisOutMsgCtx.getProperty(SynapseConstants.HTTP_SENDER_STATUSCODE)).trim();
/*
* Though this is OUT_ONLY operation, we need to set the
* response Status code so that others can make use of it.
*/
axisInMsgCtx.setProperty(SynapseConstants.HTTP_SC, httpStatusCode);
synapseInMsgCtx.setProperty(SynapseConstants.BLOCKING_SENDER_ERROR, "false");
} else {
org.apache.axis2.context.MessageContext result = sendReceive(axisOutMsgCtx, clientOptions, anonymousService, serviceCtx, synapseInMsgCtx);
synapseInMsgCtx.setEnvelope(result.getEnvelope());
if (JsonUtil.hasAJsonPayload(result)) {
JsonUtil.cloneJsonPayload(result, ((Axis2MessageContext) synapseInMsgCtx).getAxis2MessageContext());
}
final String statusCode = String.valueOf(result.getProperty(SynapseConstants.HTTP_SENDER_STATUSCODE)).trim();
/*
* We need to set the response status code so that users can
* fetch it later.
*/
axisInMsgCtx.setProperty(SynapseConstants.HTTP_SC, statusCode);
if ("false".equals(synapseInMsgCtx.getProperty(SynapseConstants.BLOCKING_SENDER_PRESERVE_REQ_HEADERS))) {
axisInMsgCtx.setProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, result.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS));
}
synapseInMsgCtx.setProperty(SynapseConstants.BLOCKING_SENDER_ERROR, "false");
this.invokeHandlers(synapseInMsgCtx);
}
} catch (Exception ex) {
/*
* Extract the HTTP status code from the Exception message.
*/
final String errorStatusCode = extractStatusCodeFromException(ex);
axisInMsgCtx.setProperty(SynapseConstants.HTTP_SC, errorStatusCode);
synapseInMsgCtx.setProperty(SynapseConstants.BLOCKING_SENDER_ERROR, "true");
synapseInMsgCtx.setProperty(SynapseConstants.ERROR_EXCEPTION, ex);
if (ex instanceof AxisFault) {
AxisFault fault = (AxisFault) ex;
int errorCode = SynapseConstants.BLOCKING_SENDER_OPERATION_FAILED;
if (fault.getFaultCode() != null && fault.getFaultCode().getLocalPart() != null && !"".equals(fault.getFaultCode().getLocalPart())) {
try {
errorCode = Integer.parseInt(fault.getFaultCode().getLocalPart());
} catch (NumberFormatException e) {
errorCode = SynapseConstants.BLOCKING_SENDER_OPERATION_FAILED;
}
}
synapseInMsgCtx.setProperty(SynapseConstants.ERROR_CODE, errorCode);
synapseInMsgCtx.setProperty(SynapseConstants.ERROR_MESSAGE, fault.getMessage());
synapseInMsgCtx.setProperty(SynapseConstants.ERROR_DETAIL, fault.getDetail() != null ? fault.getDetail().getText() : "");
if (!isOutOnly) {
org.apache.axis2.context.MessageContext faultMC = fault.getFaultMessageContext();
if (faultMC != null) {
Object statusCode = faultMC.getProperty(SynapseConstants.HTTP_SENDER_STATUSCODE);
synapseInMsgCtx.setProperty(SynapseConstants.HTTP_SC, statusCode);
axisInMsgCtx.setProperty(SynapseConstants.HTTP_SC, statusCode);
synapseInMsgCtx.setEnvelope(faultMC.getEnvelope());
}
}
}
}
// get the original message context that went through the OAuth Configured HTTP endpoint
// this is used to retry the call when there is any oauth related issue
org.apache.synapse.MessageContext originalMC = MessageCache.getInstance().removeMessageContext(synapseInMsgCtx.getMessageID());
// Check fault occure when send the request to endpoint
if ("true".equals(synapseInMsgCtx.getProperty(SynapseConstants.BLOCKING_SENDER_ERROR))) {
// Handle the fault
synapseInMsgCtx.getFaultStack().pop().handleFault(synapseInMsgCtx, (Exception) synapseInMsgCtx.getProperty(SynapseConstants.ERROR_EXCEPTION));
} else {
// If a message was successfully processed to give it a chance to clear up or reset its state to active
Stack<FaultHandler> faultStack = synapseInMsgCtx.getFaultStack();
if (faultStack != null && !faultStack.isEmpty()) {
AbstractEndpoint successfulEndpoint = null;
if (faultStack.peek() instanceof AbstractEndpoint) {
successfulEndpoint = (AbstractEndpoint) faultStack.pop();
successfulEndpoint.onSuccess();
}
if (successfulEndpoint instanceof OAuthConfiguredHTTPEndpoint) {
OAuthConfiguredHTTPEndpoint httpEndpoint = (OAuthConfiguredHTTPEndpoint) successfulEndpoint;
if (originalMC != null && OAuthUtils.retryOnOAuthFailure(httpEndpoint, synapseInMsgCtx, synapseInMsgCtx)) {
MessageContext messageContext = httpEndpoint.retryCallWithNewToken(originalMC);
((Axis2MessageContext) synapseInMsgCtx).setAxis2MessageContext(((Axis2MessageContext) messageContext).getAxis2MessageContext());
}
}
// Remove all endpoint related fault handlers if any
while (!faultStack.empty() && faultStack.peek() instanceof AbstractEndpoint) {
faultStack.pop();
}
}
}
}
use of org.apache.synapse.endpoints.OAuthConfiguredHTTPEndpoint in project wso2-synapse by wso2.
the class HTTPEndpointFactory method createEndpoint.
@Override
protected Endpoint createEndpoint(OMElement epConfig, boolean anonymousEndpoint, Properties properties) {
OMAttribute nameAttr = epConfig.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
String name = null;
if (nameAttr != null) {
name = nameAttr.getAttributeValue();
}
OMElement httpElement = epConfig.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "http"));
HTTPEndpoint httpEndpoint;
OAuthHandler oAuthhandler = createOAuthHandler(httpElement, name);
if (oAuthhandler != null) {
httpEndpoint = new OAuthConfiguredHTTPEndpoint(oAuthhandler);
} else {
httpEndpoint = new HTTPEndpoint();
}
if (name != null) {
httpEndpoint.setName(name);
}
if (httpElement != null) {
EndpointDefinition definition = createEndpointDefinition(httpElement);
OMAttribute uriTemplateAttr = httpElement.getAttribute(new QName("uri-template"));
if (uriTemplateAttr != null) {
String uriValue = uriTemplateAttr.getAttributeValue();
uriValue = ResolverFactory.getInstance().getResolver(uriValue).resolve();
// get object and and resolve
if (uriValue.startsWith(HTTPEndpoint.legacyPrefix)) {
httpEndpoint.setUriTemplate(UriTemplate.fromTemplate(uriValue.substring(HTTPEndpoint.legacyPrefix.length())));
// Set the address to the initial template value.
definition.setAddress(uriValue.substring(HTTPEndpoint.legacyPrefix.length()));
httpEndpoint.setLegacySupport(true);
} else {
httpEndpoint.setUriTemplate(UriTemplate.fromTemplate(uriValue));
// Set the address to the initial template value.
definition.setAddress(uriValue);
httpEndpoint.setLegacySupport(false);
}
}
httpEndpoint.setDefinition(definition);
processAuditStatus(definition, httpEndpoint.getName(), httpElement);
OMAttribute methodAttr = httpElement.getAttribute(new QName("method"));
if (methodAttr != null) {
setHttpMethod(httpEndpoint, methodAttr.getAttributeValue());
} else {
// Method is not a mandatory parameter for HttpEndpoint. So methodAttr Can be null
if (log.isDebugEnabled()) {
log.debug("Method is not specified for HttpEndpoint. " + "Hence using the http method from incoming message");
}
}
}
processProperties(httpEndpoint, epConfig);
CommentListUtil.populateComments(epConfig, httpEndpoint.getCommentsList());
return httpEndpoint;
}
use of org.apache.synapse.endpoints.OAuthConfiguredHTTPEndpoint in project wso2-synapse by wso2.
the class HTTPEndpointSerializer method serializeEndpoint.
@Override
protected OMElement serializeEndpoint(Endpoint endpoint) {
if (!(endpoint instanceof HTTPEndpoint)) {
handleException("Invalid endpoint type.");
}
fac = OMAbstractFactory.getOMFactory();
OMElement endpointElement = fac.createOMElement("endpoint", SynapseConstants.SYNAPSE_OMNAMESPACE);
HTTPEndpoint httpEndpoint = (HTTPEndpoint) endpoint;
EndpointDefinition epDefinitionHttp = httpEndpoint.getDefinition();
OMElement httpEPElement = serializeEndpointDefinition(epDefinitionHttp);
if (httpEndpoint.getHttpMethod() != null) {
httpEPElement.addAttribute(fac.createOMAttribute("method", null, httpEndpoint.getHttpMethod()));
}
if (httpEndpoint.getUriTemplate() != null) {
if (httpEndpoint.isLegacySupport()) {
httpEPElement.addAttribute(fac.createOMAttribute("uri-template", null, HTTPEndpoint.legacyPrefix + httpEndpoint.getUriTemplate().getTemplate()));
} else {
httpEPElement.addAttribute(fac.createOMAttribute("uri-template", null, httpEndpoint.getUriTemplate().getTemplate()));
}
}
endpointElement.addChild(httpEPElement);
if (endpoint instanceof OAuthConfiguredHTTPEndpoint) {
httpEPElement.addChild(serializeOAuthConfiguration((OAuthConfiguredHTTPEndpoint) endpoint));
}
// serialize the properties
serializeProperties(httpEndpoint, endpointElement);
serializeCommonAttributes(endpoint, endpointElement);
return endpointElement;
}
Aggregations