◆ ある URL へのアクセスをローカルホストとかに置き換えれる
◆ URL から取得できるデータを自分でデータ用意して その場合の結果を確認できる

ある URL にアクセスしたときのレスポンスを好きに置き換えたいです
ブラウザなら拡張機能を作って webRequest の機能でリダイレクトすればいいのですが 任意のプログラム中からとなるとプロキシを用意したり複雑になりそうです
しかも https だと暗号化されてるからプロキシサーバで改変できない気がします

目的はライブラリの動きの確認です
あるライブラリがネット上の API からデータ取得して それをもとに色々フォーマットしてデータを渡してくれます
ライブラリが API から受け取るデータがめったにないタイプのデータになっていた場合 ライブラリが返すデータが予想外のものになってました
それをちゃんと確認したいのですが めったにないものだからかドキュメントにもなくて ソース見た感じこういうのになりそう……というのはあるのですがやっぱり実際に動かして結果を確認しておきたいところです

最初はライブラリのソースから URL を書き換えようと考えたのですが 単純に URL 書いてるものじゃなくて条件によって分かれたり 文字列を結合してたりで簡単に置き換えはできなそうでした
URL はそのままで PC がその URL をローカルホストかネットワーク内のどこかとみなしてほしいなぁ と考えてたら hosts ファイルを思いつきました

普段 hosts ファイルは ローカルのネットワーク内へのアクセスで IP アドレスじゃわかりづらいし覚えられないので OS 名とかでアクセスできるようにしていて そういう用途としか思ってませんでした

192.168.1.22    fedora
192.168.1.23 centos
192.168.1.24 win10note

みたいな感じに書いておけば http://fedora にアクセスすれば 192.168.1.22 の IP アドレスの端末へ http でアクセスできるので便利です

普通 fedora とか centos って書いてるところは 実在するドメインと被るとそこへアクセスできなくなるので . なしにしたりしてますが あえて被せれば yahoo とか google へのアクセスもローカルネットワーク内の IP アドレスにアクセスさせれたりします

というわけで hosts にダミーサーバの IP アドレスとアクセスする API のドメインを書いて無事ダミーサーバにアクセスさせることができました
ダミーサーバではこういう感じでライブラリに取得してほしいデータを返す単純なものです

require("http").createServer((req, res) => {
res.end(JSON.stringify({dummy: true}))
}).listen(80)

どのパスにアクセスするか考えず 固定レスポンスなら PHP とかより Node.js が楽ですね


ちなみにライブラリがアクセスする API の URL が https の場合はダミーサーバで証明書エラーになります
これを無視しないとエラーになるので無視させる必要があります
ライブラリ内で完結してる https 通信のオプションに証明書エラーを無視する設定を追加するのはちょっと面倒です

Node.js の場合は環境変数に設定しておけば全体で無視させることができます
ライブラリを使うプロセスのエントリポイントあたりに一時的にこういうの書きます

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0

これで証明書エラーは無視できます
セキュリティレベルは落ちるので 試し終わったらちゃんと消しましょう