torgtaitai/DodontoF — pull request #8 by FaviusTy (2014-05-03 16:29:30+00:00)
Title: v1.9以降の環境で画像ファイルアップロード処理が失敗する

お疲れ様です。
手元の環境でタイトルの現象で問題が発生していたので、原因と修正差分をpull requestしました。
内容を精査の上、妥当と判断されるようでしたら取り込んでいただけたら幸いです。

直接の原因は、画像アップロード時にmsgpackからデシリアライズされた`params["imageData"]``params["smallImageData"]`を取得する際、デフォルトエンコードのUTF-8で取得するタイミングでエンコーディング処理に失敗していることによります。

Ruby1.9以降、[全てのStringインスタンスはエンコーディング情報を内包し](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html)、文字列を実際に操作する時点でエンコード処理を暗黙裡に行うようになっています。

[MessagePackの仕様では](https://github.com/msgpack/msgpack/blob/master/spec.md#types)Rawデータは文字列とバイナリを分けてシリアライズするようなので、本来画像データにあたるhash-valueはASCII-8bit(=Encoding::BINARY)のStringインスタンスとなるはずなのですが、UTF-8になっていました。

恐らくActionScript側で画像ファイルをリクエストボディに設定するタイミングでMessagePackがバイナリデータだと認識していないのではないかと考えられます(Ruby側で画像ファイルをFile.binreadなどでHashに設定した場合は解凍後もASCII-8bitで取得できました)

いずれにせよ、Ruby1.9以降で外部から渡されたmsgpackの情報からバイナリデータを取得する際は強制的にASCII-8bitとして取得するのが確実です。

pull requestには問題の発生した箇所で当該環境の場合にString.encodeメソッドを使ってエンコードを明示的に指定して取得するようにしてあります。
（自分の使用している環境下では正常にアップロード処理が通るようになりました）

他の箇所でも同様の問題が発生するようであればもっと大きなリファクタリングが必要かも知れません。

詳細は以上です。