現象
なーんかJOIの予選練習問題解いてたら、@asi1024がChromeでCのソースコードをアップできないって言うんで、どういうことかなーって思ってたら、後日JOIから発表があった。
「予選練習」において, Google Chrome (7.0 以降)など一部のブラウザからソースコードのアップロードが正常に行えない場合があることが確認されています.
競技当日までに競技に使用するPCから予選練習にてソースコードのアップロードが
正常に行えるか確認してください.
どうやら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