全2645文字
PR

 今月はRustにおける非同期処理を見ていこう。RustでWebアプリケーションを開発する際には、非同期処理は避けて通れない。

 ここではRustの非同期処理をHTTPサーバーの開発を通して学んでいく。まず、同期的に動作するサーバーを実装する。その後、いくつかのRustの機能を利用して非同期で動作するサーバーを実装してみる。実際に手を動かすことで、Web開発の基本であるHTTPサーバーの仕組みと非同期処理の基礎を同時に学ぶことができる。

 なお、完成するサーバーは実装を簡略化しているため、機能やセキュリティーの面で実用には向かない。特に、致命的なセキュリティーホールがいくつも存在するので、くれぐれもインターネットに公開してはならない。前もって注意しておく。

HTTPサーバーをRustで実装する

 今回、RustでつくるHTTPサーバーはとても単純だ。サーバーにアクセスすると、Webページである「index.html」の内容を返すだけのものになっている。

HTTPサーバーの一般的な処理手順を知る

 HTTPサーバーがどのような処理を行っているかを、まず簡単に整理しておこう。HTTP処理の核になるのが「HTTPリクエスト」と「HTTPレスポンス」の2つだ。

 HTTPリクエストは、WebブラウザーやcURL(curlコマンド)などのクライアントが送信するものだ。HTTPサーバーは、HTTPの形式に沿って記述されたリクエストを受け取ると、リクエストをパースして必要な情報を取り出す。そして、リクエストの内容に応じた処理を行う。

 リクエストを処理した後、HTTPサーバーはHTTPレスポンスを返す。レスポンスには、処理が正常に進んだのか異常終了したのかといった情報や、クライアントが要求するHTMLページの内容などが含まれている。

 どのようなやり取りが行われるかは、curlコマンドを使って確認できる。curlで-v(もしくは--verbose)オプションを指定することで、実際のリクエストやレスポンスを可視化できる。次に示すのは、これから実装するHTTPサーバーにcurlでリクエストを送信してみた例だ。

❯ curl localhost:9999/ -v
*   Trying 127.0.0.1:9999...
* Connected to localhost (127.0.0.1) port 9999 (#0)
> GET / HTTP/1.1
> Host: localhost:9999
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 194
< Content-Type: text/html; charset=UTF-8
<
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <title>サンプルページ</title>
</head>

<body>
  <h1>ご挨拶</h1>
  <p>こんにちは、Rust!</p>
</body>

</html>
* Connection #0 to host localhost left intact