at posts/single.html

blogkitでエントリの更新時にエラー

tdiary-develにも送ったんだけど、blogkitを使ってエントリ(日記)を更新しようとすると、Script Errorがでる。 環境は、XREA, ruby-1.8.0, tdiary-1.5.6.20040210, tdiary-blogkit-1.5.6 (CVS HEAD) 。

最終的には解決したんだけど、その過程を残しておこうと思う。

まず、サーバからどんなレスポンスが帰ってきているのかを確認しないと話しにならない。 僕が知っている方法は、wgetにSオプションをつけるか、update.cgiをupdate.cgidにリネームするか(後者はXREAに特化した方法)くらい。

しかし、このエラーはエントリ(日記)の登録時に発生する。 つまり、wgetで直接 update.cgi を指定しても、編集画面(のソース)が表示されるだけで、エラーにはたどり着けない。

そこで、まず更新画面をのformのメソッドをPOSTからGETに変更し、ブラウザで登録画面を表示させる。 この状態で更新ボタンを押すと、アドレスバーに表示されたアドレスには、日記更新用のパラメータが表示される。

http://www.example.com/blogkit/update.cgi?old=20030830&year=2003&month=8&day=30&title=&body=%0D%0A%0D%0A&replace=+%C5%D0%CF%BF+

あとはこのアドレスを wget や .cgid にて表示させればエラー時のサーバレスポンスが取得できる。 やってみたところ、レスポンスに変なデータが含まれていることが分かった。

==
===
=~
__id__
(中略)
untaint
visible?
Content-Type: text/html

blogkitを導入していない素のtDiaryではエラーが発生しないので、原因はプラグインにあると推測。 ひとつずつプラグインを除いていくと、whatsnew-list がない場合はエラーがでないことがわかった。

プラグインの仕組みはよく理解していないんだけど、whatsnew-list.rbを見てみるとadd_update_procというメソッドがあった。 これが更新時に実行されているのかな?と思い、このメソッドの中に適当にデバッグ文 ( p("method start") みたいな単純なものだけど ) を挿入してみる。 再びサーバからのレスポンスを確認すると、追加したデバッグ文が含まれていたので、このメソッドだと確信。 最終的に、この一行がエラーの原因となる「変なデータ」を出力していることが分かった。

$stderr.puts diary.methods.sort

この行を削除すると、見事エラーは出なくなった。 これはデバッグ文なのかな? 標準エラー出力をレスポンスに含めてしまうのは、XREA特有の現象なのかも。 と思いつつ、tdiary-develに報告メールを送らせてもらった。

関連する日記