> For the complete documentation index, see [llms.txt](https://injun-woo30000.gitbook.io/growth-log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://injun-woo30000.gitbook.io/growth-log/daily-review/2020/nov/20201102-mon.md).

# 2020-11-02(Mon)

1. 학습 날짜 // 2020-11-02(월)
2. 학습시간 // 9:00\~22:00
3. 학습 범위 및 주제 // Select 함수 동작
4. 동료 학습 방법 // sanam, yohai 님과 토의함
5. 학습 목표 // Request / Response 동작의 오류를 확인하고 해결한다.
6. 상세 학습 내용

![image](https://user-images.githubusercontent.com/54612343/98459881-5eb24900-21e2-11eb-8957-d81518351593.png)

![image](https://user-images.githubusercontent.com/54612343/98459890-72f64600-21e2-11eb-901a-09409ec4b92f.png)

## 문제) body가 없는 요청을 날리면 server가 응답하지 않는다.

## 해결) body가 없을 때도 WRITE\_FDSET이 셋팅되도록 예외처리하였다.

지금까지는 요청의 Request line, headers line 까지만 우선 읽은 다음, body를 읽어보낼 필요가 없는지 여부를 확인하고, body를 읽을 필요가 없다면 `FdType`을 `MUST_CLEAR`로 셋팅하고 `READ_FDSET` 을 설정하여, client socket의 Buffer 모두 읽어 비워낼 때까지 재차 read한 후, EOF를 만나면 `WRITE_FDSET`을 셋팅하도록 하였다.

만약 요청이 Request line, headers line까지만 도착했더라도 `MUST_CLEAR`로 셋팅된 후 buffer를 비우는 처리흐름에서 바로 'EOF'를 만날 뿐, 정상적으로 `WRITE_FDSET`이 셋팅시킬 것이다.

..라고 생각했는데 함정이 있었다. **`READ_FDSET` 을 셋팅했더라도 buffer가 비어있다면 `SELECT` 함수가 자체적으로 `FDCLR`를 한다..!**

이를 간과했기 때문에 요청에 처음부터 body가 포함되어있지 않다면, Request line과 headers line까지 읽은 시점에서 buffer가 모두 비워져버리고, `SELECT` 함수를 거쳤을 때 `FDCLR` 되면서 해당 fd는 다시 read sequence로 들어가서 `WRITE_FDSET` 을 할 기회가 사라지게 된다.

따라서 요청에 처음부터 body가 포함되어있지 않다면, `MUST_CLEAR` 로 셋팅하지 않고 바로 `COMPLETE`로 셋팅하여 `WRITE_FDSET`도 셋팅해버리는 동작을 추가하여 해결하였다.

1. 학습 내용에 대한 개인적인 총평

`SELECT` 함수의 예상치 못한 동작 때문에 미궁에 빠졌었습니다. 숙지했다고 생각했는데 이해가 부족한 부분이 있었네요. 반성할 점은 아래 세 가지입니다.

1\) 무언가를 쓸 때 확실히 숙지하고 쓸 것

2\) 확실히 숙지하지 못한 부분이 있는지 계속 의심해볼 것

3\) log를 찍어서 추적하는 접근을 견지할 것

이와 별개로 PageGenerator 부분을 sanam님께 부탁드렸는데 참 잘 만들어주셔서 감사했습니다.

다음 학습 계획

* Static resource 를 Response body로 만드는 모듈 구현
