🐕

[備忘録13]作って学ぶブラウザのしくみ / HTTPを実装する/ HTTPクライアントの実装

2025/01/02に公開

以下のような簡単なリクエストを送信し、サーバからのレスポンスを受け取ることができるHTTPクライアントを実装する

GET / HTTP/1.1
Host: exapmle.com

ネットワークに関するライブラリはWasabiOSリポジトリのnoliディレクトリ以下に存在する。

サブプロジェクトの作成

実装はnetディレクトリ以下で行う。
[作業]
netディレクトリ以下で、cargo newコマンドを使用し、wasabiプロジェクトを作成する。
この時 --libオプションをつけてライブラリクレートとして作成することに注意する。

mkdir net
cd net
cargo new wasabi --lib

[なぜsaba-coreディレクトリと分けているのか]

動かす対象のプラットフォームによって実装を変えたいから。
WasabiOS上ではnet/wasabiのプロジェクトを使用し、標準ライブラリの存在するlinuxやmacの上で動かしたいときは新しいプロジェクトを追加できる。
LinuxやMacのプラットフォームで動かしたいときはnet/stdの実装を使用できる。

サブプロジェクトのCargo.tomlの変更

net/wasabiサブプロジェクトのCargo.tomlを変更して、第2章で実装したcoreプロジェクトとWasabiOSに実装あれているnoliライブラリを依存先として追加する。

rootディレクトリのCargo.tomlファイルを以下のようにする

workspace = { members = [ "net/wasabi","saba_core"] } 
[package]
authors = ["tommyAki]
name = "saba"
version = "0.1.0"
edition = "2021"
default-run = "saba"

[features] #Rustのfeatures機能を表す。Rustプロジェクトで条件付きコンパイルや依存関係の切り替えを行うためのメカニズム。
default = ["wasabi"]
wasabi = ["dep:net_wasabi", "dep:noli"]// cargoコマンドを使うときに --features=wasabiのように指定できる。

[[bin]] #バイナリターゲット
name = "saba"
path = "src/main.rs"
required-features = ["wasabi"] #このバイナリは[features]>wasabiが設定されているときにしか生成されない。

[dependencies]
saba_core = {path = "./saba_core"}
net_wasabi = {path = "./net/wasabi", optional = true}
noli = { git = "https://github.com/hikalium/wasabi.git", branch = "for_saba", optional = true }

バイナリターゲットの設定

上記のCargo.tomlファイルでの[[bin]]ディレクティブでは実行可能なバイナリを定義できます。
今回はsabaというバイナリファイルを作成し、メイン関数を含むファイルへのパスがsrc/ain.rsである。

リクエストの構築

HTTPリクエストを扱うために、http.rsを作成する

touch net/wasabi/src/http.rs

lib.rsを変更して以下を追加する

#![no_std]
pub mod http;

httpClientの作成

先ほど作成したhttp.rsファイルに、httpリクエスト、httpレスポンスを扱うHttpClient構造体を定義する。

pub struct HttpClient {}

impl HttpClient {
    pub fn new() -> Self {
        Self{}
    }
}

Discussion