Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP8.0 NativeParser issue #287

Closed
brumiser1550 opened this issue Sep 20, 2021 · 4 comments
Closed

PHP8.0 NativeParser issue #287

brumiser1550 opened this issue Sep 20, 2021 · 4 comments

Comments

@brumiser1550
Copy link

I have recently upgraded to PHP8 from PHP7.2 and have started to encounter errors with the returned results from the SDK.

As I understand and have been relying on, any date/datetime field in Keap is supposed to return as a DateTime object. This functionality is what breaks now.

The problem exists somewhere in the NativeParser class that is used because when I force use of XmlReaderParser everything returns as expected.

The issue comes about when a value of 0 comes back through the xml. I have found this issue with the Yes/No and the Whole Number field types in Keap.

Here is an example of the raw xml.
<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><array><data><value><struct><member><name>_AccountStalled</name><value><i4>0</i4></value></member><member><name>_LastUpdated1</name><value><dateTime.iso8601>20210920T00:00:00</dateTime.iso8601></value></member><member><name>Id</name><value><i4>7</i4></value></member><member><name>LastUpdated</name><value><dateTime.iso8601>20210920T16:54:17</dateTime.iso8601></value></member></struct></value></data></array></value></param></params></methodResponse>

When using NatveParser I get back a response of

[0] => Array
        (
            [_AccountStalled] => 0
            [_LastUpdated1] => stdClass Object
                (
                    [scalar] => 20210920T00:00:00
                    [xmlrpc_type] => datetime
                    [timestamp] => 1632096000
                )

            [Id] => 7
            [LastUpdated] => stdClass Object
                (
                    [scalar] => 20210920T16:54:17
                    [xmlrpc_type] => datetime
                    [timestamp] => 1632156857
                )

        )

When I use XmlReaderParser I get back

[0] => Array
        (
            [_AccountStalled] => 0
            [_LastUpdated1] => DateTime Object
                (
                    [date] => 2021-09-20 00:00:00.000000
                    [timezone_type] => 3
                    [timezone] => UTC
                )

            [Id] => 7
            [LastUpdated] => DateTime Object
                (
                    [date] => 2021-09-20 16:54:17.000000
                    [timezone_type] => 3
                    [timezone] => UTC
                )

        )
@ryanlholt
Copy link
Contributor

@brumiser1550 Could this possibly have something to do with the most recent PR that was merged? Looks like it bumped the lstrojny/fxmlrpc dependency up to version 0.20.0.

@brumiser1550
Copy link
Author

@ryanlholt Not entirely sure when this was introduced, but your comment gave me renewed interest in this issue. I investigate the Native Parser and found what I believe is a bug in the logic. I have created a pull request lstrojny/fxmlrpc#85 to address the issue

@brumiser1550
Copy link
Author

My fix in case anybody else comes across this is to override the Serializer class.

class InfusionsoftSerializer implements SerializerInterface
{

    /**
     * @param string $method
     * @param string $uri
     * @param array $params
     * @param ClientInterface $client
     * @return mixed|void
     * @throws HttpException
     */
    public function request($method, $uri, $params, ClientInterface $client)
    {
        // Although we are using fXmlRpc to handle the XML-RPC formatting, we
        // can still use Guzzle as our HTTP client which is much more robust.
        try {
            $transport = $client->getXmlRpcTransport();

            // TODO: this has the possibility of using NativeParser which is broken
            // if(extension_loaded('xmlrpc')) {
            //	    $parser = new BestParserDelegate();
            //	}
            // Because NativeParser is busted, explicitly use the working parser class
            $parser = new XmlReaderParser(true);

            $client = new Client($uri, $transport, $parser);

            $response = $client->call($method, $params);

            return $response;
        } catch (fXmlRpcException $e) {
            throw new HttpException($e->getMessage(), $e->getCode(), $e);
        }
    }

}

# Example usage
$this->keap   = new Infusionsoft($config);
$this->keap->setSerializer(new InfusionsoftSerializer());
$this->keap->setDebug(true);
$this->keap->setToken($token);

@brumiser1550
Copy link
Author

@ROMzombie Since I just saw you active on this SDK I am pinging you on this. This issue breaks the SDK and the fact that nobody else has recognized this after 3 years is disconcerting so hoping to provide some visibility on it. With all of the commotion around API key changes and part of the recommendation being to use this SDK, it should at least be in working order from a bare install. Any chance we can see a change in this? I have pushed a new issue on the fxmlrpc package as well. I have started a conversation in the FB API Group as well.

ROMzombie added a commit that referenced this issue Jul 8, 2024
Issue #287 - Always use fallback XML parser to avoid reported failure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants