NaoyaFukuma / webserv

This is when you finally understand why a URL starts with HTTP
3 stars 0 forks source link

<CGI> hello_world.cgi がHTTPレスポンスを正常に返す #83

Closed NaoyaFukuma closed 1 year ago

NaoyaFukuma commented 1 year ago

現状

6: EPOLLIN
vserver: webserv.com
location: /cgi_bin
concat: /app/www/webserv_com/cgi_bin/hello_world.cgi
resource_path: /app/www/webserv_com/cgi_bin/hello_world.cgi
is_cgi: 1
Keep Running Error: EPOLLERR or EPOLLHUP
Fatal Error: epoll_ctl

問題点 EPOLLERR or EPOLLHUPが発火している。 epoll_ctlが失敗している。

どちらも正常なシナリオなら発生しないはず。

問題の切り分け作業に入る。

まずはEPOLLERRなのかEPOLLHUPなのか。

NaoyaFukuma commented 1 year ago

EPOLLERRは発火していない。 EPOLLHUPが発火している。

EPOLLHUPが子プロセスの終了していると考えられる。 UNIXドメインソケットに対し、hello_world.cgi内で、close()もしくはshutdown()を行っていないことが要因であると思われる。 ただ、RFC3875において、close()やshutdown()することは求められていないので、close()やshutdown()が行われないことを前提に対応する必要があると思われる。

NaoyaFukuma commented 1 year ago

発火したイベントが、epoll_wait()により通知される際にイベントマスクにビットフラグとして設定される。 その際に、イベントハンドラーを、 EPOLLHUP, EPOLLIN, EPOLLOUTとしていたため異常を起こしていた。 EPOLLOUT, EPOLLIN, EPOLLHUPの順とした。 EPOLLOUTにより、子プロセスへ送信。 INにより子プロセスからの出力を受信。 EPOLLHUPにより子プロセス終了の検知。 そうしなければ、子プロセスとの通信を処理する前に、EPOLLHUPが処理されてします。