Как установить заголовок типа контента для Ruby AWS SDK? - PullRequest
0 голосов
/ 02 июля 2019

Я использую Webmock для тестирования http-запросов, сделанных ruby ​​aws-sdk (в данном случае aws-sdk-batch).

Webmock обрабатывает запросы json с помощью гораздо более удобного diff хеша и частичное совпадение , когда запросы терпят неудачу, но это будет происходить только в том случае, если Content-Type заготовленного запроса application/json.

Однако гем aws-sdk-batch создает запрос с пустым Content-type ( несмотря на то, что задокументировал тип содержимого как application / json ) и, похоже, полагается на поведение конечной точки по умолчанию для интерпретации этого как application/json.

Я хотел бы вручнуюдобавьте заголовок Content-type: application/json, чтобы я мог извлечь выгоду из лучшей обработки Webmock тела запроса json.Возможно ли это?


Пример ответа Webmock без указания Content-Type:application/json:

     WebMock::NetConnectNotAllowedError:
       Real HTTP connections are disabled. Unregistered request: POST https://batch.us-east-1.amazonaws.com/v1/submitjob with body '{"jobName":"Fakie","jobQueue":"queue","jobDefinition":"def","parameters":{"task":"{\"fake\":\"town\"}"}}' with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'', 'Authorization'=>'AWS4-HMAC-SHA256 Credential=ACCESS_KEY_ID/20190701/us-east-1/batch/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=5f4bf85ba48333e6cda6ff613b4ea2faacd0417b4136621c58b87a488c3019ee', 'Content-Length'=>'106', 'Content-Type'=>'', 'Host'=>'batch.us-east-1.amazonaws.com', 'User-Agent'=>'aws-sdk-ruby3/3.54.2 ruby/2.5.5 x86_64-darwin18 aws-sdk-batch/1.20.0', 'X-Amz-Content-Sha256'=>'cf52595364d1a588b4ca4fdeaddb8170e4ad944fa28ac6df647484bb596de9c4', 'X-Amz-Date'=>'20190701T215756Z'}

       You can stub this request with the following snippet:

       stub_request(:post, "https://batch.us-east-1.amazonaws.com/v1/submitjob").
         with(
           body: "{\"jobName\":\"Fakie\",\"jobQueue\":\"quue\",\"jobDefinition\":\"def\",\"parameters\":{\"task\":\"{\\\"fake\\\":\\\"town\\\"}\"}}",
           headers: {
          'Accept'=>'*/*',
          'Accept-Encoding'=>'',
          'Authorization'=>'AWS4-HMAC-SHA256 Credential=ACCESS_KEY_ID/20190701/us-east-1/batch/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=5f4bf85ba48333e6cda6ff613b4ea2faacd0417b4136621c58b87a488c3019ee',
          'Content-Length'=>'106',
          'Content-Type'=>'',
          'Host'=>'batch.us-east-1.amazonaws.com',
          'User-Agent'=>'aws-sdk-ruby3/3.54.2 ruby/2.5.5 x86_64-darwin18 aws-sdk-batch/1.20.0',
          'X-Amz-Content-Sha256'=>'cf52595364d1a588b4ca4fdeaddb8170e4ad944fa28ac6df647484bb596de9c4',
          'X-Amz-Date'=>'20190701T215756Z'
           }).
         to_return(status: 200, body: "", headers: {})

       registered request stubs:

       stub_request(:post, "https://batch.us-east-1.amazonaws.com/v1/submitjob").
         with(
           body: {"jobDefinition"=>"def", "jobName"=>"Wrong", "jobQueue"=>"queue", "parameters"=>{"task"=>"{\"fake\":\"town\"}"}})

Как вы можете увидеть, когда эти тесты не пройдены для строк, у вас осталась мучительная задачавыбирая тело персонажа за персонажем, что является довольно ужасным опытом для разработчиков.Опыт Hashdiff намного выше.

1 Ответ

0 голосов
/ 02 июля 2019

Базовый http-клиент AWS SDK называется Seahorse и позволяет добавлять обработчики, которые изменяют поведение цепочки запросов.

Обработчик, который может добавлять заголовок Content-Type:application/json, выглядит следующим образом:

  class ContentType < Seahorse::Client::Plugin
    class Handler < Seahorse::Client::Handler
      def call(context)
        context.http_request.headers['Content-Type'] = 'application/json'
        @handler.call(context)
      end
    end
    handler(Handler, step: :sign, priority: 0)
  end

Затем его можно добавить в сервис AWS SDK, который наследуется от Seahorse:

Aws::Batch::Client.add_plugin(ContentType)

Теперь Webmock будет реагировать на такой сбой:

...
       registered request stubs:

       stub_request(:post, "https://batch.us-east-1.amazonaws.com/v1/submitjob").
         with(
           body: {"jobDefinition"=>"def", "jobName"=>"Wrong", "jobQueue"=>"queueName", "parameters"=>{"task"=>"{\"fake\":\"town\"}"}})

       Body diff:
        [["~", "jobName", "Fakie", "Wrong"]]
...