Open Victra15 opened 1 year ago
multiport상황에서 5525 port로 접속시
accept: Resource temporarily unavailable 에러 발생
conf 설정값:
server {
# location / {
# root /homeer;
# # index fttt.html;
# }
location /we {
root /home;
index fttest;
# redirect test;
# autoindex off; -> PATH_NOTFOUND
}
host 127.0.0.1;
port 5525;
server_name \m;
root /Users/yolee/42Seoul/Webserv/var;
index tedfdfdst;
client_max_body_size 42;
error_page 500 502 ;
error_page 400 502 /50x.html;
location / {
root /mnt/d/42/Webserv/seoul.php;
index index.html;
redirect http://api.example.com;
allow_method GET;
}
}
server {
host 127.0.0.1;
port 4242 ;
server_name example.com ;
root /Users/yolee/42Seoul/Webserv/var ;
index index.html ;
client_max_body_size 442 ;
error_page 500 502 ;
error_page 500 502 3432;
error_page 540 502 2;#;
error_page 520 502;
error_page 530 502;
location / {
root /Users/yolee/42Seoul/Webserv/var ;
index index.html;
# redirect s;
autoindex on;
allow_method GET DELETE;
}
location /ft {
root /;
index test;
redirect http://api.example.com;
allow_method GET POST;
}
}
멀티포트 에러 해결
포트 연결시 기존 ServerHandler에 존재하는 멤버변수로 있는 fd를 참조하는 형태로 accept한 것이 원인. 멤버변수 삭제 후 listen socket에 대한 SocketData*를 받아와 해당 socket의 fd를 사용해 accept함으로써 해결
시크릿모드가 아닌상태에서 연결시 각각의 포트를 통해 전달되는 데이터가 꼬여서 정상적으로 전달되지않는 현상 발생 ex) 4241포트 연결 후 리스폰스를 보냈으나 정상적으로 client가 해당 데이터를 수신하지 못했고 이후 4242포트로 연결한 client에 밀린 response가 전달됩니다. 이는 브라우저의 캐싱 문제로 보이나 좀 더 조사가 필요해 보입니다.
한번의 recv 호출로 body 전체를 전달받는 경우 pending 에러(SOCKSTAT_CLIENT_RECV_BODY를 사용하는 POST요청 한정)
기존의 코드에서 한번의 recv 호출로 body 전체를 전달받아도 SOCKSTAT_CLIENT_RECV_BODY를 통해 다음 EVFILT_READ를 기다리게 되는데 더 이상 읽을 값이 없으므로 pending상태에 들어감 따라서 recvHeader() 파트에서 헤더를 제외한 buf_str의 size와 헤더의 Content-Length를 비교하여 값이 같을 경우 바로 SOCKSTAT_CLIENT_POST로 변경
위 과정에서 setPostBody() 함수 생성
HTTPRequest의 getContentLength() 에러 해결
get으로 cgi요청 들어왔을시 그 파일 그대로 읽어서 가져오는식으로 요청 변경
recvBody에서 client_max_body_size보다 큰 값의 body가 들어왔을 때 펜딩되는 에러
if (client_socket->buf_str.size() > conf.getMaxBodySize(ntohs(client_socket->listen_addr.sin_port)))
this->setErrorPageResponse(STATCODE_BADREQ, client_socket)
조건문에 걸려서 setErrorPageResponse 함수로 넘어간 후 SOCKSTAT_CLIENT_SEND_RESPONSE로 만들어주지만 EVFILT_WRITE를 설정해주지 않는 것이 문제
recv 한번에 바디까지 전부 받을경우 max_body_size에 대해 검사하지않는 에러
기존 recvBody함수에만 있던 조건문을 setPostBody로 옮기면서 해결 changeEvent 구문도 중복됨으로 함수 상단으로 이동
void ServerHandler::setPostBody(ClientSocketData* const & client_socket)
{
changeEvent(client_socket->sock_fd, EVFILT_READ, EV_DISABLE, 0, NULL, client_socket);
changeEvent(client_socket->sock_fd, EVFILT_WRITE, EV_ENABLE, 0, NULL, client_socket);
if (client_socket->buf_str.size() > conf.getMaxBodySize(ntohs(client_socket->listen_addr.sin_port)))
{
this->setErrorPageResponse(STATCODE_BADREQ, client_socket);
return ;
}
client_socket->status = SOCKSTAT_CLIENT_POST;
client_socket->http_request.saveBody(client_socket->buf_str);
client_socket->buf_str.clear();
}
file i/o block되는 문제 해결
이미지 출력 안되는 문제 해결