やったこと
curlでヘッダーをとるとContent-Type: application/xmlになっていました。
$ curl -I http://www.tokyu.co.jp/rss_news.xml
HTTP/1.1 200 OK
Server: Apache
Last-Modified: Fri, 12 Jan 2018 01:17:00 GMT
ETag: "1118-5628a05733b00"
Accept-Ranges: bytes
Content-Length: 4376
Content-Type: application/xml
Date: Sat, 13 Jan 2018 03:40:14 GMT
Connection: keep-alive
XMLの中を見ると「application/rss+xml」とあります。
<atom:link href="http://www.tokyu.co.jp/rss_news.xml" rel="self" type="application/rss+xml"/>
ホーン!合ってないからか!と思い、雑なスクリプトを書いてみました。
<?php
header('Content-Type: application/rss+xml');
$xml = "http://www.tokyu.co.jp/rss_news.xml";
print file_get_contents($xml);
これをFastladderに食わせたら、読んでくれるようになりました。でもFastladderで読めるべきでは??と思って調べると、Feedの取得はfeed_searcher gemに切り出されていて、lib/feed_searcher/page.rbで許容するMIME typeのリストがありました。
MIME_TYPES = %w[
application/atom+xml
application/rdf+xml
application/rss+xml
]
あーじゃあここにapplication/xmlを足せば動くのね!と、追加してやると、東急のRSSがそのまま読めるようになりました。なぜapplication/xmlが含まれていないのか疑問に思いつついくつかページを探して回ってもわからんので、Reject覚悟でとりあえずプルリクを出してみました。
add application/xml into MIME_TYPES by Akkiesoft · Pull Request #10 · fastladder/feed_searcher · GitHub
1分でTravis CIが失敗しました。specファイルという存在に気づいてませんでした……。spec/feed_searcher_spec.rbにはRSS読み込みのテストが記述されていて、application/xmlは読み込まないようになっていました。
# This example makes sure the following specifications.
(略)
# * it does not recognize application/xml
ォォン……。その理由はfeed_searcherのプルリク#1のコメントにあった記事で解説されていました。見ていたけれど、斜め読みになってて理解できていなかった。わたしアホ。
r7kamura.hatenablog.com
たぶん上記の理由から、Fastladderでは昔からの「リクエストではapplication/xmlと答えつつXMLにはapplication/rss+xmlなどと書く」やつは弾いているのだろうと理解しました。application/xmlだとRDF以外のよくわからん文書食わされるかもわからんわけですし。プルリクする前に理解しないとあかんかったやつだ。
腑に落ちていない感じがあるのは、MIME_TYPESにapplication/rss+xmlはあるのにapplication/xmlがないところかもしれません。application/rss+xmlはIANAに入らなかったのでは?みたいな。ただ、RSS Autodiscoveryという機能的にはapplication/rss+xmlを書くようにとあるので、このあたりなのか。
さておき、東急のお問い合わせページを開いて↑を説明しながらContent-TypeをApplication/rdf+xmlにしてもらうのが正攻法と言うことになりそうですが、なんかそれはしんどそうだな……というのが今の心境です。サイト担当者の人見てたら直して頼む〜。
一方でこのままでは古いやり方のRSSがFastladderで読めないので、なんか妥協しながらでも読んでほしいなあと思ったりもします。ので、出してしまったプルリクを下げるのも躊躇している状態です。コメントにどう書くか迷ってここにだらだらっと書いててしまった。。
どこにも変更を加えず、問い合わせもしないでやるなら、雑スクリプトを以下のとおりにしてやればそれでOKかな……と言う妥協を書く替え始めているところ。
<?php
header('Content-Type: application/rdf+xml');
$xml = "http://www.tokyu.co.jp/rss_news.xml";
$data = file_get_contents($xml);
print str_replace("application/rss+xml", "application/rdf+xml", $data);
WikipediaのRSSのページを読んだら闇深そうな歴史とか書いてあるし、RSS自体なんか枯れてしまったままだし、ォォン……。