(随分昔に書いたGAE1genのpythonに関するメモですが、下書きに入ってたので投下しておきます。今はGAE 2genが主流なので不要と思います)
GAE/pyからGCSを参照するときに、URLエンコードが必要なファイル名のケースがあり、少しハマったのでメモしておきます。
なお、この問題は自分でREST API等を触る場合は問題なく、単にGAE用のcloudstorage libraryのquote処理が一貫していなかった、というだけの話です。
AppEngine用CloudStorage Clientライブラリ
AppEngineのドキュメントではGoogle Cloud Storage Client Libraryと呼ばれているライブラリのことを指しています。
名前が一貫していないですが、
pip install GoogleAppEngineCloudStorageClient
とできるライブラリのことです。
githubでのリポジトリ名はappengine-gcs-clientとなっているので、この名称が正しいのかもしれません。
java用とpython用が用意されていそうですが、今回はpython用のライブラリの話です。
機能としては、AppEngineのクレデンシャルを使ってCloudStorageのREST APIにアクセスするインターフェースを、ファイルライクにラップしてあるもの、だと思っています。
copy2メソッドのsrcだけはURLエンコードしてくれない
今回詰まった点は単純にREST APIの仕様に沿ったリクエストがされていなかっただけですが、
client libraryの実装で、URL quote処理が漏れている部分があったためでした。
ハマったのは、copy2(src, dst)
メソッドで、これのsrcはURLエンコードしてくれないのに、他のメソッドやdstに渡す文字列はURLエンコードされる、という事象でした。
理由は簡単で、他の引数はほぼpath parameterとして渡されるのでurllib.quote()
処理が書かれているのに対し、
copy2メソッドのsrcはREST APIのheader parameter x-goog-copy-source
として渡されるため、urllib.quote()
処理が書かれていなかったからでした。