[Webproxy-lab] Tiny Web Server

2024. 5. 6. 22:47크래프톤 정글 5기/공부

GIT

 

1. main()

- 주어진 포트 번호로 listening socket 생성 후, 반복적으로 request 처리

 


 

2. doit()

- HTTP request 처리

 


 

3. read_requesthdrs()

- HTTP request Header 읽음

 

 


 

4. parse_uri()

- URI 분석

 

 


 

5. get_filetype()

- 파일 이름으로부터 파일 타입을 결정

 


 

6. serve_static()

- 정적 컨텐츠를 제공

 

 


 

7. serve_dynamic()

- 동적 컨텐츠 제공

 


 

8. cgi-bin/addr.c

- 2개의 숫자를 더하는 CGI 프로그램 코드

 

 


9. home.html

 

 


 

10. localhost:[port number] access

 

make

./tiny [port number]


Chrome -> localhost:[port number]

 


 

 

11. test CGI

 

[server]

./tiny [port number]

[client]

telnet localhost [port number]
GET /cgi-bin/adder?15000&213 HTTP/1.0
(1줄 공백 엔터)

 


# 숙제문제 11.6.C

- 브라우저 HTTP 버전 체크

 

request : HTTP/1.1

response : HTTP/1.0

 

-> 요청 응답 프로토콜 버전이 달라도 되는건가 ?

 

대부분 현대 웹 브라우저는 HTTP/1.1을 사용하고, Tiny 웹 서버는 HTTP/1.0 기반으로 구현되었기 때문에

요청은 HTTP/1.1 , 응답은 HTTP/1.0으로 출력되는 것

 

HTTP/1.1 :

지속적인 연결이 기본으로 사용 -> 여러 요청을 하나의 연결로 처리 가능

청크 인코딩, 가상 호스팅 등의 기능이 추가

 

HTTP/1.0 :

여러 요청이 들어오면 하나의 연결로 처리 X -> 각자 새로운 연결로 처리

 

-> 호환되어 동작할 수 있다 ~


 

# 숙제문제 11.7

- MPG 비디오 파일 처리하도록 수정

 

home.html
tiny.c -> get_filetype()

 

home.html 파일에 비디오 포맷 추가

tiny.c 파일에 get_filetype() 함수에 [파일명에 mp4 들어갈 경우] 케이스 추가

(home.html 파일에 비디오 포맷만 추가한 상태로도, 동작은 잘 되긴 했다)


 

# 숙제문제 11.9

- serve_static()에서 [mmap, munmap] 쓰지 말고 [malloc, free] 쓰는걸로 변경

 

tiny.c -> serve_static()

 

해당 파트는 response Body를 (클라이언트에게 보내기 위해) 입력받은 파일 디스크립터로 넣어야 하는 과정

  mmap() malloc()
동작 방식 가상 메모리 안의 힙 영역에 메모리 할당 가상 메모리 공간에 매핑
매핑된 메모리는 파일 내용 직접 반영
메모리 할당 단위 바이트 단위 페이지 단위 (배수 맞춰야함)
할당 가능 메모리 크기 힙 영역의 크기에 따라 제한 가상 메모리 공간의 크기에 따라 제한
할당 메모리 초기화 초기화 X 매핑 과정에서, 파일 내용으로 초기화
메모리 해제 free() munmap()
용도 일반적 메모리 할당
프로그램에서의 동적 메모리 할당에 적합
파일이나 장치를 메모리에 매핑
대용량 파일 처리 / 파일 직접 매핑으로 빠름

 

malloc() 이후, Rio_readn() 함수를 거쳐 [할당된 메모리 공간에 파일의 내용을 읽는 과정] 추가해야 함


 

# 숙제문제 11.10

- CGI adder 함수에 대한 HTML 코드 수정 

 

home.html
adder.c

 

n1, n2를 num1, num2라는 변수로 설정한 이후

home.html 파일에 "GET" method, action = "cgi-bin/adder" 설정 이후 코드를 수정해야 함


 

#숙제문제 11.11

- GET method 이외에도, HEAD method 처리 가능하게 코드 수정

 

 

serve_dynamic(), serve_static() 파트에서 response head - response body 사이에 넣어주면 된다

 

 

doit() 파트에서 [GET method가 아닐 경우에] 수행되던 예외 처리 조건문에, HEAD method도 && 처리 해주면 된다