0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GAE/pyのCloudStorage libraryでのURLエンコード処理

Posted at

(随分昔に書いた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()処理が書かれていなかったからでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?