지난번에 list4.erl 파일처럼 리스트형 변수처리 방법을 확인해 보았다.
이 list4.erl 과 같은 RPC형 리스트형 변수를 활용하여 client brower의 Request를 처리하는 Logic을 만들어 보았다.
일단 Web Server의 네트웍 기본 Logic은 생략하고 HTTP Header 정보를 Parsing하고 저장하는 부분이 설명한다.
이후 다음 포스팅에서 저장된 자료를 꺼내는 Logic을 설명한다.
대략 WebServer에 필요한 모듈이 이 정도라고 본다.
이 중에서 HTTP Parser 부분을 코딩하고 RPC 변수 모듈에 Server 상수를 저장하도록 한다.
뭐 다른것도 마찬가지지만 Erlang이 코딩 자체는 매우 심플하다.
그 심플함을 익히는게 어렵지..
어쨌든 코드를 살펴보면
parser() 함수에서 부터 시작된다.
HTTP Request 요청 프로토콜은 Explore 브라우져의 Request를 캡춰하여 테스트를 위해 fixed 했다.
GET /index.html?test=test-message HTTP/1.1\r\nHost: 192.168.0.125:3001\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.117 Safari/535.19\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US,en;q=0.8,ko;q=0.6\r\nAccept-Charset: UTF-8,*;q=0.5\r\n\r\n
이 브라우저의 Request를 Parsing하는 로직을 시작한다.
Erlang에서 기본적으로 제공하는 string:tokens 함수로 프로토콜을 자른다.
string:token 함수의 프로토타입은
string:token( STRING, DELIMITER )
의 형태이다.
이걸 몰라서 한참 동안 삽질을 했다.
token으로 잘려서 프로토콜은 리스트에 담겨져 있고 foreach 문을 이용해 라인별( \r\n 으로 잘랐으므로 )로 상수명 대 값으로 분할한다.
lists:foreach(fun(X) -> parser2(L2, X) end, L1).
parser2() 함수가 실제 메인 함수이다.
다시 string:token 함수로 상수명과 값으로 나눈 리스트로 만든후
getAttr 함수로 상수명을, getValue 함수로 값을 가져온다.
다음은 함수의 원형이다.
getAttr([H|T]) -> H;
getAttr([H|_]) -> H.
getValue([H|T]) -> T;
getValue([H|_]) -> H.
GET 및 POST같은 경우는 요청 파일 주소 및 요청 Parameter로, HOST의 경우는 요청 IP와 PORT로 한번 더 Parsing 한다.
그 외의 상수들은 모두 value값 그대로 저장한다.
Parsing 끝나면 지난번 만들었던 RPC 리스트형 변수에 저장한다.
insList( ["Method", {"GET", Addr, Param}] )
insList 함수는 parameter를 하나만 받기 때문에 여러개의 값을 넘기고 싶은 경우, 위와 같이 리스트 하나에 튜플 두개를 저장하고 두번째 튜플에는 다시 필요한 만큼의 값들을 넣어 저장한다.
이렇게 저장하는 것은 별 문제가 없지만, 저장후 다시 꺼낼때는 넣은 형식에 맞춰서 꺼내줘야 한다.
이렇게 Parsing 부분은 마치고, 이어서 Server 상수를 다시 꺼내는 Logic을 포스팅 하겠다.
'Erlang' 카테고리의 다른 글
Erlang Web Server V0.1 (0) | 2012.04.12 |
---|---|
Erlang List 변수 처리-로직 변경 (0) | 2012.04.09 |
Erlang 리스트에서 검색값 가져오기 (0) | 2012.04.04 |
Erlang List 변수 처리 (0) | 2012.03.05 |
[Erlang] Server/Client (0) | 2012.02.06 |