curlからJavaScriptへの一方向変換と処理上限
本ツールは,入力されたcurlコマンドからブラウザ向けFetch APIまたはAxios用のJavaScriptコードを作る一方向の変換ツールです.画面にはcurlコマンドの入力欄と生成コードの出力欄があり,出力はFetch APIとAxiosの二つのタブで切り替えられます.
サンプルボタンでは,POSTメソッド,Content-TypeとAuthorizationヘッダー,JSON文字列の本文を含む例を入力できます.curlコマンドからJavaScriptのFetchまたはAxiosコードへの一方向の変換のみを提供しており,逆変換には対応していません.
入力すると,対応する引数からURL,HTTPメソッド,ヘッダー,本文を抽出し,二種類の編集用テンプレートをまとめて生成します.ここで作るのはコード文字列であり,入力したcurlコマンドの実行,生成コードの実行,指定URLへのHTTP通信,APIの疎通確認は行いません.出力は完成済みの通信処理ではなく,利用するブラウザやNode.js等の環境,対象APIの仕様に合わせて人が調整する出発点です.
本ツール固有の上限として,入力は200,000文字,解析後のトークンは10,000個,ヘッダーは100件までです.生成するFetchコードとAxiosコードは,それぞれ500,000文字までに制限しています.いずれかを超えた場合は,内容の一部だけを変換したり切り捨てたりせず,エラーを表示して出力を空にします.
これらはcurl,Fetch API,Axios,JavaScript全般の仕様上限ではなく,本ページの同期処理と画面表示のために設けた製品上限です.上限以内であっても,長い入力では端末性能に応じて入力や画面更新が重くなる可能性があります.
限定トークナイザーと対応する引数
curlコマンドは通常シェル環境で実行されますが,Bash,zsh,PowerShell,cmd.exe等では引用符,変数展開,エスケープの規則が異なります.本ツールは完全なシェル構文解析器ではなく,入力NUL文字を拒否したうえで,変換に必要な規則に絞った独自トークナイザーを用います.
ASCII空白文字(スペースやタブ等)を引数の境界とし,単一引用符や二重引用符,隣接する引用片で囲まれた内部の空白や改行は同一値の一部として保持します.単一引用符内ではバックスラッシュもすべて通常の文字リテラルとして扱います.二重引用符内では,ドル記号($),バッククォート(`),二重引用符("),バックスラッシュ(\),改行(LF/CRLF)の直前にあるバックスラッシュだけを取り除き,それ以外の通常文字の前のバックスラッシュはそのまま維持します.
非引用部の単独バックスラッシュは直後の文字をエスケープし,行末バックスラッシュに続く改行(LF,CRLF,CR)は行継続として除去します.
空の引用文字列や空引数はそのまま空の値として認識されるため,データ引数へ空文字を明示的に渡すことも可能です.一方,末尾まで単一引用符や二重引用符が閉じられていない場合や,末尾バックスラッシュの直後に文字が存在しない不完全な入力は,問題位置を示すエラーで処理を中断します.
本ツールはPOSIXやBash,PowerShell等のシェル変数($var),コマンド置換($(...),...),ANSI-C引用($'...'),未引用のシェル演算子やリダイレクト(|,&&,>等),パス名グロブ,ブレース展開,チルダ展開,コメント,複数コマンドを一切解釈・展開せず拒否します.
引用やエスケープによりリテラル化された記号は引数文字列として受け入れられますが,curl独自のURLグロブ({}や[])は,有効なIPv6ホスト指定を除きURL側で拒否されます.
コマンド列の先頭引数には必ずcurlが必要です.対応するオプションは,HTTPメソッドを指定する -X と --request,ヘッダーを指定する -H と --header,送信データを指定する -d,--data,--data-raw,--data-binary,そしてBasic認証を指定する -u と --user のみに限定されます.
すべてのオプションは引数と値を空白で分離する形式のみを受理し,-XPOST や --data=value のような結合形式,-L や -s 等の未知・非対応オプション,値が欠落したオプションは推測で補正せず即座にエラーとなります.また,引数列からURLらしい単語を勝手に探索して採用したり,URL未指定時に補完用の仮URLを自動生成したりすることもありません.
URL,メソッド,ヘッダー,本文とBasic認証
URLはhttpまたはhttpsで始まる絶対URLを1つだけ指定できます.URLが存在しない場合,複数のURLや余分な位置引数がある場合,ftp等の非対応スキームが指定された場合は停止します.URL内部に認証情報を含める形式(user:pass@)も受け付けず,Basic認証オプション(-u)の利用を案内します.
URLに含まれる生の空白,制御文字,バックスラッシュ,およびURLグロブ記法({}や[])は,正当なIPv6アドレス表記を除き拒否されます.入力URLはJavaScript文字列として安全に埋め込まれますが,パスやクエリを分解・再構成するような推測処理は行いません.
HTTPメソッドは,-Xまたは--requestで指定します.Fetch仕様において大文字へ自動正規化される標準的な6種類のメソッドは,DELETE,GET,HEAD,OPTIONS,POST,PUTです.PATCHは正規化対象の6種類には含まれません(大文字のPATCHは問題なく受け入れられますが,小文字のpatchなど非大文字の指定はFetch側では元の表記がそのまま保持される一方,Axios側では非対応メソッドのエラーとなります).
その他の有効な独自カスタムメソッドも大文字小文字の指定がそのまま保持されます.ただし,セキュリティ上危険なCONNECT,TRACE,TRACKは指定できません.メソッドの指定がなく本文データが存在する場合は,curlの標準仕様に沿って自動的にPOSTを採用します.
なお,-X GETや-X HEADと本文を同時に指定した場合は,ブラウザFetchがGET/HEADリクエストに本文を設定できないため,勝手にPOSTへ変更せず不整合エラーとして停止します.また,小文字等を含む非大文字の独自メソッドはFetchでは保持されて有効なコードを出力しますが,Axios側では非対応エラーとしてAxios出力欄のみを空表示にし,勝手な大文字化等の推測は行いません(Fetch側の有効な出力は維持されます).
ヘッダー(-H,--header)はコロンを境に分離し,ヘッダー名はトリム前の生文字列が有効なASCII HTTPトークン(コロン直前の空白は無効)であることを検査します.ヘッダー値はHTABやスペースのトリム前に生文字列を厳密に検証し,CRLF,NUL,制御文字,およびByteStringの255(ISO-8859-1範囲外)を超える文字を拒否します(水平タブHTABのみ許容).
重複ヘッダーは大小文字を区別せずすべて拒否し,上書きや結合は行いません.コロンのみの削除形式(例:-H "Host:")やセミコロン形式(例:-H "Header;")も非対応です.Fetchヘッダーは実行環境間での__proto__欠落を防ぐため[名前, 値]ペアの配列形式とし,Axiosは計算されたJSON文字列キーのオブジェクトとします(ブラウザやライブラリの実送信や完全なセキュリティを万全に保証するものではありません).
件数はContent-Typeを含め最大100件に制限されます.
本文(リクエストボディ)の指定は,コマンド全体で1つのみ許可されます.curlのように複数のデータ引数をアンパサンド等で暗黙連結する処理は行わないため,2つ目以降の本文引数を検出した時点で停止します.-d,--data,--data-binaryで値が@で始まる場合,ファイル参照や標準入力(@-)を意味し得るためエラーとして拒否しますが,--data-rawでは先頭の@もリテラル文字列として安全に保持されます.
本文文字列はJSON構文解析やフォームエンコード等を行わず,指定された入力文字列(空白,改行,重複キー,大きな整数等)をそのまま完全に維持します.また,いずれのデータオプションであっても,明示的なContent-Typeヘッダーが指定されていない場合は「application/x-www-form-urlencoded」を暗黙に補完します.
明示的なヘッダー指定が存在すればそれが最優先され,本文の見た目からJSON形式を自動判別することはありません.
-uまたは--userは「ユーザー名:パスワード」の形式を必要とし,最初のコロンのみを境界として解釈するため,パスワード文字列内にコロンが含まれていても正常に処理されます.値は印刷可能なASCII文字のみに限定されており,非ASCII文字,コロンのない値,あるいは-Hで別途Authorizationヘッダーが同時指定された場合は,認証情報を暗黙に破棄・上書きせずエラーで停止します.
文字コード推測を伴うUTF-8 Basic認証の機能追加は行わず,Digest認証やBearerトークン等へ推測・読み替えを行うこともありません.
JavaScript文字列と二種類の生成コード
URL,HTTPメソッド,ヘッダー名,ヘッダー値,本文をコード内へ展開する際は,すべてJSON.stringify相当の文字列リテラル変換を用います.二重引用符,バックスラッシュ,改行等は安全なエスケープシーケンスへ変換され,JavaScriptコードの構文区切りとして解釈される脆弱性を防ぎます.
ヘッダー出力において,Fetchは実行環境での__proto__欠落を防ぐ[名前, 値]ペアの配列形式を採用し,Axiosでは引用符付きの計算されたプロパティ名(computed property name)を用いたオブジェクトとして展開するため,ハイフンや予約語を含む名前でも構文エラーを起こさず出力されます.
本文データは,一見してJSON形式に見える場合であってもJSON.parse等によるオブジェクト化を行わず,入力された文字列そのものを厳密に維持します.これにより,9007199254740993のようなJavaScriptの安全な整数範囲を超える大きな数値,同一キーの重複,意図的なインデントや改行,数値のゼロ埋め表記などが,構文解析によって別の値や形式に書き換わる事故を防止します.
なお,JSON構文の妥当性や,Content-Typeと本文内容が合致しているか,あるいは正しいフォーム形式であるかの検証は行いません.必要に応じて構文チェッカー等を用いて事前に確認してください.
Fetch出力では,URL定数とoptionsオブジェクトを定義し,method,headers,および本文が存在する場合のbodyを設定します.応答処理の雛形では,HTTPステータスが204,205,またはHEADリクエストである場合は本文なし(null)として扱い,それ以外の応答ではまずテキストとして取得します.
ヘッダーのContent-Typeに「json」が含まれ,かつ本文が空でない場合にのみJSON.parseを試行し,構文解析に失敗した場合は未加工の元テキストへフォールバックします.また,response.okがfalseの場合はステータスコードを含むエラーをスローします.
これらは標準的な編集用雛形であり,ストリーミング処理,ファイルダウンロード,特定APIのエラー応答構造等には利用者側での実装追記が必要です.
Axios出力では,axiosをimportし,method,url,headers,dataから構成される設定オブジェクトを作成してaxios(config)を実行し,response.dataを処理する雛形を生成します.本文が存在する場合は,Axiosによる暗黙の文字列トリムや自動JSONシリアライズを回避するため,恒等変換を行うtransformRequest設定([(data) => data])を含めます.
ただし,最終的なresponse.dataはAxios自身の変換機能によるものであり,Fetchの応答処理と完全に同一のデータ構造になるわけではありません.また,Axiosの利用先プロジェクトには別途axiosパッケージの導入が必須です.
画面上のコピーボタンをクリックすると,クリップボードへの書き込み処理が実行されます.遅延したコピー処理の完了通知が現在の画面表示を誤って上書きしないよう保護されており,コピー処理中に入力が編集されたり,タブが切り替えられたり,内容がクリアされた場合は,生成された出力文字列が同一であってもコピー成功の表示は直ちにリセットされます.
クリップボードAPIの権限拒否や処理失敗時には,出力欄を選択して手動でコピーする案内が表示されます.コピーが正常に完了した際の成功表示は約2秒後に自動的に消去されますが,ユーザーが入力を変更したりタブを切り替えたり内容をクリアした場合は,2秒を待たずに即座にリセットされます.
curlとブラウザFetch・Axiosの実行環境差
生成コードはcurlコマンドの一部をJavaScriptの設定へ写すテンプレートであり,実行結果の同一性を保証しません.大きな差の一つがCORSです.curlはブラウザの同一オリジンポリシーによる制限を受けませんが,ブラウザから別オリジンへFetchやAxiosで接続すると,単純リクエストの条件やプリフライト,応答側のAccess-Control-Allow-Origin等に左右されます.
curlで成功したURLでも,サーバー側の許可がなければブラウザのJavaScriptから応答を利用できない場合があります.
ブラウザはCookieや認証情報をcredentials設定とオリジン条件に基づいて扱います.Host,Content-Length,Cookie,Connection等,JavaScriptから自由に設定できない禁止・制御対象のリクエストヘッダーもあります.
本ツールは入力されたヘッダーをテンプレートへ文字列として写しますが,ブラウザが実際に送信することまでは保証しません.Cookieの保存,リダイレクト追従,Accept-Encoding,圧縮,TLS証明書,クライアント証明書,プロキシ,名前解決,HTTP版等もcurlとブラウザでは制御できる範囲が異なります.
Axiosはブラウザで使う場合とNode.jsで使う場合で通信層が異なり,CORSの有無や利用可能な設定も変わります.生成コードは実行環境を自動判定せず,共通するconfigの形を提示するだけです.実行前に,対象APIの仕様,必要な認証方法,Content-Type,Cookie方針,CORS設定,リダイレクト,タイムアウト,応答形式を確認してください.
非対応のcurlオプションを削除して意味を失わせるのではなく,必要な設定を利用先で明示的に実装することが重要です.
同期変換,エラー表示と安全な利用手順
入力欄の文字列が変更されると,トークン化,構文検査,リクエスト構造の構築,FetchコードおよびAxiosコードの生成が一括して同期的に実行されます.両方のコードは同時に生成されており,タブの切り替えは生成済みの結果の表示を切り替えるだけにすぎません.Web Worker,処理期限(deadline),ストリーム,デバウンス,サーバー側での変換処理などは一切使用していません.
ただし,小文字等を含む非標準メソッドが指定された場合のみ,Axios側だけに個別エラーを表示して出力を停止し,Fetch側の正常なコード生成はそのまま維持されます.構文エラーや未対応オプション,上限超過を検出した場合は,直前の古い出力を残さず即座に消去し,入力欄と紐づいた明確なエラーを表示します.
本ツールには動作の安定性を保つための上限が設定されています.入力は最大200,000コード単位(UTF-16),トークン数は最大10,000個,ヘッダー数は暗黙のContent-Typeを含めて最大100件,生成されるFetchおよびAxiosコードはそれぞれ最大500,000コード単位までに制限されています.
入力文字数や上限情報はリアルタイムに画面へ表示され,支援技術向けに適切なARIA属性が付与されます.解析エラーは強いライブ通知,コピー結果は通常の通知として扱われます.コピー成功表示は約2秒後に自動的に消去されるほか,遅延した完了通知による上書きを防ぐ仕組みにより,入力の変更,タブの切り替え,クリア操作が行われた際には,出力文字列が同一であっても直ちに初期状態へとリセットされます.
APIキー,Bearerトークン,パスワード,個人情報などを含むcurlコマンドを入力した場合,それらの機密情報は生成コード内にもリテラル文字列としてそのまま出力されます.本ツールはローカルブラウザ上での文字列変換とコピー操作を提供しますが,ブラウザ拡張機能,OSのクリップボード履歴,画面共有,保存先リポジトリ等を含めた全体的な機密性を保証するものではありません.
認証情報を含むリクエストを変換する際は,本番の秘密情報をあらかじめダミー値に置き換えて変換を行い,生成コードを利用先に配置した後に環境変数やシークレット管理システムから読み込む構成に改めることを強く推奨します.
生成されたFetchおよびAxiosのコードは,curlコマンドの構造をJavaScriptの編集用雛形へ写したものであり,元のcurlコマンドとの完全なネットワーク動作同等性や,安全性,実行性能,全ブラウザでの動作を保証するものではありません.特にブラウザFetchにおける同一オリジンポリシー(CORS),ブラウザが送信を制限する禁止リクエストヘッダー(HostやCookie等),Cookie送信ポリシー,リダイレクト追従,アダプターの相違,応答形式の差異は,必ず利用先の実行環境において人間が仕様を確認し,テストを行う必要があります.
本ツールの役割は定型的なコード記述を補助することであり,通信の最終判断と検証は利用者の責任で行われます.