Hi @Morris Brodersen, @Ivan Novakov You can get pretty far, within the context of an API, by creating a on both the proxy and the target endpoints. For example:
<ProxyEndpoint name="default">
<Description/>
<DefaultFaultRule name="DefaultFaultRule">
<Step>
<FaultRules/>
<Name>Fault-default-proxy</Name>
</Step>
<AlwaysEnforce>false</AlwaysEnforce>
</DefaultFaultRule>
...
The proxy Assign Message Policy:
<AssignMessage enabled="true" continueOnError="false" async="false" name="Fault-default-proxy">
<DisplayName>Fault default proxy</DisplayName>
<FaultRules/>
<Properties/>
<Set>
<Payload contentType="application/json" variablePrefix="%" variableSuffix="#">
{
"proxyFault":
{
"faultName":"%fault.name#",
"faultType":"%fault.type#",
"faultCategory":"%fault.category#",
"errorCode":"%error.code#",
"errorMessage":"%error.message#"
}
}</Payload>
<StatusCode>{message.status.code}</StatusCode>
<ReasonPhrase>{message.reason.phrase}</ReasonPhrase>
</Set>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>
For the target endpoint:
<TargetEndpoint name="default">
<DefaultFaultRule name="DefaultFaultRule">
<Step>
<FaultRules/>
<Name>Fault-default-target</Name>
</Step>
<AlwaysEnforce>false</AlwaysEnforce>
</DefaultFaultRule>
...
The target Assign Message policy:
<AssignMessage enabled="true" continueOnError="false" async="false" name="Fault-default-target">
<DisplayName>Fault default target</DisplayName>
<FaultRules/>
<Properties/>
<Set>
<Headers/>
<Payload contentType="application/json" variablePrefix="%" variableSuffix="#">
{ "targetFault":
{
"faultName":"%fault.name#",
"faultType":"%fault.type#",
"faultCategory":"%fault.category#",
"errorCode":"%error.code#",
"errorMessage":"%error.message#",
"responseMessageFromBackend":%response.content#
}
}</Payload>
<StatusCode>{message.status.code}</StatusCode>
<ReasonPhrase>{message.reason.phrase}</ReasonPhrase>
</Set>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>
Then any fault that is created would be handled by the corresponding Assign Message and “unified”.
The target side handles the 400 and 500 coming from an HTTPTargetConnection which generates a fault, and “unifies” them.
However, I noticed that 400 and 500 responses coming from a ScriptTarget (Node.js based proxy) do not generate a fault, so you would have to create a rule to raise a fault in those proxies in the target response PostFlow.
Hope this helps