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

XMLSchema version handling for null/nil requests

Expand Messages
  • Crispin Flowerday
    Hi, I am trying to write a SOAP::Lite server, and have run across what I believe is a bug. It seems that when deserealizing the request from the client, the
    Message 1 of 5 , May 25, 2005
    • 0 Attachment
      Hi,

      I am trying to write a SOAP::Lite server, and have run across what I
      believe is a bug. It seems that when deserealizing the request from the
      client, the XMLSchema version is not correctly worked out in the case
      where there are no arguments to the function, e.g. imagine the following
      SOAP request:

      <?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope
      xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
      xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:xsd="http://www.w3.org/1999/XMLSchema"
      soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
      <namesp1:hello xmlns:namesp1="Test" xsi:null="1" />
      </soap:Body>
      </soap:Envelope>

      Then the response received from the server uses the 2001 schema, rather
      than the 1999 schema. This causes all sorts of problems when mixing
      SOAP::Lite clients, and mono clients.

      Attached is a client and a daemon that show the problem, if you run the
      daemon, and then use the client to send over a 1999 schema request, it
      comes back using the 2001 schema.

      I have a very hacky fix, which is probably totally the wrong way to fix
      it, by inserting a block like (I know its not a real fix as you get
      warnings a line slightly further down in the file):

      # $name is not used here since type should be encoded as type, not as name
      my ($schema, $class);
      if( $type ) {
      ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;
      } else {
      my ( $null ) = grep /^$SOAP::Constants::NS_XSI_NILS$/, keys %$attrs;
      if( $null && $null =~ /^$SOAP::Constants::NS_XSI_NILS$/ ) {
      $schema = $1 || $2;
      }
      }

      in place of (in SOAP::Deserializer::decode_value)

      my ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;

      Now, is the above described behaviour a bug? And is there a better fix
      than my hack ? (I'm using 0.65_5)

      Crispin
    • Byrne Reese
      No, I would consider this a bug. Ideally, SOAP::Lite should use the same schema in the response as was sent in the request. Thanks for catching this.
      Message 2 of 5 , May 25, 2005
      • 0 Attachment
        No, I would consider this a bug. Ideally, SOAP::Lite should use the same
        schema in the response as was sent in the request. Thanks for catching this.

        Crispin Flowerday wrote:

        > Hi,
        >
        > I am trying to write a SOAP::Lite server, and have run across what I
        > believe is a bug. It seems that when deserealizing the request from the
        > client, the XMLSchema version is not correctly worked out in the case
        > where there are no arguments to the function, e.g. imagine the following
        > SOAP request:
        >
        > <?xml version="1.0" encoding="UTF-8"?>
        > <soap:Envelope
        > xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
        > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
        > xmlns:xsd="http://www.w3.org/1999/XMLSchema"
        > soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        > <soap:Body>
        > <namesp1:hello xmlns:namesp1="Test" xsi:null="1" />
        > </soap:Body>
        > </soap:Envelope>
        >
        > Then the response received from the server uses the 2001 schema, rather
        > than the 1999 schema. This causes all sorts of problems when mixing
        > SOAP::Lite clients, and mono clients.
        >
        > Attached is a client and a daemon that show the problem, if you run the
        > daemon, and then use the client to send over a 1999 schema request, it
        > comes back using the 2001 schema.
        >
        > I have a very hacky fix, which is probably totally the wrong way to fix
        > it, by inserting a block like (I know its not a real fix as you get
        > warnings a line slightly further down in the file):
        >
        > # $name is not used here since type should be encoded as type, not
        > as name
        > my ($schema, $class);
        > if( $type ) {
        > ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;
        > } else {
        > my ( $null ) = grep /^$SOAP::Constants::NS_XSI_NILS$/, keys %$attrs;
        > if( $null && $null =~ /^$SOAP::Constants::NS_XSI_NILS$/ ) {
        > $schema = $1 || $2;
        > }
        > }
        >
        > in place of (in SOAP::Deserializer::decode_value)
        >
        > my ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;
        >
        > Now, is the above described behaviour a bug? And is there a better fix
        > than my hack ? (I'm using 0.65_5)
        >
        > Crispin
        >
        >
        >
        > ------------------------------------------------------------------------
        > *Yahoo! Groups Links*
        >
        > * To visit your group on the web, go to:
        > http://groups.yahoo.com/group/soaplite/
        >
        > * To unsubscribe from this group, send an email to:
        > soaplite-unsubscribe@yahoogroups.com
        > <mailto:soaplite-unsubscribe@yahoogroups.com?subject=Unsubscribe>
        >
        > * Your use of Yahoo! Groups is subject to the Yahoo! Terms of
        > Service <http://docs.yahoo.com/info/terms/>.
        >
        >
      • Crispin Flowerday
        ... Do you want me to raise a bug in the bug system ? BTW, when it is in this situation, it uses the schema that was used in the previous response. And I
        Message 3 of 5 , May 25, 2005
        • 0 Attachment
          On Wed, 2005-05-25 at 07:37 -0700, Byrne Reese wrote:
          > No, I would consider this a bug. Ideally, SOAP::Lite should use the same
          > schema in the response as was sent in the request. Thanks for catching this.

          Do you want me to raise a bug in the bug system ?

          BTW, when it is in this situation, it uses the schema that was used in
          the previous response.

          And I noticed that neither mono nor windows (the c# stuff) send over
          xsi:null="1" (or the 2001 equivalent) in this situation, so the only way
          to work out what schema is used is to look at the namespace definitions
          in the envelope :-(

          Crispin


          > Crispin Flowerday wrote:
          >
          > > Hi,
          > >
          > > I am trying to write a SOAP::Lite server, and have run across what I
          > > believe is a bug. It seems that when deserealizing the request from the
          > > client, the XMLSchema version is not correctly worked out in the case
          > > where there are no arguments to the function, e.g. imagine the following
          > > SOAP request:
          > >
          > > <?xml version="1.0" encoding="UTF-8"?>
          > > <soap:Envelope
          > > xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
          > > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
          > > xmlns:xsd="http://www.w3.org/1999/XMLSchema"
          > > soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
          > > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
          > > <soap:Body>
          > > <namesp1:hello xmlns:namesp1="Test" xsi:null="1" />
          > > </soap:Body>
          > > </soap:Envelope>
          > >
          > > Then the response received from the server uses the 2001 schema, rather
          > > than the 1999 schema. This causes all sorts of problems when mixing
          > > SOAP::Lite clients, and mono clients.
          > >
          > > Attached is a client and a daemon that show the problem, if you run the
          > > daemon, and then use the client to send over a 1999 schema request, it
          > > comes back using the 2001 schema.
          > >
          > > I have a very hacky fix, which is probably totally the wrong way to fix
          > > it, by inserting a block like (I know its not a real fix as you get
          > > warnings a line slightly further down in the file):
          > >
          > > # $name is not used here since type should be encoded as type, not
          > > as name
          > > my ($schema, $class);
          > > if( $type ) {
          > > ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;
          > > } else {
          > > my ( $null ) = grep /^$SOAP::Constants::NS_XSI_NILS$/, keys %$attrs;
          > > if( $null && $null =~ /^$SOAP::Constants::NS_XSI_NILS$/ ) {
          > > $schema = $1 || $2;
          > > }
          > > }
          > >
          > > in place of (in SOAP::Deserializer::decode_value)
          > >
          > > my ($schema, $class) = SOAP::Utils::splitlongname($type) if $type;
          > >
          > > Now, is the above described behaviour a bug? And is there a better fix
          > > than my hack ? (I'm using 0.65_5)
          > >
          > > Crispin
          > >
          > >
          > >
          > > ------------------------------------------------------------------------
          > > *Yahoo! Groups Links*
          > >
          > > * To visit your group on the web, go to:
          > > http://groups.yahoo.com/group/soaplite/
          > >
          > > * To unsubscribe from this group, send an email to:
          > > soaplite-unsubscribe@yahoogroups.com
          > > <mailto:soaplite-unsubscribe@yahoogroups.com?subject=Unsubscribe>
          > >
          > > * Your use of Yahoo! Groups is subject to the Yahoo! Terms of
          > > Service <http://docs.yahoo.com/info/terms/>.
          > >
          > >
          >
          >
        • Paul Kulchenko
          Since none of the namespaces was actually used there is no (reliable) way to tell what schema should be used in the response. We can look at declared
          Message 4 of 5 , May 25, 2005
          • 0 Attachment
            Since none of the namespaces was actually "used" there is no
            (reliable) way to tell what schema should be used in the response. We
            can look at declared namespaces (as you implemented in your hack),
            but it's not reliable (and besides, those namespaces can be declared
            on any element; not necessarily on soap:envelope).

            As far as I remember you can specify a default schema to be used when
            autodetection fails. It might also be possible to add a method that
            you can override with your own schema detection mechanism, but I'm
            not sure how feasible this is.

            Given all this I wouldn't say it's a bug ;)

            Paul.

            --- Byrne Reese <byrne@...> wrote:
            > No, I would consider this a bug. Ideally, SOAP::Lite should use the
            > same
            > schema in the response as was sent in the request. Thanks for
            > catching this.
            >
            > Crispin Flowerday wrote:
            >
            > > Hi,
            > >
            > > I am trying to write a SOAP::Lite server, and have run across
            > what I
            > > believe is a bug. It seems that when deserealizing the request
            > from the
            > > client, the XMLSchema version is not correctly worked out in the
            > case
            > > where there are no arguments to the function, e.g. imagine the
            > following
            > > SOAP request:
            > >
            > > <?xml version="1.0" encoding="UTF-8"?>
            > > <soap:Envelope
            > > xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
            > > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
            > > xmlns:xsd="http://www.w3.org/1999/XMLSchema"
            > >
            > soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            > > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            > > <soap:Body>
            > > <namesp1:hello xmlns:namesp1="Test" xsi:null="1" />
            > > </soap:Body>
            > > </soap:Envelope>
            > >
            > > Then the response received from the server uses the 2001 schema,
            > rather
            > > than the 1999 schema. This causes all sorts of problems when
            > mixing
            > > SOAP::Lite clients, and mono clients.
            > >
            > > Attached is a client and a daemon that show the problem, if you
            > run the
            > > daemon, and then use the client to send over a 1999 schema
            > request, it
            > > comes back using the 2001 schema.
            > >
            > > I have a very hacky fix, which is probably totally the wrong way
            > to fix
            > > it, by inserting a block like (I know its not a real fix as you
            > get
            > > warnings a line slightly further down in the file):
            > >
            > > # $name is not used here since type should be encoded as type,
            > not
            > > as name
            > > my ($schema, $class);
            > > if( $type ) {
            > > ($schema, $class) = SOAP::Utils::splitlongname($type) if
            > $type;
            > > } else {
            > > my ( $null ) = grep /^$SOAP::Constants::NS_XSI_NILS$/, keys
            > %$attrs;
            > > if( $null && $null =~ /^$SOAP::Constants::NS_XSI_NILS$/ ) {
            > > $schema = $1 || $2;
            > > }
            > > }
            > >
            > > in place of (in SOAP::Deserializer::decode_value)
            > >
            > > my ($schema, $class) = SOAP::Utils::splitlongname($type) if
            > $type;
            > >
            > > Now, is the above described behaviour a bug? And is there a
            > better fix
            > > than my hack ? (I'm using 0.65_5)
            > >
            > > Crispin
            > >
            > >
            > >
            > >
            >
            ------------------------------------------------------------------------
            > > *Yahoo! Groups Links*
            > >
            > > * To visit your group on the web, go to:
            > > http://groups.yahoo.com/group/soaplite/
            > >
            > > * To unsubscribe from this group, send an email to:
            > > soaplite-unsubscribe@yahoogroups.com
            > >
            > <mailto:soaplite-unsubscribe@yahoogroups.com?subject=Unsubscribe>
            > >
            > > * Your use of Yahoo! Groups is subject to the Yahoo! Terms of
            > > Service <http://docs.yahoo.com/info/terms/>.
            > >
            > >
            >
            >
            >
            >
            >
            > Yahoo! Groups Links
            >
            >
            >
            >
            >
            >
            >
          • Crispin Flowerday
            ... My hack doesn t look at the declared namespaces, it works out what namespace was used for the xsi:null / xsi:nil element. The problems come when using
            Message 5 of 5 , May 26, 2005
            • 0 Attachment
              On Wed, 2005-05-25 at 08:52 -0700, Paul Kulchenko wrote:
              > Since none of the namespaces was actually "used" there is no
              > (reliable) way to tell what schema should be used in the response. We
              > can look at declared namespaces (as you implemented in your hack),

              My hack doesn't look at the declared namespaces, it works out what
              namespace was used for the "xsi:null" / "xsi:nil" element.

              The problems come when using the windows SOAP API (or the mono one),
              which doesn't even send the xsi:null / xsi:nil element. In this
              situation the only way is to look at the declared namespaces.

              The current behaviour is definately wrong, as the schema used for
              responses is totally undefined (it depends on the schema used in the
              previous response). This, at least, breaks mono, which doesn't
              understand the 1999 schema, and won't parse response using the 1999
              schema.

              Crispin


              > but it's not reliable (and besides, those namespaces can be declared
              > on any element; not necessarily on soap:envelope).
              >
              > As far as I remember you can specify a default schema to be used when
              > autodetection fails. It might also be possible to add a method that
              > you can override with your own schema detection mechanism, but I'm
              > not sure how feasible this is.
              >
              > Given all this I wouldn't say it's a bug ;)
              >
              > Paul.
              >
              > --- Byrne Reese <byrne@...> wrote:
              > > No, I would consider this a bug. Ideally, SOAP::Lite should use the
              > > same
              > > schema in the response as was sent in the request. Thanks for
              > > catching this.
              > >
              > > Crispin Flowerday wrote:
              > >
              > > > Hi,
              > > >
              > > > I am trying to write a SOAP::Lite server, and have run across
              > > what I
              > > > believe is a bug. It seems that when deserealizing the request
              > > from the
              > > > client, the XMLSchema version is not correctly worked out in the
              > > case
              > > > where there are no arguments to the function, e.g. imagine the
              > > following
              > > > SOAP request:
              > > >
              > > > <?xml version="1.0" encoding="UTF-8"?>
              > > > <soap:Envelope
              > > > xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
              > > > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
              > > > xmlns:xsd="http://www.w3.org/1999/XMLSchema"
              > > >
              > > soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
              > > > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
              > > > <soap:Body>
              > > > <namesp1:hello xmlns:namesp1="Test" xsi:null="1" />
              > > > </soap:Body>
              > > > </soap:Envelope>
              > > >
              > > > Then the response received from the server uses the 2001 schema,
              > > rather
              > > > than the 1999 schema. This causes all sorts of problems when
              > > mixing
              > > > SOAP::Lite clients, and mono clients.
              > > >
              > > > Attached is a client and a daemon that show the problem, if you
              > > run the
              > > > daemon, and then use the client to send over a 1999 schema
              > > request, it
              > > > comes back using the 2001 schema.
              > > >
              > > > I have a very hacky fix, which is probably totally the wrong way
              > > to fix
              > > > it, by inserting a block like (I know its not a real fix as you
              > > get
              > > > warnings a line slightly further down in the file):
              > > >
              > > > # $name is not used here since type should be encoded as type,
              > > not
              > > > as name
              > > > my ($schema, $class);
              > > > if( $type ) {
              > > > ($schema, $class) = SOAP::Utils::splitlongname($type) if
              > > $type;
              > > > } else {
              > > > my ( $null ) = grep /^$SOAP::Constants::NS_XSI_NILS$/, keys
              > > %$attrs;
              > > > if( $null && $null =~ /^$SOAP::Constants::NS_XSI_NILS$/ ) {
              > > > $schema = $1 || $2;
              > > > }
              > > > }
              > > >
              > > > in place of (in SOAP::Deserializer::decode_value)
              > > >
              > > > my ($schema, $class) = SOAP::Utils::splitlongname($type) if
              > > $type;
              > > >
              > > > Now, is the above described behaviour a bug? And is there a
              > > better fix
              > > > than my hack ? (I'm using 0.65_5)
              > > >
              > > > Crispin
              > > >
              > > >
              > > >
              > > >
              > >
              > ------------------------------------------------------------------------
              > > > *Yahoo! Groups Links*
              > > >
              > > > * To visit your group on the web, go to:
              > > > http://groups.yahoo.com/group/soaplite/
              > > >
              > > > * To unsubscribe from this group, send an email to:
              > > > soaplite-unsubscribe@yahoogroups.com
              > > >
              > > <mailto:soaplite-unsubscribe@yahoogroups.com?subject=Unsubscribe>
              > > >
              > > > * Your use of Yahoo! Groups is subject to the Yahoo! Terms of
              > > > Service <http://docs.yahoo.com/info/terms/>.
              > > >
              > > >
              > >
              > >
              > >
              > >
              > >
              > > Yahoo! Groups Links
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              >
            Your message has been successfully submitted and would be delivered to recipients shortly.