この記事はkdnaktの1人 Advent Calendar 2020の25日目の記事です(2日遅れ)。
1人アドベントカレンダーのまとめとして、振り返りをします。
[プロジェクトの振り返り]
▼やったこと
2日目に考えたスコープを元に振り返ってみます。
- ◎ 起動すると、localhostの固定のポートでHTTPリクエストを待ち受ける
- ○ GETリクエストに対応する
- △ POSTリクエストに対応する
- × その他のHTTPリクエストに対応する
- ○ publicディレクトリより上の階層へのリクエストは403を返す
- × リクエストをブロックしない(マルチスレッド)
- × httpd.confに対応する
- ○ アクセスログを書き出す
- × Cookieに対応する
- × Basic認証に対応する
- × Keep-Aliveする
- × HTTP Cacheする
- × SSL/TLSに対応する
- × WebSocketに対応する
- × HTTP/2に対応する
- × HTTP/3に対応する
プロジェクトのスコープをほとんど達成できていません。
とはいえ、そもそもKotlinとKotlin/Nativeの違いをほとんど理解していないところから始めた割には、一応形になったので結果オーライです。
それぞれの記事のタイトルをもとにやったことを振り返ってみます。
- 1日目:プロジェクトに取り組む理由
- 2日目:プロジェクトのスコープを考える
- 3日目:GradleでHello Kotlin/Native
- 4日目:Kotlinプロジェクトの.gitignore
- 5日目:パッケージ分割
- 6日目:Kotlin/Native
- 7日目:Native echo server
- 8日目:リクエストをログに残す
- 9日目:テスト
- 10日目:HTTPリクエストの仕様
- 11日目:テストレポート
- 12日目:start-lineをパースする
- 13日目:例外をテストする
- 14日目:モックレスポンスを返す
- 15日目:ファイル読込
- 16日目:ノンブロッキングI/O
- 17日目:ディレクトリトラバーサル対策
- 18日目:パーセントエンコーディング
- 19日目:リクエストヘッダー
- 20日目:ポート番号変更
- 21日目:httpieでE2Eテスト
- 22日目:POSTリクエスト
- 23日目:kotlinx-datetime
- 24日目:アクセスログファイル
- 25日目:振り返り
こうしてみると、いろいろなことをやったな、と思います。HTTPサーバーとして、プロダクトの完成度は低いものの、今回のプロジェクトを通してさまざまなことを学べました。
▼わかったこと
そもそもプロジェクトを開始した時点では、gradleをほとんど使ったことがなかったので、プロジェクトを作成する方法やビルド、テストの実行コマンドも知りませんでした。
KotlinとKotlin/Nativeの違い、Kotlin/Nativeでのファイル入出力や文字列操作などの実装、HTTPリクエストやレスポンスなどHTTPメッセージの仕様、gradleでライブラリを追加する方法、シェルスクリプトでE2Eテストを実装する方法、などなど。
1人アドベントカレンダーである以上1人ですべてを実装する必要があったので、思っていたより多くのことにチャレンジして、多くの学びを得ました。
ただ、1人ですべてを進めた結果、自分の基礎的なプログラムの理解度の低さやプロジェクトの進捗を生み出すための限界なども思い知ることとなりました。
とくに、Kotlin/Nativeに限らずですが、並列処理まわりの理解があやふやであるため、HTTPサーバーをリクエストをブロックしないような実装を完了できませんでした。
▼次にやること
プロジェクトのスコープとして、並列処理対応やhttpd.confファイルでの設定機能など、元々目指していた部分があるので、2021年はそれらの機能を追加していきたいと思います。また、main.ktあたりのコードがかなり汚くなってしまったので、リファクタリングも進めていきたいです。
ある程度形になったら、文章を整理しなおして、技術書典とかに出せたらいいな……。
終わってみると疲労感たっぷりの1人アドベントカレンダーでしたが、良い点がたくさんあったので、しっかりと事前準備を済ませた上で、2021年も何か書きたいと思います。
[まとめ]
- 1人で雑にKotlin/NativeでHTTPサーバーを実装した
- 実装したコードは以下のリポジトリにまとめてある