prototype020.info

silkでqmlファイルがベタで落ちてくる

Published: 2014-04-02 / Last modified: 2014-04-15

このブログは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

と打っておくのがよいでしょう。

Trend