aws-sdk-ruby の Aws::S3::Object#presigned_url
を呼び出す際に :get
+ :reponse_expires
を指定すると、署名付きURLを生成せずに NotImplementedError を raise してしまうのに遭遇した
どのようなコードなんですか?
#!/usr/bin/env ruby require 'aws-sdk-s3' s3 = Aws::S3::Resource.new( access_key_id: '***', secret_access_key: '***', ) obj = s3.bucket('examplebucket').object('test.txt') puts obj.presigned_url(:get, response_expires: Time.now)
このコードを実行すると NotImplementedError を raise する。
「バグ」なんですか?
レポートを出す前に、SDK の使い方を間違ってるという悲しい凡ミスではないことを確かめないといけない
ソースとドキュメントをきっちり調べた結果、 正式にサポートされているはずのパラメータだと確信を得て、issue でバグレポートを出した。
返信がついて「使い方は間違ってないね」とのことで、 Bug として ACK された
例外の発生箇所
問題となる例外をあげているコードは以下のようなコードだ
def build_part(shape_ref, param_value) case shape_ref.shape # 👈 # supported scalar types when StringShape, BooleanShape, FloatShape, IntegerShape, StringShape param_name = shape_ref.location_name "#{param_name}=#{escape(param_value.to_s)}" when MapShape if StringShape === shape_ref.shape.value.shape query_map_of_string(param_value) elsif ListShape === shape_ref.shape.value.shape query_map_of_string_list(param_value) else msg = "only map of string and string list supported" raise NotImplementedError, msg end when ListShape if StringShape === shape_ref.shape.member.shape list_of_strings(shape_ref.location_name, param_value) else msg = "Only list of strings supported, got " msg << shape_ref.shape.member.shape.class.name raise NotImplementedError, msg end else raise NotImplementedError # 🔥 end end`
再現コードを実行すると、👈 で指す値が TimestampShape となるが、 case 〜 when
で TimestampShape を扱わないので、🔥 で例外となる
テストすれば気がつきそうだが、: reponse_expires
を指定した場合のテストケースが無いので、ただ単に実装漏れなんじゃないか? という