Loading ...
Sorry, an error occurred while loading the content.

Re: ampersand and friends - more evidence of a problem...

Expand Messages
  • Simon Lok
    I hate suggesting that there is a bug in SOAP::Lite but I can t really think of anything else... here is a trivial JAVA web service that will demonstrate the
    Message 1 of 6 , Oct 3, 2003
    • 0 Attachment
      I hate suggesting that there is a bug
      in SOAP::Lite but I can't really think of
      anything else... here is a trivial JAVA
      web service that will demonstrate
      the problem:

      package helloservice;

      public class HelloImpl implements HelloIF {

      public String message = "Hello ";

      public String sayHello(String s) {
      return message + s;
      }

      }

      As you can see, all it does is take what it
      gets and returns what it got prepending
      the hardcoded string "Hello ".

      Here is a SOAP::Lite PERL program that
      calls that JAVA web service...

      #!/usr/bin/perl

      use SOAP::Lite;

      my $JavaHello = SOAP::Lite->service("http://localhost:8080/hello/hello?WSDL");

      print "a and b: ";
      print 'result: '.$JavaHello->sayHello("a and b");
      print "\n";

      print "a & b: ";
      print 'result: '.$JavaHello->sayHello("a & b");
      print "\n";

      print "a&b: ";
      print 'result: '.$JavaHello->sayHello("a&b");
      print "\n";

      print "a &a b: ";
      print 'result: '.$JavaHello->sayHello("a &a b");
      print "\n";

      print "a &am b: ";
      print 'result: '.$JavaHello->sayHello("a &am b");
      print "\n";

      print "a & b: ";
      print 'result: '.$JavaHello->sayHello("a & b");
      print "\n";

      print "a & b: ";
      print 'result: '.$JavaHello->sayHello("a & b");
      print "\n";


      Here is the output when I run the above program:

      a and b: result: Hello a and b
      a & b: result:
      a&b: result:
      a &a b: result:
      a &am b: result:
      a & b: result:
      a & b: result: Hello a & b


      As you can see the first and the last
      cases work. The really weird part is
      that the last one actually sends &
      to the back end! At least that's what
      it appears to be doing because when the
      string gets returned to the front end, it
      comes back such. I would have thought that
      if SOAP::Lite were to work correctly, that
      the final one would simply return a string
      like 'Hello a & b'... not what you see above.
      This makes absolutely no sense. In the
      case of the five failures, there is a huge
      stack trace dumped on the back end s
      tarting with...

      SEVERE: deserialization error: XML parsing error:
      com.sun.xml.rpc.sp.ParseException:1: Next character must be ";"
      terminating reference to entity "amp"
      deserialization error: XML parsing error: com.sun.xml.rpc.sp.ParseException:1: Next
      character must be ";" termina
      ting reference to entity "amp"
      at
      com.sun.xml.rpc.encoding.SimpleTypeSerializer.deserialize(SimpleTypeSerializer.java:
      140)
      at
      com.sun.xml.rpc.encoding.AttachmentSerializer.deserialize(AttachmentSerializer.java:
      158)
      at
      com.sun.xml.rpc.encoding.ReferenceableSerializerImpl.deserialize(ReferenceableSeria
      lizerImpl.java:141)
      at
      helloservice.HelloIF_sayHello_RequestStruct__MyHello__SOAPSerializer.doDeserialize(
      HelloIF_sayHello_Re
      questStruct__MyHello__SOAPSerializer.java:41)


      CAUSE:

      XML parsing error: com.sun.xml.rpc.sp.ParseException:1: Illegal character or entity
      reference syntax
      at com.sun.xml.rpc.streaming.XMLReaderImpl.next(XMLReaderImpl.java:115)
      at
      com.sun.xml.rpc.encoding.SimpleTypeSerializer.deserialize(SimpleTypeSerializer.java:
      108)
      at
      com.sun.xml.rpc.encoding.AttachmentSerializer.deserialize(AttachmentSerializer.java:
      158)
      at
      com.sun.xml.rpc.encoding.ReferenceableSerializerImpl.deserialize(ReferenceableSeria
      lizerImpl.java:141)


      The contents of the WSDL are pretty straightforward:

      <?xml version="1.0" encoding="UTF-8"?>
      <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:Foo"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://
      schemas.xmlsoap.org/wsdl/soap/" name="MyHelloService"
      targetNamespace="urn:Foo">
      <types/>
      <message name="HelloIF_sayGoodBye">
      <part name="String_1" type="xsd:string"/></message>
      <message name="HelloIF_sayGoodByeResponse">
      <part name="result" type="xsd:string"/></message>
      <message name="HelloIF_sayHello">
      <part name="String_1" type="xsd:string"/></message>
      <message name="HelloIF_sayHelloResponse">
      <part name="result" type="xsd:string"/></message>
      <portType name="HelloIF">
      <operation name="sayGoodBye" parameterOrder="String_1">
      <input message="tns:HelloIF_sayGoodBye"/>
      <output message="tns:HelloIF_sayGoodByeResponse"/></operation>
      <operation name="sayHello" parameterOrder="String_1">
      <input message="tns:HelloIF_sayHello"/>
      <output message="tns:HelloIF_sayHelloResponse"/></operation></portType>
      <binding name="HelloIFBinding" type="tns:HelloIF">
      <operation name="sayGoodBye">
      <input>
      <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      use="encoded" namespace="urn:Foo"/></input>
      <output>
      <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      use="encoded" namespace="urn:Foo"/></output>
      <soap:operation soapAction=""/></operation>
      <operation name="sayHello">
      <input>
      <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      use="encoded" namespace="urn:Foo"/></input>
      <output>
      <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      use="encoded" namespace="urn:Foo"/></output>
      <soap:operation soapAction=""/></operation>
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/
      ></binding>
      <service name="MyHelloService">
      <port name="HelloIFPort" binding="tns:HelloIFBinding">
      <soap:address xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" location="http:/
      /localhost:8080/hello/hello"/></port></service></definitions>


      Thanks in advance for any ideas that you
      might have.
    • Simon Lok
      It appears that ampersand characters are not automatically encoded properly when using WSDLs... thanks to a tip about turning on tracing, I am able to include
      Message 2 of 6 , Oct 21, 2003
      • 0 Attachment
        It appears that ampersand characters are not
        automatically encoded properly when using
        WSDLs... thanks to a tip about turning on
        tracing, I am able to include the following dump
        SOAP message snippets...

        <SOAP-ENV:Body><namesp2:AddCompetitorType
        xmlns:namesp2="urn:ABC"><String_1
        xsi:type="xsd:string">176262029300358498510238664919063104555</
        String_1><String_2 xsi:type="xsd:string">a \& b</String_2></
        namesp2:AddCompetitorType></SOAP-ENV:Body>

        <SOAP-ENV:Body><namesp3:AddCompetitorType
        xmlns:namesp3="urn:ABC"><String_1
        xsi:type="xsd:string">176262029300358498510238664919063104555</
        String_1><String_2 xsi:type="xsd:string">a & b</String_2></
        namesp3:AddCompetitorType></SOAP-ENV:Body>

        Does anybody know how to turn on encoding
        of ampersands for WSDLs? I am also trying to run
        the same test using proxy and uri instead of
        using a WSDL but I am having some trouble
        getting that to work as well

        --SL
      Your message has been successfully submitted and would be delivered to recipients shortly.