このプロジェクトは、42コアカリキュラムの一部として完了しました。 Alouane04で行われました
このプロジェクトの目標は、C ++ 98互換性のあるHTTP Webサーバーをゼロから構築することです。 Webサーバーは、HTTP Get、Head、Post、Put、削除を処理でき、CGIを使用して指定されたルートディレクトリまたは動的コンテンツから静的ファイルを提供できます。また、select()の助けを借りて複数のクライアント接続を同時に処理することもできます。
使用法
導入
Webサーバーの一部
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP(HyperText Transfer Protocol)は、インターネットを介して情報を送信および受信するためのプロトコルです。これは、World Wide Webの基盤であり、WebブラウザーとWebサーバーが互いに通信するために使用されています。
HTTP Webサーバーは、クライアント(Webブラウザーなど)からのHTTPリクエストをリッスンし、応答するソフトウェアアプリケーションです。 Webサーバーの主な目的は、Webコンテンツをホストし、インターネットを介してユーザーが利用できるようにすることです。
HTTPは、リクエストと応答で構成されています。クライアント(Webブラウザなど)がサーバーからWebページを取得する場合、サーバーにHTTPリクエストを送信します。次に、サーバーはリクエストを処理し、HTTP応答を送信します。
HTTPメッセージ形式
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
HTTPメッセージは、リクエストまたは応答のいずれかです。
HTTPリクエスト
HTTP要求は、リクエスト行、ヘッダー、およびオプションのメッセージ本文で構成されています。 HTTPリクエストの例は次のとおりです。
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
要求行は、メソッド、パス、およびHTTPバージョンの3つの部分で構成されています。このメソッドは、クライアントが実行したいアクションを指定します。パスまたはURIは、サーバー上のリソースの場所を指定します。 HTTPバージョンは、使用されているHTTPプロトコルのバージョンを示します。
ヘッダーには、サーバーのホスト名、使用されているブラウザのタイプなど、リクエストに関する追加情報が含まれています。
上記の例では、通常はgetメソッドにはボディが含まれていないため、メッセージ本文はありませんでした。
HTTP応答
HTTP応答は、ステータスライン、ヘッダー、およびオプションのメッセージ本文で構成されています。 HTTP応答の例は次のとおりです。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
ステータス行は、HTTPバージョン、ステータスコード、および理由フレーズの3つの部分で構成されています。ステータスコードは、200 OK(成功)や404が見つからない(リソースが見つからない)など、リクエストの結果を示します。理由フレーズは、ステータスコードの簡単な説明です。以下は、ステータスコードが示すものの非常に簡単な要約です。
1xx情報メッセージのみを示します
2xx 、ある種の成功を示しています
3xx 、クライアントを別のURLにリダイレクトします
4xx 、クライアント側のエラーを示します
5xx 、サーバー側のエラーを示します
ヘッダーには、返されるコンテンツのタイプとサイズなど、応答に関する追加情報が含まれています。メッセージ本文には、WebページのHTMLコードなど、応答の実際のコンテンツが含まれています。
HTTPメソッド
| 方法 | 説明 | 可能な体 |
|---|---|---|
GET | 特定のリソースまたはリソースのコレクションを取得することは、データ/リソースに影響を及ぼさないでください | いいえ |
POST | リクエストコンテンツでリソース固有の処理を実行します | はい |
DELETE | URIによって与えられたターゲットリソースを削除します | はい |
PUT | メッセージ本文からデータを使用した新しいリソースを作成します。リソースが既に存在する場合は、ボディのデータで更新します | はい |
HEAD | GETと同じですが、応答コンテンツを転送しないでください | いいえ |
得る
HTTP GETメソッドは、リソースの表現を読み取る(または取得)するために使用されます。成功した場合(または非誤差)、GETは応答ボディのリソースの表現と200(OK)のHTTP応答ステータスコードを返します。エラーの場合、ほとんどの場合、404(発見されていない)または400(悪い要求)を返します。
役職
HTTP POSTメソッドは、ほとんどの場合、新しいリソースを作成するために使用されます。作成が成功すると、HTTP応答コード201(作成)が返されます。
消去
http deleteは前方に進んでいます。 URIで指定されたリソースを削除します。削除が成功すると、HTTP応答ステータスコード204(コンテンツなし)を返します。
HTTPメソッドRFC9110#9.1の詳細をご覧ください
基本的なHTTP Webサーバーは、クライアントからHTTPリクエストを受信および処理し、応答を送信するために協力して機能するいくつかのコンポーネントで構成されています。以下は、Webサーバーの主要部分です。
TCP接続を処理し、着信リクエストのリスニングや応答の送信などのタスクを実行するWebサーバーのネットワーキング部分。ソケットの作成と管理、入力ストリームの処理、サーバーとクライアント間のデータのフローの管理など、Webサーバーの低レベルのネットワークタスクを担当します。
Webサーバーを書く前に、C/C ++でTCPの仕組みをよく理解するのに役立つので、C/CPのシンプルなTCPクライアント/サーバーの構築に関するこの素晴らしいガイドを読むことをお勧めします。また、I/Oマルチプリキングを理解する必要があります。このビデオは、select()の主なアイデアを把握するのに役立ちます。
WebサーバーのI/O多重化プロセスは、以下のフローチャートにまとめられています。 (CGIはフローチャートには含まれていませんが、将来追加される可能性があります)
Webサーバーの解析部分は、HTTP要求から情報の解釈と抽出を担当するプロセスを指します。このWebサーバーでは、リクエストの解析はHTTPRequestクラスによって実行されます。 HTTPRequestオブジェクトは、着信要求を受信し、それを解析し、メソッド、パス、ヘッダー、メッセージ本文などの関連情報を抽出します(存在する場合)。解析中にリクエストで構文エラーが見つかった場合、エラーフラグが設定され、停止が解析されます。要求は、メソッドフィード()を介して完全または部分的にオブジェクトに供給できます。これは、パーサーがリクエストバイトを一度にスキャンし、必要なときにいつでも解析状態を更新するため可能です。 NginxおよびNodejsリクエストパーサーでは、同じ方法の解析方法が使用されます。
以下は、パーサーの仕組みの概要です。
Response Builderは、リクエストに応じてクライアントに送信されるHTTP応答を構築およびフォーマットする責任があります。このWebサーバーでは、応答クラスは、ステータスライン、ヘッダー、メッセージ本文を含むHTTP応答の構築と保存を担当します。応答ビルダーは、リクエストの結果に基づいて適切なステータスコードと理由フレーズの設定、レスポンスにヘッダーを追加してコンテンツまたはサーバーに関する追加情報を提供し、コンテンツの種類と応答のエンコードに従ってメッセージ本体のフォーマットなどのタスクを実行する場合があります。たとえば、サーバーがクライアントからWebページのリクエストを受信した場合、サーバーはリクエストを解析し、Webページのコンテンツを取得し、メッセージ本文内のHTMLコンテンツを使用してHTTP応答を構築し、コンテンツタイプやコンテンツ長ヘッダーなどの適切なヘッダーを構築する応答オブジェクトに渡します。
構成ファイルは、Webサーバーがどのように動作するかを決定するさまざまな設定とディレクティブを含むテキストファイルです。これらの設定には、Webサーバーがリッスンするポート番号、Webサーバーのルートディレクトリの場所、その他の多くの設定などが含まれます。
構成ファイル形式とサポートされているディレクティブを表示するFIEの例を示します。
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}CGIは、Webサーバーから外部プログラムを実行するための標準です。ユーザーがCGIプログラムで処理されるべきWebページを要求すると、Webサーバーはプログラムを実行し、出力をユーザーのWebブラウザーに返します。
CGIプログラムは、Perl、Python、Bashなどのプログラミング言語で記述できる単なるスクリプトであり、通常、Webブラウザーを介してユーザーが送信したデータの処理に使用するか、Webページで動的コンテンツを生成するために使用されます。