Rule


  1. No wildcard, ../

  2. Sever block, location block 만 구현함 (Http{}, event{} 은 구현하지 않음)

  3. server 블록에 대한 설정값을 씌이고, 그 다음에 location 관련 내용이 순서대로 적힌다. 순서에 상관없어졌다.

  4. 구현된 simple directives

    public :
    		// REVIEW 현재 사용하는 설정
    		// NOTE - location에서 덮어씌워지는 않는 요소들
    		std::string					mServerName;			// localhost
    		std::string					mHost;					// def = "0.0.0.0"
    		uint16_t					mPort;					// def = 8000;
    		int							mTimeOut;				// def = 0s
    		Path						mLocationPath;			// def = 
    		// NOTE - location에서 덮어씌워지는 요소들
    		bool						mAutoIndex;				// def = false;
    		Path						mRoot;					// def = 
    		std::vector<Path>			mIndexPages;			// def = index.html
    		Path						mErrorPage;				// def = 
    		std::vector<std::string>	mMethod;				// def = GET HEAD PUT POST DELETE OPTIONS
    		std::vector<std::string>	mCgiProgramPath;		// def = /bin/etc/php ft_tester/bla_tester
    		std::vector<std::string>	mCgiExtension;			// def = .bla .php
    		Path						mAuthBasicUserFile;		// def =
    		std::size_t					mClientMaxBodySize;		//def 0 NOT checking size
    		// REVIEW 현재 사용하지 않는 설정
    		uint64_t			mHeadLengthMax;	// def = 8k
    		uint64_t			mBodyLengthMax;	// def = 1M
    };
    
  5. 쓸데없이 공백문자 넣으면 안됨(config파일에서 줄이 끝나는 것은 개행 \\n 으로 끝남) error block으로 판단하거나, server {} 을 인식하지 못함.

  6. {}는 norminette 맞추듯이 들여쓰기와 개행 모두 맞춰야함

  7. location aaa b{} 띄어쓰기 있으면, nginx에서 에러 나기때문에, 나도 에러처리 함.

  8. 소켓 통신을 하기위해서 server configfile에서 확인해야하는 순서

    1. host + port → socket 1개

      host +포트별로 socket이 결정되므로, 포트

    2. server_name 으로 분류

      Requeset HTTP 에서 $hostname을 파싱하여 비교한다

    3. location block의 Path 분류

      해당 값에 따라서 덮어 씌여질 요소들은 덮어 씌워진다.

  9. config파일을 구성하면 벡터에 어떻게 담기는지

    1. 맨 아래 있는 port 부터 담김, server 블록이 담김
    2. 로케이션의 경우, abc 담기고, 디폴트 Location은 맨뒤에 담김. std::vector.back()를 이용해야할 듯
    3. 디폴트 값과 비교해서 잘 찾아내야함. (server_name의 default는 localhost)
  10. config파일에 설정한 index_pages, error_page 파일이 없으면 그냥 404에러로 한다.

  11. configfile에 값을 추가하고 싶을 때, 프로세스

    1. ConfigFile.cpp, ConfigFile.hpp 에서 멤버변수 추가
    2. ServerConfigIdx.cpp, .hpp
       1. Parsingserverblock 혹은 ParsinglocationBlock에 추가 (둘 다 추가 될 수 도 있음)
       2. std::vector인 경우, 추가해주는 느낌을 살리기위해 힘든 코딩.
    
    3. Server_parsing.cpp Server.hpp
    
       locationBlock, ServerBlock에서 한쪽에만 추가
    
    4. Serverblock, locationblock 생성자에서 초기화되는 부분 체크
    5. ServerManager.cpp 에서,   
       `int ServerManager::setServersValue(ConfigFiles *configs)` 할당하는 부분에 추가
    6. ShowConfigs(), ShowServers() 함수에서 값 확인! 그러기 위해서 값 추가
    
  12. tester의 location 파싱방법, nginx의 파싱 방법의 확실히 100퍼센트 다르다.

  13. default server block(일치하는 servername이 없을 때)는 맨 위에 있는 serverblock이다.

    ConfigFile &config = configs->mconfigs[configs->mconfigs.size() - 1]; 뒤에서 부터 config파일을 server블록에 넣고 있기 떄문에, 맨 처음에 있는 것이 맨 마지막에 들어가기 마련이고, server_name과 일치하는 것이 없으면, 맨 마지막에 있는 것을 가져다 쓰기 때문에, 맨 위에 있는 설정이 적용된다.

  14. configfile에 host에는 localhost도 들어가면 안된다. inet_addr()에서 0xffffffff(error)를 반환함.


parsing.drawio