DropboxにAPI2を使いファイルのアップロードをしたいので下記のcurlコマンドでファイルが正常にアップロードされるのを確認しました。

curl -X POST https://content.dropboxapi.com/2/files/upload \
    --header "Authorization: Bearer $access_token" \
    --header "Content-Type: application/octet-stream" \
    --header "Dropbox-API-Arg: {\"path\": \"test.txt\", \"mode\": \"overwrite\"}" \
--data-binary @foo.txt

これをRubyのコードにおき変えるために

access_token = ENV['DROPBOX_ACCESS_TOKEN']
uri = URI.parse('https://content.dropboxapi.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new("2/files/upload")
request.add_field('Authorization', "Bearer #{access_token}")
request.add_field('Content-Type', 'application/octet-stream')
request.add_field('Dropbox-API-Arg', {path: '/test.txt', mode: 'overwrite'})
request.body = File.read('foo.txt')
http.request(request)

としたのですが #<Net::HTTPBadRequest 400 Bad Request readbody=true>になってしまいました。

400エラーだけでは原因をどのように特定していけばよいのかわからないのですが、このような場合どのようにエラーを取り除けば良いのでしょうか?