aws-sdk-ruby Aws::S3::Object#presigned_ur のバグレポート

aws-sdk-rubyAws::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 でバグレポートを出した。

github.com

返信がついて「使い方は間違ってないね」とのことで、 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 を指定した場合のテストケースが無いので、ただ単に実装漏れなんじゃないか? という