Bug(バグ) #1684
closedサイドバナーのRSSリーダーで読み込めない時がある
100%
Description
現象¶
(http://sns.openpne.jp/communityTopic/6318 より転記)
サイドバナーへRSSリーダーを登録しているのですが、
読み込み先によって、
画面の表示が「サーバーが混雑しています~」のような表示になってしまいます。
再現環境¶
サーバー:
- CentOS Linux 5.5
- MySQL version 5.0.91
- php 5.2.13
OpenPNEのバージョン:
- OpenPNE3.4.6.2
再現手順¶
こちらのRSSを登録する(8月28日23時ごろ)
http://video.baidu.jp/api/search?word=%E3%83%90%E3%82%A4%...
最初はずっと表示されていましたので、時間がたつと内容が変わりますので、表示されるようになるかもしれません。
サーバーのエラーログ:
PHP Fatal error: Uncaught exception 'sfException' with message 'Impossible to parse date "" with format "yyyy-MM-dd HH:mm:ss".' in /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php:186\n Stack trace:\n #0 /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php(219): sfDateFormat->getDate('', NULL)\n #1 /www/lib/vendor/symfony/lib/helper/DateHelper.php(60): sfDateFormat->format('', 'MM???dd???', NULL, 'utf-8')\n #2 /www/lib/helper/opUtilHelper.php(333): format_date('', 'MM???dd???', 'ja_JP', NULL)\n #3 /www/apps/pc_frontend/modules/default/templates/_rssBox.php(7): op_format_date('', 'XShortDateJa')\n #4 /www/cache/apache/pc_frontend/prod/config/config_core_compile.yml.php(3810): require('...')\n #5 /www/lib/vendor/symfony/lib/view/sfPartialView.class.php(110): sfPHPView->renderFile('...')\n #6 /www/lib/vendor/symfony/lib/helper/PartialHelper.php(155): sfPartialView->render()\n #7 /var/www/r in /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php on line 186
原因¶
規定外のRSSを受信した場合などに、パースに失敗し例外により処理が中断されるため。
修正内容¶
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
具体的には、note-3 にあるように
diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/def index 097703c..ad79046 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -95,11 +95,17 @@ class defaultComponents extends sfComponents public function executeRssBox() { - $fetcher = new opRssFetcher('UTF-8'); - $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); - if ($this->result) + try + { + $fetcher = new opRssFetcher('UTF-8'); + $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); + if ($this->result) + { + $this->result[1] = array_slice($this->result[1], 0, 5); + } + } + catch (Exception $e) { - $this->result[1] = array_slice($this->result[1], 0, 5); } }のような変更で十分かと思われます。
Updated by Kousuke Ebihara about 14 years ago
- Priority changed from Normal(通常) to High(高め)
- Target version set to OpenPNE 3.7.0
- 3.6 で発生するか set to Yes
その RSS の内容に問題があると思いますが、それによって画面の表示ができなくなるのは重大な問題だと思います。
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
Updated by Naoya Tozuka over 13 years ago
- Status changed from New(新規) to Pending Fixing(修正待ち)
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
以下のような対処で十分と思われます。
diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/def index 097703c..ad79046 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -95,11 +95,17 @@ class defaultComponents extends sfComponents public function executeRssBox() { - $fetcher = new opRssFetcher('UTF-8'); - $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); - if ($this->result) + try + { + $fetcher = new opRssFetcher('UTF-8'); + $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); + if ($this->result) + { + $this->result[1] = array_slice($this->result[1], 0, 5); + } + } + catch (Exception $e) { - $this->result[1] = array_slice($this->result[1], 0, 5); } }
Updated by Naoya Tozuka over 13 years ago
- Status changed from Pending Fixing(修正待ち) to Accepted(着手)
Updated by Naoya Tozuka over 13 years ago
- Status changed from Accepted(着手) to Pending Review(レビュー待ち)
- % Done changed from 0 to 50
ceae6c56 で対応しました。レビュー宜しくお願いします。
Updated by Masato Nagasawa over 13 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
レビューはOKですが、
Descriptionのフォーマットの統一をお願いします。
Updated by Maki Takahashi over 13 years ago
- Status changed from Pending Testing(テスト待ち) to Rejected(差し戻し)
- Assignee changed from Naoya Tozuka to Yuya Watanabe
- % Done changed from 70 to 50
BP先でのテストによって、差し戻しされておりますので元チケットも差し戻しいたします。
Updated by wa ta over 13 years ago
- Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)
更新履歴 1d880d6c61e8b6cf4c1200170c6eb0d3e01b0da9 で適用されました。
Updated by wa ta over 13 years ago
更新履歴 0a7ee69cdb2f90d7af3d36c187da87ffc882ac4f で適用されました。
Updated by wa ta over 13 years ago
更新履歴 e2aad7e171c5a0d5a93373d3d669ede5a06cc52e で適用されました。
Updated by Yuya Watanabe over 13 years ago
バックポート先で指摘された問題について¶
参考:http://redmine.openpne.jp/issues/2273#note-8
本チケットに記載されたRSSフィードのURLにおいては,下記部分で$entry['date']で空文字列が与えられていることが原因です.
ここで$entry['date']が空文字列であった場合でも適切な文字列をop_format_date()に与えることで解決できると思われます.
apps/pc_frontend/modules/default/templates/_rssBox.php
6 <?php foreach ($result[1] as $entry): ?> 7 <li><span class="date"><?php echo op_format_date($entry['date'], 'XShortDateJa') ?></span> 8 <?php echo link_to($entry['title'], $entry['link']) ?>
特殊文字がRSSフィードのURLに含まれている場合に正しい結果を取得できない問題について¶
このチケットの例で得られるRSSフィードがおかしいので以下の部分でRSSフィードをフェッチしている部分に注目してみました.
apps/pc_frontend/modules/default/actions/components.class.php
98 try 99 { 100 $fetcher = new opRssFetcher('UTF-8'); 101 $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); 102 if ($this->result) 103 { 104 $this->result[1] = array_slice($this->result[1], 0, 5); 105 } 106 }
ここで101行目で$this->gadget->getconfig('url')がそのまま用いられていることが気になったので出力を行ってみました.
すると下記のような文字列が得られました.
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
これをhtmlspecialchars_decode()によってデコードしてみると下記のようになり,最新の結果が得られました.
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
この部分を加味するに,本チケットにおける問題の本質としては「URLに特殊記号が含まれる場合に正しい結果を得られない」というところなのではないかと思いました.
この問題については #2408 で対応を行うことにしました.
管理画面ガジェット設定で&などのエスケープ文字を入力すると元の文字で表示される問題について¶
参考:http://redmine.openpne.jp/issues/2273#note-11
サイドバーガジェット設定画面(pc_backend.php/design/gadget/type/sideBanner)において,ガジェットの設定画面において「設定変更」部分に「URL」の欄が存在します.
この「URL」の欄にも気になる点があったので調べてみました.
- サイドバーガジェット設定画面でRSSリーダーを2つ追加
- それぞれのRSSリーダーにおいて「URL」に以下の2つのURLを入力して設定を保存
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
- その後「設定変更」部分に「URL」の欄を確認
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
- 下記のようにコードを編集して確認.
lib/form/doctrine/GadgetConfigForm.class.php:43行目に値を出力するコードを挿入.40 $config = Doctrine::getTable('GadgetConfig')->retrieveByGadgetIdAndName($gadget->getId(), $key); 41 if ($config) 42 { 43 var_dump($config->getValue()); 44 $this->setDefault($key, $config->getValue()); 45 }
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
この問題については #2407 で対応を行うことにしました.
Updated by Kousuke Ebihara over 13 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
Updated by isao sano about 13 years ago
- Status changed from Pending Testing(テスト待ち) to Fixed(完了)
- % Done changed from 70 to 100
テスト完了しました。
問題ありませんので、ステータスをFixedと致します。