includes/Feed/ChannelFeed.php
<?php
/**
* Copyright © 2004 Brooke Vibber <bvibber@wikimedia.org>
* https://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Feed;
use MediaWiki\Html\TemplateParser;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
/**
* Class to support the outputting of syndication feeds in Atom and RSS format.
*
* @stable to extend
* @ingroup Feed
*/
abstract class ChannelFeed extends FeedItem {
/** @var TemplateParser */
protected $templateParser;
/**
* @stable to call
*
* @param string|Title $title Feed's title
* @param string $description
* @param string $url URL uniquely designating the feed.
* @param string $date Feed's date
* @param string $author Author's user name
* @param string $comments
*
*/
public function __construct(
$title, $description, $url, $date = '', $author = '', $comments = ''
) {
parent::__construct( $title, $description, $url, $date, $author, $comments );
$this->templateParser = new TemplateParser();
}
/**
* Generate Header of the feed
* @par Example:
* @code
* print "<feed>";
* @endcode
*/
abstract public function outHeader();
/**
* Generate an item
* @par Example:
* @code
* print "<item>...</item>";
* @endcode
* @param FeedItem $item
*/
abstract public function outItem( $item );
/**
* Generate Footer of the feed
* @par Example:
* @code
* print "</feed>";
* @endcode
*/
abstract public function outFooter();
/**
* Setup and send HTTP headers. Don't send any content;
* content might end up being cached and re-sent with
* these same headers later.
*
* This should be called from the outHeader() method,
* but can also be called separately.
*/
public function httpHeaders() {
global $wgOut;
$varyOnXFP = MediaWikiServices::getInstance()->getMainConfig()
->get( MainConfigNames::VaryOnXFP );
# We take over from $wgOut, excepting its cache header info
$wgOut->disable();
$mimetype = $this->contentType();
header( "Content-type: $mimetype; charset=UTF-8" );
// Set a sensible filename
$mimeAnalyzer = MediaWikiServices::getInstance()->getMimeAnalyzer();
$ext = $mimeAnalyzer->getExtensionFromMimeTypeOrNull( $mimetype ) ?? 'xml';
header( "Content-Disposition: inline; filename=\"feed.{$ext}\"" );
if ( $varyOnXFP ) {
$wgOut->addVaryHeader( 'X-Forwarded-Proto' );
}
$wgOut->sendCacheControl();
}
/**
* Return an internet media type to be sent in the headers.
*
* @stable to override
*
* @return string
*/
private function contentType() {
global $wgRequest;
$ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
$allowedctypes = [
'application/xml',
'text/xml',
'application/rss+xml',
'application/atom+xml'
];
return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
}
/**
* Output the initial XML headers.
*/
protected function outXmlHeader() {
$this->httpHeaders();
echo '<?xml version="1.0"?>' . "\n";
}
}
/** @deprecated class alias since 1.40 */
class_alias( ChannelFeed::class, 'ChannelFeed' );