일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- rfc5508
- BOF
- 풀이
- edge trigger
- epoll
- Docker
- REDIS
- doupdate
- NAPT
- vtable
- 어셈블리어
- C언어
- level trigger
- 취약점
- wrefresh
- packet filter
- mvwin
- ioctl
- epoll_wait
- iptables
- .net core 7
- ncurses
- wnourefresh
- DOCKER-USER
- Compiler
- LOB
- .nret core 배포
- packet flow
- cbpf
- architecture
- Today
- Total
Tuuna Computer Science
Onion Web Framework Usage 본문
Onoin Web framework는 C로 이루어진 Web framework이다.
경량 framework로서 django 느낌의 냄새를 풍귄다.
본론부터 들어가서 사용법과 간단한 후기에 대해서 서술할 예정이다.
Github 주소
https://github.com/davidmoreno/onion
위의 주소가 Onion github 주소이다.
README.md에 적힌대로 Install을 해주면 된다. 그리고 해당 폴더에 들어가서 example을 보면서 사용법 습득이 가능하다.
주의) 자료가 github, api docs밖에(?)없어서 노가다 중요
API DOCS : https://coralbits.com/static/onion/
Usage
서버 초기 세팅법은 아래 코드로 이루어진다. 간단하다.
int main()
{
onion* server = onion_new(O_POOL);
onion_set_hostname(server, "0.0.0.0");
onion_listen(server);
onion_free(server);
}
포트 지정법도 따로 있지만 위에 링크된 API docs를 보면서 알아서 찾자
기본포트는 8080포트이다.
url의 등록은 앞서 언급한 django와 유사한 패턴을 지닌다. 장고에서 url을 등록하고 이에 맞는 view를 콜백으로 지정하는 거처럼 Onion도 같은 방식을 취한다.
onion_url* urls = onion_root_url(server);
onion_url_add_static(urls, "static", "Hello World", HTTP_OK);
onion_url_add(urls, "index", index_view);
onion_root_url함수로 url list를 만든다.
그리고 onion_url_add_static 함수와 onion_url_add 이 두 개의 함수로 클라이언트의 요청된 url에 대해 콜백함수를 등록한다.
위 두개의 함수는 기본적으로 첫 번째 인자로는 등록을 저장할 root urls, 두 번째 인자로는 어떤 path에 대해 요청받을 것인지, 세 번째 인자는 onion_urls_static함수의 경우 바로 response body에 세 번째 인자의 문자열을 넣어서 클라이언트에게 response한다.
반면, onion_url_add함수는 세 번째인자로 해당 url이 request되면 호출할 콜백 함수를 의미한다.
그럼 이제 콜백 함수에 대해서 알아보자.
int index_view(void* p, onion_request* req, onion_response* res)
콜백함수의 원형은 위와 같다.
첫 번째 인자로는 더미 데이터? 잘모르겠다 ㅎㅎ 아직 안써봄
두 번째 인자로는 클라이언트가 요청한 request부분
세 번째 인자로는 서버측에서 클라이언트로 날릴 response부분이다.
int index_view(void* p, onion_request* req, onion_response* res)
{
onoin_response_write0(res, "Hello World");
onion_response_printf(res, "%s", "Hello World");
ONION_INFO("%s", onion_request_get_query(req, "id"));
return OCS_PROCESSED;
}
위 코드는 간단한 view 함수 예제이다.
일단 클라이언트가 www.example.com/index?id=1 이라는 request를 했다는 가정을 해보자.
그럼 /index 부분이 index이니까 urls에 콜백으로 등록해놓은 index_view함수가 호출될 것이다.
index_view함수 내부를 살펴보자. 첫 번째줄에는
onion_request_write0(res, "Hello World); 라는 함수를 발견할 수 있다. 이는 res 구조체에 Hello World라는 문자열을 씀을 알 수 있다.
onion_response_printf(res, "%s", "Hello WOrld"); 함수는 onion_response_write0()함수와 유사하지만 두 번쨰 인자로 포맷 인자를 받아서 좀 더 편리하게 response를 구성할 수 있다.
다음 줄을 보면 ONION_INFO("%s", onion_request_get_query(req, "id")); 부분을 볼 수 있다. ONION_INFO는 stderr로 로그를 띄워준다.
onion_request_get_query()함수는 첫 번째 인자로 res를 넣고 두 번째 인자로 키 값을 넣는다. www.example.com/index?id=1 이런 url의 경우 "id"라는 키는 1이라는 value를 가지니 반환값은 1이 된다.
만약에 요청된 경로 전체를 보고 싶다면 두 번째 인자로 "1"을 넣으면 된다. 그럼 다 보여줌!
그리고 마지막 return OCS_PROCESSED; 는 함수를 끝내면서 response에 기입된 내용을 정상적으로 클라이언트에게 전달함을 의미한다.
OCS_PROCESSED말고 OCS_INTERNAL_ERROR도 있는데 이는 서버 로직의 문제가 발생했을 때 500에러를 띄워준다.
그리고 웹사이트를 꾸밀때 html만 들어가면 섭섭하다. css나 js도 들어가는 경우가 허다하다. 하지만 위에 언급된것만 사용한다면 js나 css, image등 static한 것들에 대해서는 처리를 못할 것이다.
onion_url_add_handler(urls, "^js", onion_handler_export_local_new(static 파일 경로));
위와같이 써주면 된다. "^js"부분은 css등 추가하면 된다. 그럼 서버에서 static파일들에 대해 처리를 같이 해준다.
README를 보면 template Language를 지원한다고 써있지만 어떻게 쓰는지 찾지 못해 포기하고 다른 라이브러리를 찾아서 사용함.
github : https://github.com/ac000/libctemplate
사용법은 쉬우니까 알아서 정독하자.
이것이 전반적인 onion web framework에 대한 사용법이다.
ssl이나 session에 대해서는 아직 안써봄 ;; ^^
'WEB' 카테고리의 다른 글
동아리 대출 서비스 제작 구현 과정 1차시 (1) | 2019.09.17 |
---|