앞서서 설명했던 각 모듈을 결합하여 Web Server를 구성한다.
일단 이 WebServer는 외부 CGI 및 서버사이드 스크립트를 실행하는 기능은 없다.
웹서버상에 미리 만들어진 HTML등의 웹페이지를 보여주는 기능만 갖는다.
< 크롬 브라우저에서 Erlang Web server 접속 화면 >
192.168.0.125 번 서버에 3001번 Port로 기동되어 있는 Web Server에 접속한 화면이다.
일단 대충 간단하게 index.html 파일을 만들었고, Document Root에 저장한 html 파일을 오픈하여 브라우저에 전송했다.
아래는 서버의 실행 로그이다.
브라우저에서 http://192.168.0.125:3001 로 요청했을 경우 두개의 Request가 서버로 전송된다.
첫번째 요청은 파일명을 넣지 않았기 때문에서 서버에서 index.html로 변환한 후 Document Root 와 결합한 FullPath로 파일을 찾아 읽었다
>> >> file read : "/home/kukto/test/erlang/html/index.html"
이 파일은 정상적으로 브라우저에 전달되었다.
이후 favicon.ico 라는 주소창에 해당 URL의 아이콘을 요청했다.
>> >> file read : "/home/kukto/test/erlang/html/favicon.ico"
ico 파일이 서버에 없기 때문에 서버는 404에러를 반환했을테고, 브라우저는 이 메세지를 무시했다.
아래는 이전에 설명했던 부분을 제외한 Web 기능 구현 부위의 주요 소스 부분이다.
start 함수에서 Server 상수를 저장한 빈 리스트를 생성하고, RPC 변수 프로세서를 실행시킨다.
이후 3001번 포트로 Listen 포트를 함수를 호출한다.
start_parallel_server 함수에서 Port를 열고 listen 대기한다.
par_connect 함수에서 접속 요청을 Accept하고,요청 처리 함수를 호출한다.
get_request함수는 client socket 이벤트를 처리한다.
get_request_from_client 함수에서 Request를 Parsing하여 Server 상수로 저장하고, 이후 Server 상수중 Method 부분으로 파일을 연고
이후 파일에서 읽어들인 부분을 Client로 Send하게 된다.
그런데 문제가 하나 생겼다.
Client 브라우져가 HTTP/1.1 로 접속하여 Connection을 Close를 하지 않다는 것이다.
그래서 저장된 Server 상수를 작업처리후에 지워줘야 하는데, Close 이벤트가 발생하지 않기 때문에 리스트에서 이 상수를 지울 타이밍을 잡을수 없다는 것이다.
그래서 get_request_from_client 함수의 맨마지막에 delList( Pid ) 를 추가함으로써 해결되었음.
'Erlang' 카테고리의 다른 글
Erlang 외부 프로세스 실행 (0) | 2012.04.20 |
---|---|
Erlang List 변수 처리-로직 변경 (0) | 2012.04.09 |
Erlang 리스트에서 검색값 가져오기 (0) | 2012.04.04 |
Erlang Parsing (0) | 2012.04.04 |
Erlang List 변수 처리 (0) | 2012.03.05 |