プロジェクト

全般

プロフィール

Bug(バグ) #1684

サイドバナーのRSSリーダーで読み込めない時がある

pnetan  13年以上前に追加. 8年以上前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-10-15
期日:
進捗率:

100%

3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

説明

現象

(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);
     }
   }
のような変更で十分かと思われます。


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #2273: サイドバナーのRSSリーダーで読み込めない時がある Fixed(完了)
関連している OpenPNE 3 - Bug(バグ) #2408: サイドバナーのRSSリーダーでURLに特殊文字が含まれる場合に正しいRSSフィードが得られない Fixed(完了) 2011-09-17
関連している OpenPNE 3 - Bug(バグ) #2407: 管理画面ガジェット設定で&などのエスケープ文字を入力すると元の文字で表示される New(新規) 2011-09-17
関連している OpenPNE 3 - Backport(バックポート) #2772: サイドバナーのRSSリーダーで読み込めない時がある Fixed(完了) 2010-10-15

関係しているリビジョン

リビジョン ceae6c56 (差分)
Naoya Tozukaほぼ13年前に追加

catch all fatal exceptions thrown in RSS-reader gadget (refs #1684)

リビジョン 1d880d6c (差分)
Yuya Watanabe12年以上前に追加

(fixes #1684) fixed to show sidebar also when RSSBox got an empty string

リビジョン 0a7ee69c (差分)
Yuya Watanabe12年以上前に追加

(fixes #1684) fixed not to escape RSS feed URL

リビジョン e2aad7e1 (差分)
Yuya Watanabe12年以上前に追加

Revert "(fixes #1684) fixed not to escape RSS feed URL"

This reverts commit 0a7ee69cdb2f90d7af3d36c187da87ffc882ac4f.

履歴

#1 Kousuke Ebihara13年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更
  • 対象バージョンOpenPNE 3.7.0 にセット
  • 3.6 で発生するかYes にセット

その RSS の内容に問題があると思いますが、それによって画面の表示ができなくなるのは重大な問題だと思います。

ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。

#2 Shingo Yamadaほぼ13年前に更新

  • 担当者Naoya Tozuka にセット

#3 Naoya Tozukaほぼ13年前に更新

  • ステータスNew(新規) から 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);
     }
   }

#4 Naoya Tozukaほぼ13年前に更新

  • ステータスPending Fixing(修正待ち) から Accepted(着手) に変更

#5 Naoya Tozukaほぼ13年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

ceae6c56 で対応しました。レビュー宜しくお願いします。

#6 Masato Nagasawaほぼ13年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

レビューはOKですが、
Descriptionのフォーマットの統一をお願いします。

#7 Naoya Tozukaほぼ13年前に更新

Descriptionを加筆しました。

#8 Shingo Yamada12年以上前に更新

  • 360対象RC1 にセット

#9 Yuma Sakata12年以上前に更新

  • 360対象 を削除 (RC1)

#10 Yuma Sakata12年以上前に更新

  • 360対象RC1 にセット

#11 Minoru Takai12年以上前に更新

  • 説明 を更新 (diff)

#12 Maki Takahashi12年以上前に更新

  • ステータスPending Testing(テスト待ち) から Rejected(差し戻し) に変更
  • 担当者Naoya Tozuka から Yuya Watanabe に変更
  • 進捗率70 から 50 に変更

BP先でのテストによって、差し戻しされておりますので元チケットも差し戻しいたします。

#13 wa ta12年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 1d880d6c61e8b6cf4c1200170c6eb0d3e01b0da9 で適用されました。

#14 wa ta12年以上前に更新

更新履歴 0a7ee69cdb2f90d7af3d36c187da87ffc882ac4f で適用されました。

#15 wa ta12年以上前に更新

更新履歴 e2aad7e171c5a0d5a93373d3d669ede5a06cc52e で適用されました。

#16 Yuya Watanabe12年以上前に更新

バックポート先で指摘された問題について

参考: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=バイク&amp;output=rss&amp;start=0&amp;count=12&amp;sort=dt_recent&amp;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」の欄にも気になる点があったので調べてみました.

  1. サイドバーガジェット設定画面でRSSリーダーを2つ追加
  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=バイク&amp;output=rss&amp;start=0&amp;count=12&amp;sort=dt_recent&amp;adult_filter=1
  3. その後「設定変更」部分に「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
  4. 下記のようにコードを編集して確認.
    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=バイク&amp;output=rss&amp;start=0&amp;count=12&amp;sort=dt_recent&amp;adult_filter=1

この問題については #2407 で対応を行うことにしました.

#17 Kousuke Ebihara12年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#18 isao sano12年以上前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テスト完了しました。
問題ありませんので、ステータスをFixedと致します。

#19 kaoru n8年以上前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF