スポンサーリンク
最近APIを扱うことが多くなり、curlコマンドを多用するようになりました。
昔(5年くらい前)はCLIのhttpクライアントと言えばwgetのほうが一般的だった気がするのですが、ここ最近ではすっかりcurlが定着した気がします。
さて、そんなcurlを使っていた時にあるエラーで困ってしまったのでメモしておきます。
APIとは?をざっくり説明します
Pythonで書ける検証自動化:RobotFrameworkとは
curlを使ってシェルスクリプトを書いた時のことです。リダイレクトの処理をさせる必要があったのですが、リダイレクト先ではHTTPメソッドを変えたいため、自分でURLを変数に入れ、複数回curlを実行するようなスクリプトを書きました。
つまり、こんな感じです
# リダイレクト元へのcurl。${REDIRECT_URL}にリダイレクト先が格納される
REDIRECT_URL=`curl -D - -X POST -d "username=${USERNAME}" -d "password=${PASSWORD}" 'https://example.com/login' | awk '$1~/^Location/{print $2}'`
# リダイレクト先へのcurl
curl -X GET "${REDIRECT_URL}"
これを実行すると、以下のようなエラーが出ました。
# curl -X GET "${REDIRECT_URL}"
curl: (3) Illegal characters found in URL
ちなみにこの時、${REDIRECT_URL}には以下のような文字列が格納されています。
# echo ${REDIRECT_URL}
https://example.com/auth/authorize?client_id=client&response_type=code+id_token&redirect_uri=https://example2.com/callback&state=abcdefghijk&scope=openid&nonce=ef123456789
確かに怪しい文字がいっぱい入ってはいますが、ちゃんとダブルクオーテーションでくくっているし、何が問題なんだろう?と小一時間悩みました。
結論から言うと、末尾に改行が入っていたのが問題でした。
そして以下のように修正することで正しく動作しました。
curl -X GET "${REDIRECT_URL%$'\r'}"
上記の *%$'\r' * という部分でbashの変数展開の時に末尾の'\r'を削除しています。
なかなか該当の情報が出てこず苦労しました。。
スポンサーリンク