Code Monkey home page Code Monkey logo

Comments (9)

weierophinney avatar weierophinney commented on June 24, 2024

The problem is that false results could lead to subsequent errors in parsing and handling of the entire feed.

Maybe it's an option to inject your own DOMDocument or a decorator clean up / recover the feeds before they are parsed by the reader.


Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

You can use the recovery mode yourself:

// Import by URI
$httpClient = Zend\Feed\Reader\Reader::getHttpClient();
$response   = $httpClient->get(
    'https://github.com/zendframework/zend-feed/releases.atom'
);
$xmlString  = $response->getBody();

// Create DOMDocument
$dom          = new DOMDocument;
$dom->recover = true;
$dom->loadXML(trim($xmlString));

// Detect type
$type = Zend\Feed\Reader\Reader::detectType($dom);

// Create reader
if (0 === strpos($type, 'rss')) {
    $reader = new Zend\Feed\Reader\Feed\Rss($dom, $type);
}
if (0 === strpos($type, 'atom')) {
    $reader = new Zend\Feed\Reader\Feed\Atom($dom, $type);
}

var_dump($reader->getTitle()); // "Release notes from zend-feed"

Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

Thanks for help! This is indeed what I ended up doing:
https://gitlab.com/DeepRSS/Reader/blob/3667b1b10c11b9c067de1e3242f15eaf2a1de261/src/Core/Service/ZendReader/FeedParser.php#L35


Originally posted by @Isinlor at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

@Isinlor
Thanks for the fast response! πŸ‘

Can you provide a link to a feed which is malformed and needs the recovery mode?


Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

Here is one example: http://itbrokeand.ifixit.com/atom.xml

Code I used for testing:

<?php

$libxmlErrflag = libxml_use_internal_errors(true);
$oldValue = libxml_disable_entity_loader(true);

$dom = new \DOMDocument;
//$dom->recover = true; // Allows to parse slightly malformed feeds

$status = $dom->loadXML(file_get_contents("http://itbrokeand.ifixit.com/atom.xml"));

if (!$status) {

    // Build error message
    $error = libxml_get_last_error();
    if ($error instanceof \LibXMLError && $error->message != '') {
        $error->message = trim($error->message);
        $errormsg = "DOMDocument cannot parse XML: {$error->message}";
    } else {
        $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity";
    }

    throw new Exception($errormsg);
}

Originally posted by @Isinlor at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

@Isinlor
Perfect, this helps a lot. I collect various problems to create some test scenarios.


Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

I think your initial reaction was correct.

The problem is that false results could lead to subsequent errors in parsing and handling of the entire feed.

I missed it when I was working on it myself. But indeed, even tough $dom->recover = true; seems to work, Zend Feed is not able to handle it correctly.

I'm really curious how Firefox handle it, because I have no issues if I open:


Originally posted by @Isinlor at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

@Isinlor
I will check all links this evening and will give a feedback.


Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

weierophinney avatar weierophinney commented on June 24, 2024

@Isinlor

https://blog.noredink.com/rss

There were some problems, but now I have not found anything.

http://itbrokeand.ifixit.com/atom.xml

Problem is <title>Web Operations D&D</title> and therefore not well-formed. Should be reported at ifixit.com. Everything else means ugly replacements.

(Also fails in a browser.)

http://aasnova.org/feed/

Two problems: 403 and wrong header.

(Also fails in a browser. [Download])

https://blog.floydhub.com/rss/

Many feeds contain characters out of the legal range.

Try the following preg_replace:

preg_replace(
    '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+/u',
    ' ',
    $string
)

This should eliminate problems like "CData section not finished".

(Also fails in a browser.)


Thanks for the examples. At the moment I do not know if we should do something in zend-feed, because it opens the door to many pitfalls or ugly workarounds. I see the benefit for the user but also the problem of maintain.

I remain open to suggestions and improvements.


Originally posted by @froschdesign at zendframework/zend-feed#73 (comment)

from laminas-feed.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.