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

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

Expand Messages
  • Simon Lok
    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.
    • Show all 6 messages in this topic