情報オリンピック日本委員会

現象

なーんかJOIの予選練習問題解いてたら、@asi1024がChromeでCのソースコードをアップできないって言うんで、どういうことかなーって思ってたら、後日JOIから発表があった。

「予選練習」において, Google Chrome (7.0 以降)など一部のブラウザからソースコードのアップロードが正常に行えない場合があることが確認されています.
競技当日までに競技に使用するPCから予選練習にてソースコードのアップロードが
正常に行えるか確認してください.less than a minute ago via HootSuite

どうやらChromeだけの現象らしい。
しかも.txtファイルはアップできて、.cファイル等がアップできないという不思議な現象。
.c等のファイルをアップロードしようとすると以下のようにエラーがでる。
(JOIからの報告の数日後に、サイトの保守作業があったみたいだけど、まだバグは治っていなかった)

原因らしきものをぐぐってみたら、さくっと出てきた。

一般に登録されていない拡張子の場合、Chromeでアップロードできない – Google Chrome 公式ヘルプフォーラム

もしかしたらもう解決済みなのかな?とは思ったものの、ちょっと調べてみた。
Chromeのバージョンは8.0.552.215 beta

「Content-Typeフィールド」が無い

プロキシツールを使って、sample.txtファイルをアップしたときと、sample.cファイルをアップしたときの違いを見てみた。
どうやらレスポンスヘッダーの「Content-Typeフィールド」の付与の有無が関わってることが分かった。
一般に登録されてない拡張子だと「Content-Typeフィールド」が付与されないみたい。
(他のブラウザだと、どのファイルでも「Content-Typeフィールド」が付与されるようだ。)

(比較)

「Content-Typeフィールド」を適当に付け加えるとアップロードできるようになった。

あとがき

今までChromeを使ってても、dropboxも使えたし、なんら問題がなかったので、ちょっと驚き。
ちなみにdropboxでアップロードするときも、「一般に登録されてない拡張子」だと「Content-Typeフィールド」が付与されなかった。
JOIの鯖側で「Content-Typeフィールド」のチェックでもしてるのかしら。

それにしてもJOIさん、font要素とかまじで使わないでください。

追伸

どうやらChromeのバグだったようです。
Issue 6800 – chromium – Chrome doesn't set Content-Type for file upload when the file extension is not recognized. – Project Hosting on Google Code

一度直されたバグが復活したのかな?
今後直されるといいですが・・・

thanks to @pastak