HTTPサーバーの実装 | 42Tokyo Webserv

# はじめに
42Tokyoの課題で簡易的なHTTPサーバーをC++で実装しました。
HTTPサーバー自体や、実装についての解説は他の記事の方が素晴らしいと思いますので、この記事ではおすすめのサイトや本についてまとめていきます。

技術的な説明はほぼゼロですが、何から始めたら良いか分からない方などの参考になればと思います。

42Tokyoについて

https://42tokyo.jp/

# おすすめのサイトなど

## HTTP全般
HTTPについて幅広く、無料で学べる。大体のことはまとめてある。

https://developer.mozilla.org/ja/docs/Web/HTTP/Overview

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

本当に何も分からない人はこの本から始めるのがおすすめ

https://www.shoeisha.co.jp/book/detail/9784798126258

**RFC**（インターネット技術の標準的な仕様を記した文書）
HTTPの仕様についてまとめられています。基本的には日本語訳のものを読んで、解釈が分かりづらいと思ったら英語で読むくらいの感じで使いました。
私は所々しか読んでいません。

https://triple-underscore.github.io/http1-ja.html


## Config
nginxのconfigはあくまで一例なので、自由に決めていいと思います。
ただ、勉強しておくと今後やInceptionで役立つかもしれません。

- [nginx Beginner’s Guide](https://nginx.org/en/docs/beginners_guide.html)
- [3.1 Nginxの基本構文](http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/node16.html)

## CGI
担当では無いのであまり詳しくはないのですが、以下のようなサイトが参考になりそうです。

- [RFC 3875 - The Common Gateway Interface (CGI) Version 1.1 日本語訳](https://tex2e.github.io/rfc-translater/html/rfc3875.html)

- 筑波大学講義
  - [システムプログラム（第9回）: ＷＷＷプログラミング](https://www.coins.tsukuba.ac.jp/~syspro/2016/2016-06-15/index.html)
  - [システムプログラム（第9回）: Web CGI プログラミング(1)](https://www.coins.tsukuba.ac.jp/~syspro/2022/2022-07-20/index.html)
  - [システムプログラム（第10回）: Web CGI プログラミング(2)](https://www.coins.tsukuba.ac.jp/~syspro/2022/2022-07-27/index.html)

- [CGIの仕様 - とほほのWWW入門](https://www.tohoho-web.com/wwwcgi3.htm)

## autoindex

https://qiita.com/U_mfunyu/items/dc4d76603a8e8f36ed92

## 実装
 
C言語の簡易的なHTTPサーバー実装例が載っている。42Tokyoで使うシステムコールの使い方が幅広くのっているので他の課題などにもおすすめ

 https://www.sbcr.jp/product/4797386479/

C言語でのソケットプログラミングについてまとめられている。初心者にわかりやすい。

https://www.ohmsha.co.jp/book/9784274065194/

友人に見せてもらいましたが、分厚くて全て読むのは大変です。コードは読みづらいですが、詳細に書かれています。

https://www.hanmoto.com/bd/isbn/9784894710412

**おすすめ**です。大体の実装の流れがわかります。

https://qiita.com/hayashier/items/73168c08451896914da5

## curl・telnet
テストするのによく使うコマンド２つです。これらを見ればだいたいの使い方はわかると思います。

https://www.wakuwakubank.com/posts/800-linux-network-curl/

https://qiita.com/takayukioda/items/edf371b3566bea64d046

https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9

https://qiita.com/honeycom/items/d44590dd27d5dccb4b5a


## python requests
毎回curlやtelnetを使うのはめんどくさいので、pythonのrequestsライブラリを活用するといいと思います。
使い方はかなり簡単です。

- [Requests: HTTP for Humans™ — Requests 2.31.0 documentation](https://requests.readthedocs.io/en/latest/)
- [【Python Requests】使用方法まとめ – get、post、put、delete、例外処理、Basic認証まで網羅 –｜Zero-Cheese](https://zero-cheese.com/9053/)

## Test
Google Testを初期に導入しましたが、１人しか使っていなかったので結局最初しか使いませんでした。。。
テストは工夫して活用していくべきだと思います。

- [Google Testを導入してみた #C++ - Qiita](https://qiita.com/y-vectorfield/items/6238cfd2d9c34aefe364)

また、上記のpython requestsやshell scriptを使用して、簡単なテストはすぐに実行できるようにしていました。

## 生徒ブログ
実装について書かれている42生徒ブログは検索すればすぐに出てきます。

# 課題について
subjectやレビュー項目で曖昧な部分はディフェンスを用意しておけば、ある程度自由にやっていいと思います。
曖昧な部分は自分たちで決めることも多かったです。
RFCやnginxに縛られすぎず、必要最低限の項目だけは満たすように進めました。

私達は実装しながら、対応しなければいけないことを学んでいった感じなので、修正が大変でした。
実際にnginxを動かしたり、一通り学んでからしっかり方針を立てて実装に取り組んだほうが良いと思います。

# 最後に
最後まで読んでいただきありがとうございました。少しでも参考になれば嬉しいです。

Inceptionという課題についても似た形式で記事を書いていますので合わせて御覧ください。

https://qiita.com/ryhara/items/0581c03e82bd84c54a6f