tkomatsu/webserv

config error_page directive doesn't work😢

Closed this issue · 3 comments

下記設定でwebservを起動すると、config_.GetErrorPages(request_.GetURI());std::runtime_error例外が投げられてしまいます。
config_.GetErrorPagaes("/");でも同様に例外が投げられてしまいます。

default.conf

error_page 405 ./docs/html/50x.html;

server {
	listen 4200;
}

server {
	listen 4201;
}

server {
	listen 4202;
}

例外が投げられているのは、config.cppの135行目であることを確認しました。

webserv/srcs/config.cpp

Lines 133 to 150 in 0308198

const struct Location* Config::MatchLocation(const std::string& uri) const {
if (server_.locations.empty())
throw std::runtime_error("no location specified");
const struct Location* longest_prefix = NULL;
std::vector<const struct Location>::const_iterator itr;
for (itr = server_.locations.begin(); itr != server_.locations.end(); ++itr) {
if (uri.find(itr->path) == 0) {
if (longest_prefix == NULL)
longest_prefix = &*itr;
else if (itr->path.length() > longest_prefix->path.length())
longest_prefix = &*itr;
}
}
if (longest_prefix == NULL)
// throw Client::HttpResponseException("no matching location found");
throw ft::HttpResponseException("404");
return longest_prefix;
}

b8f8cb6 のコミットで同様の状態になると思います。
現時点のmainブランチからの変更点はClient::HandleException()にconfigからディレクティブを取得するように変更した点です。
WebServクラスは条件文のネストを浅くしただけで、処理は変わっていません。

今のconfigの仕様でlocationディレクティブが一個もないと、いかなるgetterもno location specifiedエラーになりますね。

Configファイルのエラーの場合はそもそもプログラム自体を終了させてしまっていいんですかね。

今のwebservの仕様的に、rootではなくaliasだけでやっているのでlocationディレクティブが少なくともひとつ必要。
なので以下2パターンが自然だと思います。どっちでも良いと思います。
・configの読み込み時点でlocationを持たないサーバーが一つでもあれば、そこでconfig error出して終了 (webservの仕様重視)
・リクエスト先にlocationがなければ404ですぐ返す(nginxがrootなければ404返すことから)