silkでqmlファイルがベタで落ちてくる
このブログはsilkを使用していますが、特定の環境で動かしていると、ブラウザからqmlファイルにアクセスしたときに、qml -> htmlの変換がされずにqmlファイルがベタで落ちてくることがあります。 これはsilkを動かしているサーバーのMIME情報にqmlが登録されていないために発生します。直す方法をメモしておきます。
ちなみに、そんなに調べていませんが、shared-mime-infoにqmlが追加されたのは2011年です。最近のバージョンのディストリビューションであればほぼ問題ないと思います。確認した限りではRHEL/RHELのソースをベースにしたもの(CentOSなど)くらいでしょうか。某所でOpenShiftでも同じ現象が発生するのはおそらく同じ理由かと...
silkはQMimeDatabaseクラスを使用してアクセスされたファイルのMIME情報をマッチングして、マッチしたものに対して適切なContent-Typeでリクエストに返答するようになっていますが、QMimeDatabase::mimeTypeForFile()関数ではマッチしなかったファイルに対してすべて"application/octet-stream"のMIME情報を返すため、qmlファイルが直接ダウンロードされてしまいます。
ちなみに、silkではmimeTypeForFile()に渡すMatchModeをQMimeDatabase::MatchExtensionにしているため、ファイルの拡張子でのみ判断していることになります。MatchModeにはファイルの中身を判別するオプションもありますが、Linuxのshared-mime-infoに登録されているqmlファイルの内容での判断は正直やっつけ感があるので、使わない方が賢明かと思います。
というわけで、MIME情報をOSに追加すれば、きちんとマッチしてくれて、qmlファイルに関してはsilkのMimeHandlerプラグインによってqml -> htmlの変換が実行されるようになります。Linuxの場合は、/usr/share/mime/packages/freedesktop.org.xml に追記すればOKです。内容としては、shared-mime-infoのgitを見るとよいでしょう。
silk起動時にmimeキャッシュを見にいくので、念のため
update-mime-database /usr/share/mime
と打っておくのがよいでしょう。