denoでHTTPクライアントを実装した
これはDenoのdial(tcpストリーム)ベースのHTTPクライアントです
denoにはfetch以外のhttp通信を行うモジュールがないので作ってみた
fetchはそれなりに便利だと思うけど、あくまで仕様がブラウザベースなので、thunk in denoではない
denoでfetchを実装したときにそういうことを悶々と思っていて、denoだったらもっとシンプルにhttpクライアント書けるぞ!との強い思いが交錯してdeno-fetchはdeno-requestベースのモジュールになり申した どういうことか?
fetchを実装しているとき、fetchの実装はほとんどbodyの処理だということに気がついた
http通信を行う部分は、かなり薄くシンプルな実装に落とし込めることを実感したので、その部分をまるごとdeno-requestの方に移送した
deno-requestにはhttp通信を行う上でコアとなる重要なモジュールがいくつか実装されている
これらを組み合わせると、http通信を行う上でかなり楽になるとおもう
それらのいくつかを紹介していくぜェーーー!
export type HttpRequest = {
method: string;
url: string;
headers?: Headers;
body?: Reader;
bodySize?: number;
basicAuth?: {
username: string;
password: string;
};
};
export async function writeHttpRequest(w: Writer, opts: HttpRequest) {
...
}
まずはhttpのリクエストをwriteする部分の処理
httpは突き詰めればファイルIOなので、特化は不要で、WriterとReaderだけいればいい
httpのRequestパラメタをシリアライズしてwriterに書き込む。以上。シンプルでふつくしい…
bodyは当然Reader。読み出して書き込むことしかしない。
export type HttpResponse = {
status: number;
statusText: string;
headers: Headers;
body: Reader & Closer;
};
export async function readHttpResponse(
r: Reader,
c?: Closer
): Promise<HttpResponse> {