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

Flux RSS ne peut pas être ajouté #233

Closed
Vincent14 opened this issue Nov 6, 2013 · 7 comments
Closed

Flux RSS ne peut pas être ajouté #233

Vincent14 opened this issue Nov 6, 2013 · 7 comments
Assignees
Milestone

Comments

@Vincent14
Copy link

Flux : http://www.starcitizen.fr/feed/
Erreur : « Un problème interne a été rencontré, le flux n’a pas pu être ajouté »

@marienfressinaud
Copy link
Member

Le flux n'est pas valide, il semblerait qu'il soit impossible de le parser correctement : http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fwww.starcitizen.fr%2Ffeed%2F

En fait il s'agit d'un soucis dans un article, mais ça suffit à planter le parsage ;)

@Alkarex
Copy link
Member

Alkarex commented Nov 6, 2013

Il faudrait trouver un moyen d'être moins strict, par exemple en utilisant Tidy http://stackoverflow.com/questions/15147711/php-tidy-removes-whitespace-and-inserts-newlines ou en changeant le parseur XML de SimplePie pour un tel DOMDocument qui a des options pour être moins strict mais qui charge tout le document en mémoire.
Ceci dit, j'ai l'impression que le XML est déjà entièrement chargé en mémoire, donc ça ne doit pas faire un grosse différence :-/

@Alkarex
Copy link
Member

Alkarex commented Nov 6, 2013

Voilà un patch à tester un peu manuellement avant de le mettre dans dev.
Ajout d'un nettoyage basé sur DOMDocument dans lib/SimplePie/SimplePie/Parser.php
Ça ajoute néanmoins un peut de travail lors de la mise à jour.

    public function parse(&$data, $encoding)
    {
        // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
        if (strtoupper($encoding) === 'US-ASCII')
        {
            $this->encoding = 'UTF-8';
        }
        else
        {
            $this->encoding = $encoding;
        }

        // Strip BOM:
        // UTF-32 Big Endian BOM
        if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
        {
            $data = substr($data, 4);
        }
        // UTF-32 Little Endian BOM
        elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
        {
            $data = substr($data, 4);
        }
        // UTF-16 Big Endian BOM
        elseif (substr($data, 0, 2) === "\xFE\xFF")
        {
            $data = substr($data, 2);
        }
        // UTF-16 Little Endian BOM
        elseif (substr($data, 0, 2) === "\xFF\xFE")
        {
            $data = substr($data, 2);
        }
        // UTF-8 BOM
        elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
        {
            $data = substr($data, 3);
        }

        if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
        {
            $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
            if ($declaration->parse())
            {
                $data = substr($data, $pos + 2);
                $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
            }
            else
            {
                $this->error_string = 'SimplePie bug! Please report this!';
                return false;
            }
        }

        try
        {
            $dom = new DOMDocument();
            $dom->recover = true;
            $dom->strictErrorChecking = false;
            $dom->loadXML($data);
            $data = $dom->saveXML();
            //file_put_contents('/tmp/fresrss-parser.log', date('c') . ' ' . 'OK' . "\n", FILE_APPEND);
        }
        catch (Exception $e)
        {
            file_put_contents('/tmp/fresrss-parser.log', date('c') . ' ' . $e->getMessage() . "\n" . $data . '----------------' . "\n", FILE_APPEND);
        }

        $return = true;

        static $xml_is_sane = null;

@ghost ghost assigned Alkarex Nov 7, 2013
@Vincent14
Copy link
Author

Wao, félicitations pour ton implication dans FreshRSS, j'ai l'impression qu'à chaque problème insurmontable, toi ou Marien trouvez en quelques minutes la solution :) Je ne vais pas avoir le temps de tester malheureusement, j'ai simplement ouvert un rapport pour ce site en le trouvant par hasard :$

Alkarex added a commit that referenced this issue Nov 7, 2013
Utilise une méthode moins stricte qui tolère des erreurs XML dans les
flux.
Le choix de l'encodage en entrée a dû être légèrement changé car
SimplePie a une stratégie d'essayer plusieurs encodages jusqu'à en
trouver un qui marche.
En étant moins strict sur les erreurs, ça marche plus souvent, et du
coup les encodages n'étaient plus bon.
À essayer avec plein de flux.
Tous mes flux passent (~150).
Devrait permettre de fermer
#233
Fonctionne aussi avec des flux à encodage invalide comme
http://travaux.ovh.net/rss.php qui se déclare en "text/xml" (du coup
ASCII) mais dans le flux avec un entête XML déclarant de l'UTF-8
@Alkarex
Copy link
Member

Alkarex commented Nov 7, 2013

Bon, j'ai passé dans /dev un patch un peu plus compliqué pour tolérer non seulement du XML mal formé mais aussi certains encodages mal déclarés, sans trop casser (j'espère) SimplePie.
À tester avec de nombreux flux.

@Vincent14
Copy link
Author

Cela fonctionne parfaitement, félicitations =)

@Alkarex
Copy link
Member

Alkarex commented Nov 9, 2013

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants