webserv 서버부분 클래스 명세

dandb3·2023년 12월 28일
0

webserv

목록 보기
1/6

server_manager

- 전반적인 서버 구동을 담당하는 클래스. 기본적으로 이벤트 발생 -> 이벤트 타입 확인 -> 처리 의 수동적인 동작 방식을 지니고 있다.

구분이름자료형(리턴값)설명
private---
enumsocket_type-각 fd가 어떤 소켓에 해당하는지를 의미한다.
enumevent_type-이벤트 발생 시 이벤트의 종류를 의미한다.
member_confconst Config&config의 참조 멤버.
member_type_mmap<int, char>각 fd에 매핑되는 enum socket_type을 저장한다. value값으로 enum socket_type이 저장된다.
member_http_request_mmap<int, http_request_parser>각 fd에 매핑되는 http_request_parser를 저장한다.
member_http_response_mmap<int, http_response>각 fd에 매핑되는 http_response를 저장한다.
member_cgi_request_mmap<int, cgi_request>각 fd에 매핑되는 cgi_request를 저장한다.
member_cgi_response_mmap<int, cgi_response>각 fd에 매핑되는 cgi_response를 저장한다.
member_handlerevent_handler이벤트 처리를 담당하는 클래스.
method_handle_http_request()voidhttp_request를 cgi_request 혹은 http_response로 만들어주는 함수.
method_get_type()int발생한 이벤트의 타입이 어떤지를 알려주는 함수. enum event_type이 리턴된다.
method_serv_listen()voidlisten 이벤트를 담당하는 함수.
method_serv_http_request()voidhttp_request 이벤트를 담당하는 함수.
method_serv_http_response()voidhttp_response 이벤트를 담당하는 함수.
method_serv_cgi_request()voidcgi_request 이벤트를 담당하는 함수.
method_serv_cgi_response()voidcgi_response 이벤트를 담당하는 함수.
method_serv_error()voiderror 발생 시 처리를 담당하는 함수.
public---
methodoperate()void서버를 동작시키는 함수.
  • 기본 동작

    • request를 읽어들인다.
    • request를 파싱해서 request_queue에 집어넣는다.
    • http_response가 IDLE 상태일 때 마다 request_queue에서 http_request를 하나씩 읽어들여 동작시킨다.
  • 굳이 queue를 만든 이유?

    • 기존 방식: http_request 수신 event가 발생한 경우 하나의 http_request만 파싱해서 동작시켰다.

      문제점:

      • http_request 파싱은 event 발생 시에만 이루어졌는데, 여러 http_request가 버퍼에 한 번에 들어올 경우, http_request 생성이 한 번 밖에 이루어지지 않는다.
      • 또한, http_response 전송이 다 완료되지 않은 상태에서 http_request event가 발생할 경우 기존 전송되지 않았던 http_response의 데이터가 날라간다.
    • 새로운 방식:

      • 입력에서 가능한 만큼 전부 http_request로 만들어서 queue에 넣는다 -> 첫 번째 문제 해결
      • http_response가 IDLE일 때 마다 queue에서 값을 읽어온다 -> 두 번째 문제 해결

event_handler

- 이벤트 처리를 담당하는 함수. 기본적으로 kqueue를 사용한다.

구분이름자료형(리턴값)설명
private---
member_eventlistvector<struct kevent>발생한 이벤트들을 저장하는 벡터.
member_changelistvector<struct kevent>event감시의 변경사항을 저장하는 벡터.
member_timeoutstruct timespeckevent() 함수 호출시에 사용되는 시간 구조체. 기본적으로 NONBLOCK으로 동작하므로 0으로 초기화된다.
member_neventsintkevent()함수의 리턴값이 저장됨. 발생한 이벤트의 개수를 나타낸다.
member_kqintkqueue의 fd값이 저장된다.
public---
methodget_nevents()int발생한 이벤트의 개수를 리턴해준다.
methodget_eventlist()const vector<struct kevent>&발생한 이벤트 벡터를 리턴해준다.
methodev_catch()void발생한 이벤트를 catch하는 함수. 내부적으로 kevent()를 호출함.
methodev_update()voidevent감시의 변경사항을 적용한다. 내부적으로는 _changelist에 원소를 넣는다.

http_request_parser

- 들어온 http_request를 파싱하는 역할을 한다. 파싱한 결과도 저장한다.

- 참고: parse* 함수들은 input* 함수들 내부에 포함되어도 전혀 문제될 것이 없을 것 같아서 안으로 집어넣을지 고려중.

구분이름자료형(리턴값)설명
private---
enum--현재 파싱 상태를 나타낸다.
member_bufstatic char읽어온 값을 잠시 저장하는 버퍼이다.
member_fdint연결된 http socket의 fd값이 저장된다.
member_statuschar현재 파싱 상태를 나타낸다. enum값이 저장됨.
member_remainstring지금까지 파싱되지 않은 데이터가 저장된다.
member_line_vvector<string>파싱 전, CRLF를 기준으로 라인별로 벡터에 데이터가 저장된다.
member_http_request_qqueue<http_request>정상적으로 파싱 완료된 http_request들이 순서대로 저장된다.
method_input_start()void_status == INPUT_READY일 때의 동작. input을 준비한다.
method_input_request_line()void_status == INPUT_REQUEST_LINE일 때의 동작. request-line을 읽어들인다.
method_parse_request_line()void_status == PARSE_REQUEST_LINE일 때의 동작. request-line을 파싱한다.
method_input_header_field()void_status == INPUT_HEADER_FIELD일 때의 동작. header-field를 읽어들인다.
method_parse_header_field()void_status == PARSE_HEADER_FIELD일 때의 동작. header-field를 파싱한다.
method_input_message_body()void_status == INPUT_MESSAGE_BODY일 때의 동작. message-body를 읽어들인다.
method_push_request()void_status == PARSE_FINISHED일 때의 동작. 파싱이 끝난 http_request를 queue에 넣는다.
method_push_err_request()voidEOF가 발생했고, 파싱이 끝나지 않았을 경우 error메시지를 queue에 넣는다.
public---
methodrecv_request()void데이터를 읽어와 _remain에 저장한다.
methodparse_request()void_remain에 있는 데이터들을 파싱한다.
methodget_queue()queue<http_request>&_http_request_q를 리턴한다.
methodclosed()bool_status == INPUT_CLOSED인 경우 true, 아닌경우 false를 리턴한다.

http_request

- 파싱 완료된 http_request가 저장되는 클래스.

구분이름자료형(리턴값)설명

sunwsong이 구현 중..

http_response

- http_response를 담당하는 클래스.

구분이름자료형(리턴값)설명
public---
enum--현재 http_response 클래스의 상태를 의미한다.
private---
member_fdinthttp_response를 보낼 소켓의 fd값
member_responsestring보낼 http_response를 string으로 변환한 값
member_possize_t_response를 보내기 시작하는 다음 위치
member_status_char현재 http_response 클래스의 상태. enum값으로 저장된다.
public---
methodget_status()inthttp_response의 상태를 의미한다.
methodset_status()voidhttp_response의 상태를 설정한다.
methodsend_response()_response에 저장되어 있는 데이터를 보낸다.

cgi_request

- http_request에 의해 만들어진 cgi_request가 저장되는 클래스.

구현 중..

cgi_response

- cgi로부터 수신한 데이터들이 저장되는 클래스.

구현 중..

profile
공부 내용 저장소

2개의 댓글

comment-user-thumbnail
2024년 2월 12일

다른거 찾다 봤는데 42분이시군요 파이팅~!

1개의 답글