Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[http] リクエストの情報をHttpParseに送るかどうかを判定をどうするか?調査 #192

Open
s1-haya opened this issue Jul 21, 2024 · 1 comment
Assignees
Labels

Comments

@s1-haya
Copy link
Collaborator

s1-haya commented Jul 21, 2024

やりたいこと

webservはリクエストの情報をHttpParseに送るかどうかを判定をどうするか?を定義したい

仮説

リクエスト全体書式が送られたきたらHttpParseにリクエスト情報を渡すのではないか

  • リクエスト全体の書式かどうかはCRLF CRLFで判定すると考えている。例えばapacheで"GET / HTTP/1.1 \r\n\r\n"をリクエストの情報として渡した時に408のRequest Time Errorが出力されのでCRLF CRLFがリクエスト全体の書式かどうかを判断してるのではないか

やること

  • リクエスト情報をどのように読み込むのがHTTPサーバーとして推奨されてるのかを知るためにRFCを読む
  • RFCを元にapacheにたくさんリクエスト情報を送り、入出力の結果と理由をnotionでまとめて共有する

きっかけ

今後、そもそも CRLF + CRLF が buf にない場合とか、CRLF がない request_line だけの場合とかにどうすれば良いのか考えないとですね…

void HttpParse::CheckValidHttpRequest(const std::string& request_info) {
	// CRLFCRLFが見つからない場合 -> BAD REQUEWST
	// CRLFが見つからない場合 -> BAD REQUEWST
	if (std::find())

	// todo: #192 HTTP全体の書式に設定する条件文
	if (request_line_info[0].empty() || request_line_info[1].empty() ||
		request_line_info[2].empty()) {
			throw HttpParseException("Error: This request line is incomplete.", BAD_REQUEST);
	}
}
@s1-haya s1-haya added the http label Jul 21, 2024
@s1-haya s1-haya self-assigned this Jul 21, 2024
@s1-haya s1-haya changed the title [http] リクエストの全体の書式を正常かどうか確認する関数 [http] リクエストの情報をHttpParseに送るかどうかを判定をどうするか?調査 Jul 22, 2024
@s1-haya
Copy link
Collaborator Author

s1-haya commented Jul 22, 2024

調査結果

  • リクエスト情報の文字列をreadで読み込み、HttpParseクラスに渡す判定は各書式ごとに処理を行っている。リクエスト情報をリクエストラインの書式(CRLF)まで読み込み、メソッド、リクエストターゲット、バージョンがそれぞれ書式通りかどうか?をパースする。次にヘッダーフィールドの書式まで(CRLF CRLF)までを読み込み、書式通りかどうかをパースする。Content-Lengthがある場合はボディーメッセージまで読み込む。読み込みの待機中が続く場合は408 Request Timeoutをレスポンスとして返す。 HTTPリクエストの書式が正常だった場合、値が正常かどうかを確認する。

  • メッセージボディはContent-Length or Transfer-Encodingのヘッダーフィールドがないとボディーメッセージを読み込まない。

The presence of a message body in a request is signaled by a
Content-Length or Transfer-Encoding header field

https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.3

  • ヘッダーフィールド唯一Hostが必須(HTTP/1.1の場合)

A client MUST send a Host header field in all HTTP/1.1 request
messages.

A server MUST respond with a 400 (Bad Request) status code to any
HTTP/1.1 request message that lacks a Host header field and to any
request message that contains more than one Host header field or a
Host header field with an invalid field-value.
https://datatracker.ietf.org/doc/html/rfc7230#section-5.4

apacheの挙動 (notionに記載)

https://lopsided-dart-1a9.notion.site/fe951eb349b742d39829efa879984330?v=cc6e1b29fdd7435680423103ecb5ac06

相談

  • apacheだと正常なヘッダーフィールドの書式だけど存在しないnameも200 OKになっているがwebservはBAD_REQUESTにするかどうか。僕は200 OKした方がいい。例えば以下のようなリクエストは 200 OKになる。ただ"GO"とセミコロンの間に空白があると400 BAD REQUESTになる。
"GET / HTTP/1.1\r\n"
"GO:\t lll\r\n"
 "Host:\t" + std::string(server_ip) +"\r\n\r\n"

わかっていないこと

  • Content-Length と Transfer-Encodingの詳細
     どのようにクライアントリクエスト情報からメッセージボディを読み込めばいいのか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant