URL query / repair handoff guide

URL queryの+・二重エンコード・同名keyを壊さず修正する

URLへ接続せず、修正前後のqueryを比較します。+%2B、同名key、#fragmentを別の境界として扱います。

+は空白とは限らない

form風の解析では裸の+が空白として扱われることがあります。値に文字としてのプラスを残すなら%2Bを使い、受け側の契約を確認します。URLSearchParamsの表示だけで意図を逆算しないでください。

q=a%2Bb       → literal plus: a+b
q=a+b         → form-style interpretation may be a b
q=a%252Bb     → double-encoded boundary; do not decode blindly
修正前修正後の方針判定
q=a%2Bb文字としての+を維持する。preserve-plus
q=a+b空白か文字+かを受け側へ確認する。confirm-space-or-plus
q=a%252Bb何段階エンコードされた値か確認してから直す。decode-depth-check

同名keyとfragmentを分ける

tag=a&tag=bのような同名keyは、勝手に最後の値だけへまとめません。順序と複数値を受け側の仕様へ渡します。#section以降はfragmentで、HTTP queryのkey=valueではありません。

境界確認すること
duplicate-keytag=a&tag=bを繰り返し値として保持し、順序を記録する。
fragment-boundary?より後のqueryと#より後のfragmentを別欄にする。
target URLこのガイドは対象URLへ接続せず、redirectやサーバー側の解釈を判定しない。

レビューケース

case判定確認
literal-pluspreserve-plus%2Bを文字のプラスとして保持する。
form-plus-spaceconfirm-space-or-plus裸の+を空白と解釈する契約か確認する。
double-encodingdecode-depth-check%252Bを一度に二段階復号しない。
duplicate-keypreserve-order同名keyの個数と順序を維持する。
fragment-boundarykeep-fragment-separatefragmentをqueryへ混ぜない。
target-or-unsupportedreject対象URLへの接続や曖昧な修正方針は差し戻す。

入力を送信しない

このガイドは対象URLへ接続せず、redirect・認証・サーバー側のquery解釈を確認しません。本番URL、token、cookie、個人情報を貼り付けず、無害な例で修正方針を共有してください。

既存のURL query builderを開く(入力と変換は端末内で完了します)。