C언어

환경변수 PATH_INFO 활용

고요한하늘... 2012. 4. 10. 15:48

오늘에서야 알게된 PATH_INFO라는 환경 변수 사용하기



API를 제공하는 입장에서 여러가지 형태의 출력을 제공해야 하는 경우가 빈번하다.

기본적으로 csv나 json, xml을 제공해야 하는데

프로세서를 세개띄우고

api.csv.fcgi

api.json.fcgi

api.xml.fcgi

각각 서비스를 할수도 있지만

굳이 이렇게 하지 않아도 아래와 같은 방법으로 처리가 가능한다.


url을 보면


api.fcgi?q=string

라고했을때

fcgi와 ?사이에 문자열을 입력하면


PATH_INFO 라는 환경변수에 저장이 된다.


이것을 이용하면 process를 하나만 실행시키고 PATH_INFO를 파싱해서 출력 포맷을 변경할수 있다.


아래 함수는 PATH_INFO를 파싱하는 함수이다.





void split_path_info( char *path_info, char *appname, char *appext )

{

        char pathinfo[1024], temp[1024], *p, *token, *bp;

        if( getenv("PATH_INFO") == NULL )

                strcpy( pathinfo, "/tgrinder.json");

        else{

                strncpy( pathinfo, getenv("PATH_INFO"), 1020 );

                pathinfo[1024]='\0';

        }

        if((  p = strrchr( pathinfo, '/' )) != NULL )

        {

                *p = '\0'; p++;

                strcpy( path_info, pathinfo );

                strcpy( temp, p );

                if((  token = strtok_r( temp, "." , &bp )) != NULL )

                {

                        strcpy( appname, token );

                        if((  token = strtok_r( NULL, "." , &bp )) != NULL )

                                strcpy( appext, token );

                        else

                                strcpy( appext, DEFAULT_EXT );

                }

                else

                        strcpy( appname, DEFAULT_APPNAME );

        }


}



api.fcgi/program.csv?q=string
api.fcgi/program.json?q=string
api.fcgi/program.xml?q=string

처럼 출력 형태를 변경할수도 있고
api.fcgi/program1.csv?q=string
api.fcgi/program2.csv?q=string
api.fcgi/program3.csv?q=string
처럼 프로그램명을 변경할수도 있다.

그리고
api.fcgi/test1/dir1/program1.csv?q=string
api.fcgi/test2/dir1/program1.csv?q=string
api.fcgi/test3/dir1/program1.csv?q=string

처럼 program앞에 경로를 넣어 활용도 가능하다.





'C언어' 카테고리의 다른 글

external MERGE SORT  (0) 2012.05.24
cpu 사용량  (0) 2012.05.04
mkdir -p 구현  (0) 2012.03.22
STL 디버깅( DEBUGGING )  (0) 2011.12.07
sort ( 파일 내부 엔트리 )  (0) 2011.08.29