kolo / xmlrpc

Implementation of XMLRPC protocol in Go language.
MIT License
159 stars 94 forks source link

Handling Nil in the XML-RPC #84

Open isaacwein opened 2 years ago

isaacwein commented 2 years ago

This project is a major help in for me and it freed up a lot of hours of my time.

This is not a bug it is an Enhancement request

but I think that this library is not parsing the nil values from XML-RPC to GO the right way

GO-PLAYGROUND

for example i have this XML-RPC

<?xml version='1.0'?>
<methodResponse>
  <params>
    <param>
      <value>
        <struct>
          <member><name>result</name><value><string>OK</string></value></member>
          <member><name>users</name><value><array><data>
         <value><struct>
        <member><name>id</name><value><int>123</int></value></member>
        <member><name>name</name><value><string>jack</string></value></member>
        <member><name>vendor</name><value><nil/></value></member>
        <member><name>account_id</name><value><int>1</int></value></member>
        <member><name>number</name><value><string>+12345678900</string></value></member>
             </struct></value>
             <value><struct>
        <member><name>id</name><value><int>123</int></value></member>
                <member><name>name</name><value><string>mark</string></value></member>
                <member><name>vendor</name><value><struct>
                   <member><name>vendor_name</name><value><string>abc.xyz</string></value></member>
                </struct></value></member>
                <member><name>account_id</name><value><int>1</int></value></member>
                <member><name>number</name><value><nil/></value></member>
             </struct></value>
           </data></array></value></member>
        </struct>
      </value>
    </param>
  </params>
</methodResponse>

and I am trying to parse it into this type structure

type ResponseData struct {
    Result string  `xmlrpc:"result"`
    // this will throw an error "error: type mismatch - can't unmarshal invalid to struct"
    // solution: use []User
    Data   []*User `xmlrpc:"users"`
}

type User struct {
    ID        int64   `xmlrpc:"id"`
    Name      string  `xmlrpc:"name"`
    // this will not throw error,
    // but it will define it even it's nil
    Vendor    *Vendor `xmlrpc:"vendor"` // vendor might be nil
    AccountID int64   `xmlrpc:"account_id"`
    // this will not work it will always be empty string even the value is nil
    Number    *string `xmlrpc:"number"` // phone number might be nil
}

type Vendor struct {
    VendorName string `xmlrpc:"vendor_name"`
}

in some cases, it will throw an error, and in some cases it will ignore the XML-RPC nil value and define the pointer as an empty value, for example, if the XML-RPC has a nullable string and the type has a pointer type of a string the parser shouldn't define the string in a nil case it should leave it nil

icholy commented 1 year ago

There's this pull request, but it doesn't implement decoding: https://github.com/kolo/xmlrpc/pull/75

SchoolGuy commented 2 months ago

Looking at the spec nil values are not allowed, so whatever API you are talking to might not be XML-RPC. - http://xmlrpc.com/spec.md

isaacwein commented 2 months ago

Here I see the option of nil

https://en.wikipedia.org/wiki/XML-RPC#:~:text=nil-,%3Cnil%2F%3E,-Discriminated%20null%20value ""

And https://ws.apache.org/xmlrpc/types.html

And https://hexdocs.pm/xmlrpc/XMLRPC.html#module-nil

SchoolGuy commented 2 months ago

All of the mentioned resources are not the offical spec. Python also has an option to allow None as a type but the option is not spec conform and as such their implementations all differ a bit.

As this library is in minimal maintenance mode I would guess that such a feature is really out of scope.

isaacwein commented 2 months ago

nil is supported in almost every library i can find there But I didn't find any mention of it. Besides here http://1998.xmlrpc.com/bdgChangeNotes.html#nullValues

SchoolGuy commented 2 months ago

Yes that is true, but that link explicitly names SOAP in its title which is a somewhat similar but different protocol.

https://stackoverflow.com/a/88893/4730773