Hi Eric, After a long debug session, I was able to reproduce this issue. This happens when WS-Addressing is not engaged at the client side. In which case the Reply-To header is null and get-property function returns a blank string "" as the Reply-To value which will be set as the To URL and is not a proper URL :-(
You can get rid of this by hard coding the To header to be " http://www.w3.org/2005/08/addressing/anonymous", but this also has a drawback if WSAddressing is used and the user specifies a different Reply-To address or when using dual channel mode. There fore I had to come up with a configuration that will cater all these scenarios :-) and fortunately I was successful in finding this. So the resulting configuration would be as follows; please try this approach and get back to me if there are issues with this configuration. (Please note that I have added a dummy proxy service to the configuration for testing purposes) <definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="Test"> <target> <inSequence> <drop/> </inSequence> </target> </proxy> <sequence name="main"> <makefault> <code value="tns:Receiver" xmlns:tns=" http://www.w3.org/2003/05/soap-envelope"/> <reason value="Test value"/> </makefault> <property name="RESPONSE" value="true"/> <switch source="get-property('ReplyTo')"> <case regex=""> <header name="To" value=" http://www.w3.org/2005/08/addressing/anonymous"/> </case> <default> <header name="To" expression="get-property('ReplyTo')"/> </default> </switch> <send/> </sequence> </definitions> Thanks, Ruwan On Fri, May 23, 2008 at 10:45 PM, Hubert, Eric <[EMAIL PROTECTED]> wrote: > Hi Ruwan, > > the rest of the synapse.xml should not matter. My SOAP-request (will test > with hessian later) is send to an address, which cannot be mapped to any > proxyservice. I just added a few characters to a correct URL to force this. > > If i add a log mediator with full output just before the send mediator it > only add the following info: > 2008-05-23 19:05:58,084 [10.137.148.73-carl] [HttpServerWorker-14] INFO > LogMediator To: ,WSAction: ,SOAPAction: ,MessageID: > urn:uuid:867131EB957C2C35661211562358715,Direction: response,Envelope: <?xml > version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv=" > http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode<http://schemas.xmlsoap.org/soap/envelope/%22%3E%3Csoapenv:Body%3E%3Csoapenv:Fault%3E%3Cfaultcode>xmlns:sf11=" > http://schemas.xmlsoap.org/soap/envelope/">sf11:Client</faultcode><faultstring>No<http://schemas.xmlsoap.org/soap/envelope/%22%3Esf11:Client%3C/faultcode%3E%3Cfaultstring%3ENo>service > found for specified > URL.</faultstring></soapenv:Fault></soapenv:Body></soapenv:Envelope> > 2008-05-23 19:05:58,084 [10.137.148.73-carl] [HttpServerWorker-14] ERROR > HttpCoreNIOSender Malformed destination EPR : > java.net.MalformedURLException: no protocol: > [...] > > So I don't get something about the request, but rather the response with an > empty and thus not valid To-address. > > Regards, > Eric > > I'll try the sample 5 on the weekend. But this is something different from > my point of view. If there is some fault I delegate to an faulthandler and > then do the same. But here I have no fault, just a request which does not > map to any proxyservice. Or am I wrong on this? > > > > > ------------------------------ > Hi Eric, > > I think the ReplyTo header contains some URL which is not valid. The > HttpCoreNIOSender.sendAsyncRequest() method has been invoked which is > wrong and it should be the sendAsyncResponse which has to be invoked. > > Could you please add a full log mediator just before the send mediator in > the following configuration and attach the synapse log? so that I can > investigate what actually went wrong. > > At the same time could you please try the sample 5 and see what happens? > > Thanks, > Ruwan > > On Fri, May 23, 2008 at 8:30 PM, Hubert, Eric <[EMAIL PROTECTED]> > wrote: > >> Hi Ruwan, >> >> I now tried this approach with the following synapse-config-block: >> >> <syn:sequence name="main"> >> <syn:makefault version="soap11"> >> <syn:code xmlns:sf11=" >> http://schemas.xmlsoap.org/soap/envelope/" value="sf11:Client"/> >> <syn:reason value="No service found for specified URL."/> >> </syn:makefault> >> <syn:property name="RESPONSE" value="true"/> >> <syn:header name="To" expression="get-property('ReplyTo')"/> >> <syn:send/> >> </syn:sequence> >> Is there anything wrong with this? It is more or less copied from the >> example. I get the following exception: >> >> 2008-05-23 16:38:15,834 [10.137.148.73-carl] [HttpServerWorker-10] ERROR >> HttpCoreNIOSender Malformed destination EPR : >> java.net.MalformedURLException: no protocol: >> at java.net.URL.<init>(URL.java:567) >> at java.net.URL.<init>(URL.java:464) >> at java.net.URL.<init>(URL.java:413) >> at >> org.apache.synapse.transport.nhttp.HttpCoreNIOSender.sendAsyncRequest(HttpCoreNIOSender.java:317) >> at >> org.apache.synapse.transport.nhttp.HttpCoreNIOSender.invoke(HttpCoreNIOSender.java:256) >> at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:448) >> at >> org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:138) >> at >> org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:219) >> at >> org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:154) >> >> at >> org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:58) >> at >> org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:125) >> at >> org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:176) >> at >> org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:89) >> at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176) >> at >> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) >> at >> org.apache.synapse.transport.nhttp.ServerWorker.processPost(ServerWorker.java:238) >> at >> org.apache.synapse.transport.nhttp.ServerWorker.run(ServerWorker.java:194) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) >> at java.lang.Thread.run(Thread.java:595) >> Regards, >> Eric >> >> ------------------------------ >> *From:* Ruwan Linton [mailto:[EMAIL PROTECTED] >> *Sent:* Friday, May 23, 2008 12:36 PM >> >> *To:* [email protected] >> *Subject:* Re: How to send back a fault from an in-sequence >> >> Eric, >> >> I still don't understand why do you need a script to do this. Is there any >> other requirements except for sending a hessian fault back? >> >> If not I would strongly suggest you to go with the existing mediators and >> if there are any issues lets find them out and fix them. >> >> Thanks, >> Ruwan >> >> On Fri, May 23, 2008 at 3:40 PM, Hubert, Eric <[EMAIL PROTECTED]> >> wrote: >> >>> Hi Ruwan, >>> >>> >>> >>> Thanks for your cross test! No, we didn't change any of the libraries. If >>> I find the time, I'll try the sample on my own and contact the developer to >>> find out more about his testing environment. I guess he was testing locally. >>> So maybe he uses another Java-Version or something like that. If the problem >>> does not happen in the integration environment we may try to narrow it down. >>> >>> >>> >>> Regards, >>> >>> Eric >>> >>> >>> ------------------------------ >>> >>> *From:* Ruwan Linton [mailto:[EMAIL PROTECTED] >>> *Sent:* Friday, May 23, 2008 11:15 AM >>> *To:* [email protected] >>> *Subject:* Re: How to send back a fault from an in-sequence >>> >>> >>> >>> Hi Eric, >>> >>> I just tried the sample 352 and was working fine for me. May be this is a >>> scripting problem. >>> >>> Are you using some other scripting jar than what we ship with >>> Synapse/ESB? >>> >>> Thanks, >>> Ruwan >>> >>> On Fri, May 23, 2008 at 1:43 PM, Hubert, Eric <[EMAIL PROTECTED]> >>> wrote: >>> >>> Hi Ruwan, >>> >>> >>> >>> It seems to me as we have been on the right track on this. We will check >>> to use this way, which looks more or less like we tried to achieve using the >>> scripting approach. We followed synapse example 352, but there we always >>> received an exception. I'll go and grep it. Yes, here it is: >>> >>> >>> >>> 2008-05-23 10:41:04,358 [127.0.0.1-berjbolle-lx1] [I/O dispatcher 5] >>> INFO PipeImpl Using native OS Pipes for event-driven to stream IO bridging >>> >>> 2008-05-23 10:41:04,451 [127.0.0.1-berjbolle-lx1] [HttpServerWorker-1] >>> ERROR ScriptMediator The script engine returned an error executing the >>> inlined js script function mediate >>> >>> com.sun.phobos.script.util.ExtendedScriptException: >>> org.mozilla.javascript.EvaluatorException: The choice of Java constructor >>> setTo matching JavaScript argument types (null) is ambiguous; candidate >>> constructors are: >>> >>> void setTo(java.lang.String) >>> >>> void setTo(org.apache.axis2.addressing.EndpointReference) (<Unknown >>> Source>#2)in: <Unknown Source>at line no: 2 >>> >>> at >>> com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68) >>> >>> at javax.script.CompiledScript.eval(CompiledScript.java:64) >>> >>> at >>> org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:248) >>> >>> at >>> org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:195) >>> >>> at >>> org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:168) >>> >>> at >>> org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:58) >>> >>> at >>> org.apache.synapse.mediators.filters.InMediator.mediate(InMediator.java:60) >>> >>> at >>> org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:58) >>> >>> at >>> org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:125) >>> >>> at >>> org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:176) >>> >>> at >>> org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:89) >>> >>> at >>> org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176) >>> >>> at >>> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) >>> >>> at >>> org.apache.synapse.transport.nhttp.ServerWorker.processPost(ServerWorker.java:238) >>> >>> at >>> org.apache.synapse.transport.nhttp.ServerWorker.run(ServerWorker.java:194) >>> >>> at >>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) >>> >>> at >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) >>> >>> at java.lang.Thread.run(Thread.java:595) >>> >>> Caused by: org.mozilla.javascript.EvaluatorException: The choice of Java >>> constructor setTo matching JavaScript argument types (null) is ambiguous; >>> candidate constructors are: >>> >>> void setTo(java.lang.String) >>> >>> void setTo(org.apache.axis2.addressing.EndpointReference) (<Unknown >>> Source>#2) >>> >>> at >>> org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:98) >>> >>> at >>> org.mozilla.javascript.Context.reportRuntimeError(Context.java:966) >>> >>> at >>> org.mozilla.javascript.Context.reportRuntimeError(Context.java:1022) >>> >>> at >>> org.mozilla.javascript.Context.reportRuntimeError3(Context.java:1000) >>> >>> at >>> org.mozilla.javascript.NativeJavaMethod.findFunction(NativeJavaMethod.java:385) >>> >>> at >>> org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:156) >>> >>> at >>> org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:66) >>> >>> at org.mozilla.javascript.gen.c3._c0(<Unknown Source>:2) >>> >>> at org.mozilla.javascript.gen.c3.call(<Unknown Source>) >>> >>> at >>> org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:340) >>> >>> at >>> org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2758) >>> >>> at org.mozilla.javascript.gen.c3.call(<Unknown Source>) >>> >>> at org.mozilla.javascript.gen.c3.exec(<Unknown Source>) >>> >>> at >>> com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55) >>> >>> ... 17 more >>> >>> >>> >>> So while looking at this stack it seems as if the replyTo would be null. >>> Maybe this is only some scripting problem. Could someone please check the >>> example. If it is also not working for someone else, we should file a JIRA. >>> Or can this not work from within the main-sequence for some reason? >>> Basically it is the same as your decribed mediator sequence but with >>> scripting, or am I wrong? >>> >>> >>> >>> >>> >>> Regards, >>> >>> Eric >>> >>> >>> ------------------------------ >>> >>> Small modification; >>> >>> On Thu, May 22, 2008 at 9:21 PM, Ruwan Linton <[EMAIL PROTECTED]> >>> wrote: >>> >>> Hi Eric, >>> >>> Please see my comments in line; >>> >>> On Thu, May 22, 2008 at 8:53 PM, Hubert, Eric <[EMAIL PROTECTED]> >>> wrote: >>> >>> Hi, >>> >>> how can we send back a fault from an in-sequence? Regarding the Hessian >>> support, is there a way to generate a Hessian fault? >>> >>> >>> If the incoming message is a hessian message and if you >>> >>> - create a SOAP fault, >>> - set the RESPONSE=true property and >>> - copy the ReplyTo as To >>> >>> I forgot to mention that you will obviously need to send as well to >>> send back the generated response, >>> >>> So the set of mediators required are [makefault, property, header, send] >>> >>> Thanks, >>> Ruwan >>> >>> >>> - >>> >>> as described in the Sample >>> 5<http://synapse.apache.org/Synapse_Samples.html#Sample5>then you will be >>> able to send back a hessian fault. >>> >>> >>> >>> Background: >>> 1) In a switch mediator within the in-sequence we want to send back a >>> fault for the default case and log this. >>> >>> >>> Can be easily done as described above. >>> >>> >>> >>> >>> 2) If the requested URL does not match with any proxy service >>> definitions, Synapse sends back a 202 response to the client. If we got >>> it right synapse always uses the main-sequence if no other sequence >>> matches. So also for this case we would like to send back a fault from >>> within the in-sequence of the main-sequence. >>> >>> >>> A minor correction to this at first, if the message is not dispatched to >>> any of the proxy services on Synapse then the message will be directed to >>> the main sequence of synapse. (synapse dose not match over any other >>> sequences but just the proxy services for incoming messages) >>> >>> If you just have proxy services (service mediation only) and no message >>> mediation (messages coming into main sequence), then you can assume a >>> message reaching the main sequence as a fault message and send back a fault, >>> using the same strategy as described above inside the main sequence. >>> >>> >>> >>> >>> -- >>> Ruwan Linton >>> http://www.wso2.org - "Oxygenating the Web Services Platform" >>> >> >> >> >> -- >> Ruwan Linton >> http://www.wso2.org - "Oxygenating the Web Services Platform" >> >> > > > -- > Ruwan Linton > http://www.wso2.org - "Oxygenating the Web Services Platform" > > -- Ruwan Linton http://www.wso2.org - "Oxygenating the Web Services Platform"
