1. CGI¶õ ¹«¾ùÀΰ¡?

CGI´Â Common Gateway InterfaceÀÇ ¾àÀÚ´Ù. À¥ºê¶ó¿ìÀú¿¡¼­ HTML·Î ¿©·¯°¡Áö Á¤º¸¸¦ ó¸®Çϴµ¥, ±× ±â´É¸¸À¸·Î ¸ðµç Á¤º¸Ã³¸®¸¦ ´Ù ÇÒ ¼ö ¾ø´Ù. À̰ÍÀ» º¸ÃæÇϱâ À§ÇÑ ¿ÜºÎ ÇÁ·Î±×·¥°ú À¥¼­¹ö(HTTP Server) °£ÀÇ ¿¬°á ¿ªÇÒÀ» Çϱâ À§ÇÑ ±Ô¾àÀÌ CGIÀÌ´Ù.

 

¶Ç´Â ³ÐÀº Àǹ̷ΠCGI¸¦ ¼öÇàÇÏ´Â ¿ÜºÎ ÇÁ·Î±×·¥À» Æ÷ÇÔÇÏ¿© ¸»Çϱ⵵ ÇÑ´Ù. ¿¹¸¦ µé¾î, ȨÆäÀÌÁö¿¡ ¹æ¹®°´µéÀÇ comment¸¦ ¹ÞÀ» ¼ö ÀÖ´Â ¹æ¸í·ÏÀ» ¸¸µé·Á°í ÇÒ ¶§, À¥¿¡¼­ ±¸ÇöÇÏ´Â HTML¸¸À¸·Î´Â ÇØ°áÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ¿ÜºÎ ÇÁ·Î±×·¥ÀÌ ÇÊ¿äÇѵ¥, ÀÌ ¶§ ¿ÜºÎ ÇÁ·Î±×·¥°ú À¥ °£¿¡ ¼­·Î ÁÖ°í ¹ÞÀ» ¼ö ÀÖ´Â ±Ô¾àÀ» CGI¶ó°í Çϰí, ±× ¶§ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥À» gatewayÇÁ·Î±×·¥À̶ó°í Çϴµ¥ À̰ÍÀ» ÈçÈ÷ CGI ÇÁ·Î±×·¥(ȤÀº ½ºÅ©¸³Æ®)À̶ó°í ÇÑ´Ù. ÀÌ CGIÇÁ·Î±×·¥Àº Åë»óÀûÀ¸·Î C/C++ ³ª PERLȤÀº UNIX Shell, Tcl/Tk µîÀ» »ç¿ëÇÏ¿© ±¸ÇöÇÑ´Ù.

 

ÀÌ CGI¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â º¸Åë À¥ ÂÊ¿¡¼­´Â FORM ÅÃÀ» ÅëÇØ¼­ »ç¿ëÀÚÀÇ ÀԷ°ªµéÀ» À¥¼­¹ö(httpd)·Î º¸³»°í, ¼­¹ö¿¡¼­´Â ±× °ªÀ» CGIÇÁ·Î±×·¥¿¡°Ô ÀԷ°ªµéÀ» ³Ñ°ÜÁØ´Ù.

 

 

À§ÀÇ ±×¸²À» º¸°í µ¥ÀÌŸÀÇ È帧À» ¾Ë¾Æ º¸¸é,

 

1) Ŭ¶óÀ̾ðÆ®(À¥ºê¶ó¿ìÀú)¿¡¼­ ¼­¹ö·Î TCP/IP ¿¬°áÀ» ÅëÇØ µ¥ÀÌŸ ¿äû

2) ¼­¹ö°¡ CGIÇÁ·Î±×·¥¿¡°Ô ½ÇÇàÀ» Çϵµ·Ï ¿äûÀ» °Ç³×ÁÖ±â

3) CGIÇÁ·Î±×·¥¿¡¼­ ¼­¹ö·Î Ãâ·ÂÀÌ Àü´Þ

4) ÀûÀýÇÑ MIMEÇì´õ¸¦ °®°í ¼­¹ö°¡ Ŭ¶óÀÌ¾ðÆ®·Î ÀÀ´äÇÑ ÈÄ, ¿¬°áÀÌ ÇØÁ¦

 

2. C-CGI·Î Hello CGI World¸¦ À¥ ºê¶ó¿ìÀú¿¡ printÇϱâ

(ÁÖÀÇ [ID]´Â ÀÚ½ÅÀÇ °èÁ¤À» ¸»ÇÑ´Ù.)

1) pshell¿¡ ·Î±äÇÑ´Ù.

2) /usr/local/apache/cgi-bin/[ID]¿¡ Hello.c ÆÄÀÏÀ» ¸¸µç´Ù.

#include<stdio.h>

int main()

{

   printf("Content-type: text/html\n\n");   //CGI¹®¼­¶ó´Â °ÍÀ» ¾Ë·ÁÁÖ´Â °ÍÀ¸·Î

                                   // ¹Ýµå½Ã ÀÖ¾î¾ß ÇÑ´Ù.

   printf("<H1>Hello CGI World!!! </H1><P>\n");

}

3) cc –o Hello.cgi Hello.c

4) http://pshell.postech.ac.kr/cgi-bin/[ID]/Hello.cgi

 

3. CGI Library

À¥ºê¶ó¿ìÀú´Â °ø¹éÀº +·Î ÀνÄÇϸç %·Î ½ÃÀÛÇÏ´Â 2¹ÙÀÌÆ® 16Áø¼ö°ª(%XX)À» »ç¿ëÇÑ´Ù.  À̰ÍÀº ´ÙÀ½°ú °°Àº ¿¹¿¡¼­ ³ªÅ¸³­´Ù.  ÀÌ ¿¹´Â °Ë»ö¿£Áø¿¡¼­ °Ë»ö°á°ú¸¦ º¸¿©ÁÙ ¶§ ³ªÅ¸³ª´Â ¹®ÀÚÀÌ´Ù.

http://www.lycos.co.kr/srch/?lpv=1&loc=searchhp&query=%B3%EB%B6%F3

¶ÇÇÑ ¿¹¿¡¼­ º¸¸é ?¿Í =ÀÌ »ç¿ëµÈ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.  ÀÌ ¸»Àº ´Ù½Ã ¸»Çؼ­ C·Î CGIÇÁ·Î±×·¡¹ÖÀ» ÇÏ·Á¸é °ø¹é(+), %XX, ?, =µîÀ» 󸮸¦ ÇØ°¡¸é¼­ ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ß ÇÑ´Ù´Â À̾߱â ÀÌ´Ù.  ÀÌ·± °ÍÀ» º»ÀÎÁö Á÷Á¢ ¸¸µé¾î ó¸®ÇÏ·Á¸é ½±Áö ¾ÊÁö¸¸ ´ÙÀ½°ú °°Àº ¶óÀ̺귯¸®¸¦ ÅëÇØ ½±°Ô ó¸®ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ ¶óÀ̺귯¸®´Â À§ÀÇ ±ÛÀÚ¸¦ ó¸®ÇØ ÁÖ´Â °Í ¿Ü¿¡µµ À¯¿ëÇÑ ÇÔ¼ö¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.  Âü°í·Î ¿©±â¼­ ¼Ò°³ÇÏ´Â ¶óÀ̺귯¸®´Â °¡Àå °øÅëÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ´Â C-CGI¶óÀ̺귯¸®À̸ç ÀÎÅͳÝÀ» ã¾Æº¸¸é °í±Þ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ ¶óÀ̺귯¸®µµ ã¾Æº¼ ¼ö ÀÖ´Ù. 

1) cgiutil.h

//°¢ ÇÔ¼ö¿¡ ´ëÇÑ ¼³¸íÀº cgiutil.c¿¡ ÁÖ¼® ó¸® ÇØ ³õ¾ÒÀ¸´Ï Áö±Ý ÀоÀÚ.

void getword(char *word, char *line, char stop);
char *makeword(char *line, char stop);
char *fmakeword(FILE *f, char stop, int *cl);
char *smakeword(char *str, char stop, int *cl);
char x2c(char *what);
void unescape_url(char *url);
void plustospace(char *str);
int  ind(char *s, char c);
int  rind(char *s, char c);
int  getline(char *s, int n, FILE *f);
void send_fd(FILE *f, FILE *fd);
void escape_shell_cmd(char *cmd);
char *rmCtrlChar(char *str);
char *rmCrLf(char *str);
void prtErrMsg(char *str);
void back(void);

2) cgiutil.h, cgiutil.c¸¦ AFSÀÇ cs103b/asn5¿¡ ³Ö¾î³õ°Ú´Ù.

 

4. CGI ȯ°æº¯¼ö

CGIÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§Çؼ­´Â ÀÌ È¯°æº¯¼ö¸¦ Àß ÀÌÇØÇØ¾ß ÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ¿äûÇÏ¿© gatewayÇÁ·Î±×·¥ÀÌ ¼öÇàµÇ¸é ÀÏ·ÃÀÇ È¯°æº¯¼ö°¡ ³Ñ¾î¿Â´Ù. ÀÌ È¯°æº¯¼ö´Â Å©°Ô µÎ Á¾·ù·Î ³ª´­ ¼ö ÀÖ´Ù. Áï, ÇÑ Á¾·ù´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû°ú ¹«°üÇÑ °ÍÀ¸·Î, ¼­¹ö metainformation À̶ó°í ÀÏÄ´ ¼­¹öÀÇ Á¤º¸¿¡ °üÇÑ °ªµéÀÌ´Ù. ¶Ç ÇÑ Á¾·ù·Î´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ µû¶ó °ªÀÌ ´Þ¶óÁö´Â °ÍµéÀÌ´Ù.

ÀÌ È¯°æº¯¼öµéÀ» º¼ ¼ö ÀÖ´Â ÇÑ ¹æ¹ýÀ¸·Î´Â ÀÚ½ÅÀÇ À¥ºê¶ó¿ìÀú¿¡¼­http://pshell.postech.ac.kr /cgi-bin/test-cgi ÀÇ URL·Î test-cgi¸¦ ºÒ·¯³»¸é ÇØ´ç ½Ã½ºÅÛÀÇ È¯°æº¯¼ö¸¦ º¼ ¼ö ÀÖ´Ù.

 

1) ¼­¹ö¿¡ ´ëÇÑ HTTP Á¤º¸¸¦ ³ªÅ¸³»´Â ȯ°æº¯¼öµé

ȯ°æº¯¼ö À̸§

¼³¸í

SERVER_SOFTWARE

À¥¼­¹öÀÇ À̸§°ú ¹öÀüÀ» ³ªÅ¸³À´Ï´Ù. Çü½Ä: À̸§/¹öÀü

SERVER_NAME

¼­¹öÀÇ È£½ºÆ® À̸§°ú DNS alias ȤÀº IP address

GATEWAY_INTERFACE

¼­¹öÀÇ CGI ŸÀÔ°ú °³Á¤·¹º§À» ³ªÅ¸³À´Ï´Ù. Çü½Ä: CGI/revision

2) Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ µû¸¥ ȯ°æº¯¼öµé

ȯ°æº¯¼ö À̸§

¼³¸í

SERVER_PROTOCOL

Ŭ¶óÀÌ¾ðÆ® ¿äûÀÌ »ç¿ëÇÏ´Â ÇÁ·ÎÅäÄÝ. º¸Åë HTTP 1.0 ȤÀº HTTP 1.1

SERVER_PORT

Ŭ¶óÀÌ¾ðÆ® ¿äûÀ» º¸³»´Â Æ÷Æ® ¹øÈ£.

REQUEST_METHOD

HTML ÆûÀÌ »ç¿ëÇÏ´Â METHOD º¸Åë GETÀ̳ª POST

PATH_INFO

Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ Àü´ÞµÇ´Â Ãß°¡ PATH Á¤º¸. ÀÌ È¯°æº¯¼ö¸¦ ÀÌ¿ëÇÏ¿© ½ºÅ©¸³Æ®¸¦ ºÎ¸¦ ¼ö ÀÖ½À´Ï´Ù.

PATH_TRANSLATED

PATH_INFO¿¡ ³ªÅ¸³­ °¡»ó °æ·Î(path)¸¦ ½ÇÁ¦ÀÇ ¹°¸®ÀûÀÎ °æ·Î·Î ¹Ù²ï °ª.

SCRIPT_NAME

ÇöÀç ½ÇÇàÀÌ ¿äûµÈ ½ºÅ©¸³Æ® ¸í

QUERY_STRING

GET ¹æ½Ä¿¡¼­ URLÀÇ µÚ¿¡ ³ª¿À´Â Á¤º¸¸¦ ÀúÀåÇϰųª ÆûÀÔ·Â Á¤º¸¸¦ ÀúÀåÇÕ´Ï´Ù.(POST¹æ½ÄÀº Á¦¿Ü)

REMOTE_ADDR

Ŭ¶óÀ̾ðÆ®ÀÇ IPÁÖ¼Ò

REMOTE_HOST

Ŭ¶óÀ̾ðÆ®ÀÇ È£½ºÆ® À̸§

REMOTE_USER

¼­¹ö°¡ »ç¿ëÀÚ ÀÎÁõÀ» Áö¿øÇϰí, ½ºÅ©¸³Æ®°¡ ±× È®ÀÎÀ» ¿äûÇÑ´Ù¸é, À̰ÍÀÌ È®ÀÎµÈ »ç¿ëÀÚÀ̸§ÀÌ µË´Ï´Ù.

REMOTE_IDENT

¼­¹ö°¡ RFC931 »ç¿ëÀÚ È®ÀÎÀ» Áö¿øÇÑ´Ù¸é ¼­¹ö·ÎºÎÅÍ ¹ßÃéµÈ »ç¿ëÀÚ À̸§ÀÌ ÀÌ È¯°æº¯¼ö¿¡ ÀúÀåµÈ´Ù. ÀÌ º¯¼ö ÀÇ ¿ëµµ´Â ·Î±×Àο¡¸¸ ÇÑÁ¤µË´Ï´Ù.

CONTENT_LENGTH

POST¹æ½ÄÀÏ °æ¿ì Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ³Ñ°Ü Áö´Â »ç¿ëÀÚ ÀÔ·ÂÀÇ ±æÀ̸¦ Ç¥½ÃÇÕ´Ï´Ù.

CONTENT_TYPE

POST¹æ½ÄÀ» ÀÌ¿ëÇÏ¿© °Ë»ö¹®¿¡ Á¤º¸°¡ µé¾îÀÖ´Â °æ¿ì¿¡ ±× Á¤º¸ÀÇ Å¸ÀÔÀ» ³ªÅ¸³À´Ï´Ù.

HTTP_USER_AGENT

Ŭ¶óÀ̾ðÆ®ÀÇ »ç¿ë ÇÁ·Î±×·¥(À¥ºê¶ó¿ìÀú)À» Ç¥½ÃÇÕ´Ï´Ù.

 

 

3) ȯ°æº¯¼ö¸¦ CGI ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇϱâ

ȯ°æº¯¼ö¸¦ CGIÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏ´Â Çü½ÄÀº °£´ÜÇÏ´Ù. PERL¿¡¼­´Â $ENV{'ȯ°æº¯¼öÀ̸§'} ÀÇ Çü½ÄÀ¸·Î ȯ°æº¯¼öµéÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. C¿¡¼­´Â getenv("ȯ°æº¯¼öÀ̸§") ÀÇ Çü½ÄÀ¸·Î ÂüÁ¶ÇÑ´Ù.

 

ex) Hello CGI World¿¡ ´ÙÀ½À» ÀÔ·ÂÇØ º¸ÀÚ.

printf("<B>%s</B>\n", getenv("SERVER_SOFTWARE"));

 

 

5. ÀԷ°ª Àü´Þ ¹æ½Ä get/post

// get¹æ½ÄÀº URL¿¡¼­ ÀÔ·ÂÀÎÀÚ¸¦ Á÷Á¢ÁÖ´Â °ÍÀ̰í post¹æ½ÄÀº html formÀ» »ç¿ëÇÑ´Ù°í ½±°Ô »ý°¢ÇÏÀÚ.

// Áö±Ý ½Ç½ÀÇÒ *.cÆÄÀÏÀ» cs103b/asn5¿¡ ³Ö¾î³õ°Ú´Ù.  ¿©·¯ºÐµéÀÌ asn5¸¦ ÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ¿¹Á¦µéÀÌ´Ù.

 

À¥ ÂÊ¿¡¼­ ÀԷ°ªµéÀ» ³Ñ°ÜÁÖ´Â FORMÅÃÀÇ ±¸¼ºÀº º¸Åë ´ÙÀ½°ú °°´Ù.

<FORM METHOD=get/post ACTION="http://www.abc.com/cgi-bin/abc.cgi">

 

¹°·Ð À̰ÍÀº º¸ÆíÀûÀ¸·Î »ç¿ëÇÏ´Â °æ¿ìÀÇ ¿¹À̰í, ÀÌ FORMÅÿ¡´Â ´Ù¸¥ ¸¹Àº ¼Ó¼ºµéÀÌ ÀÖ´Ù..  ¿©±â¼­ METHOD´Â post¿Í get µÎ °³ÀÇ ¹æ½ÄÀÌ Àִµ¥, ÀÌ ¹æ½Ä¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ.

 

1) get method

FORMÅÿ¡ METHOD=getÀ¸·Î Çϰųª »ý·«ÇÏ¸é »ç¿ëÀÚÀÇ ÀԷ°ªµéÀÌ È¯°æº¯¼ö(Environment Variable)¿¡ ÀúÀåµÇ¾î ³Ñ°ÜÁø´Ù. Áï °¢ ÀԷ°ªµéÀÌ ±âº»URL¿¡ ºÙ´Â Àμö(PARAMETER)·Î¼­ ÷°¡µÇ¾î CGIÇÁ·Î±×·¥À¸·Î °ªÀ» ³Ñ°Ü ÁÖ°Ô µÈ´Ù.

¹°·Ð ÀÌ get METHOD´Â FORMÅÃÀ» »ç¿ëÇÏÁö ¾Ê°í ¹Ù·Î URL¿¡ Àμö¸¦ ÷°¡ÇÏ¿© »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

 

¿¹¸¦ µé¾î, http://www.abc.com/cgi-bin/abc.cgi?First+Name=foo&Last+Name=bar ¿Í °°Àº Çü½ÄÀ¸·Î »ç¿ëµÈ´Ù.

 

ÀÌ GET METHOD¸¦ ÀÌ¿ëÇÏ¸é ±× ÀԷ°ªµéÀÌ È¯°æº¯¼öÀÇ ÇϳªÀÎ QUERY_STRING ¿¡ µé¾î°¡¼­ Àü´ÞµÇ´Âµ¥, CGI½ºÅ©¸³Æ®´Â ±× QUERY_STRING¿¡ µé¾î ÀÖ´Â °ªÀ» ÀнÀ´Ï´Ù. ÀÌ ¶§ ±× °ªµéÀº ÀÔ·ÂµÈ ±×´ë·Î ³Ñ¾î°¡´Â °ÍÀÌ ¾Æ´Ï¶ó ¼­¹ö¿¡ ÀÇÇØ ¿©·¯°¡Áö·Î º¯È¯(ÀÎÄÚµù)µÇ¾î ³Ñ¾î°¡´Âµ¥ CGI½ºÅ©¸³Æ®¿¡¼­´Â ±× °ªµéÀ» ÇØµ¶(decoding)ÇØ¾ß ÇÑ´Ù.

 

ÀÌ GET METHOD´Â º¸Åë ÀԷ°ªµéÀÌ ¸¹Áö ¾Ê´Â °æ¿ì ȤÀº ±×³É URL¿¡ ºÙ´Â ÆÄ¶ó¹ÌÅÍ·Î ³Ñ°Ü¼­ CGI½ºÅ©¸³Æ®·Î Àü´ÞÇÒ ¶§¿¡ »ç¿ëÇÑ´Ù.

 

ex) ´ÙÀ½ URLÀ» ´«¿©°Ü º¸ÀÚ. 

?na=1&na=2ÀÇ Àǹ̸¦ Á¤È®ÇÏ°Ô ¾ËÀÚ.

 

// ¼Ò½º¿¡¼­ À§ÀÇ °á°ú°¡ ¾î¶»°Ô ³ª¿À´Â °ÍÀÎÁö ºÐ¼®ÇØ º¸ÀÚ.

<form-get.cÀÇ ¼Ò½º>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cgiutil.h"

typedef struct {
    char name[128];
    char value[128];
} ENTRY;


void main(void)
{
    ENTRY entVal[10000];
    int i, m = 0;
    char *qs;

    /* MIME
Çì´õ Àü´Þ */
    printf("Content-type: text/html\n\n");

    /*
Æû Àü´Þ ¹æ¹ý(Method)ÀÌ GETÀÌ ¾Æ´Ï¸é Á¾·á */
    if(strcmp(getenv("REQUEST_METHOD"), "GET"))
        exit(1);

    /*
ÁúÀǹ®ÀÚ¿­À» qs°¡ °¡¸®Å°µµ·Ï ÇÔ */
    qs = getenv("QUERY_STRING");

    /*
ÁúÀǹ®ÀÚ¿­ÀÌ ¾øÀ¸¸é Á¾·á */
    if(qs == NULL)
        exit(1);

    /*
ÁúÀǹ®ÀÚ¿­ÀÌ '\0'ÀÏ ¶§±îÁö name/value½ÖÀ» Àоî entVal¿¡ ÀúÀå */
    for(i = 0; qs[0] != '\0'; i++) {
        m = i;  /* name/value
½ÖÀÇ ÃÑ °³¼ö */

        /* name/value
½ÖÀº '&' ¹®ÀÚ·Î ±¸ºÐÇϹǷΠ±× °ªÀ»
           entVal[i].value
¿¡ ³Ö°í */
        getword(entVal[i].value, qs, '&');

        /* entVal[i].value
ÀÇ ¸ðµç '+' ¹®ÀÚ¸¦ °ø¹éÀ¸·Î ¹Ù²Û ´ÙÀ½ */
        plustospace(entVal[i].value);

        /* %
·Î ½ÃÀÛÇÏ´Â 2¹ÙÀÌÆ® 16Áø¼ö°ªÀº '%xx' ÇØ´ç ¹®ÀÚ·Î ¹Ù²Ù°í */
        unescape_url(entVal[i].value);

        /*
¸¶Áö¸·À¸·Î name°ú value¸¦ '=' ¹®ÀÚ·Î ±¸ºÐ Áö¾î °¢°¢
           entVal[i].name
°ú entVal[i].value¿¡ ÀúÀå */
        getword(entVal[i].name, entVal[i].value, '=');
    }

    /*
ÁúÀÇ °á°ú Ãâ·Â */
    printf("<H1>
ÁúÀÇ °á°ú</H1><P>");
    for(i = 0; i <= m; i++)
        printf("<FONT     SIZE=+2>%s      =     %s</FONT><BR>\n",     entVal[i].name,
entVal[i].value);
}

 

2) post method

FORMÅÿ¡¼­ METHOD=post·Î Çϸé, get METHOD°¡ ȯ°æº¯¼öÁßÀÇ ÇϳªÀÎ QUERY_STRINGÀ» ÅëÇØ Àü´ÞµÇ´Â °Í°ú ´Þ¸® stdin(standard input:Ç¥ÁØÀÔ·Â) À» ÅëÇØ¼­ Àü´ÞµÈ´Ù.  get METHOD°¡ Àμö¸¦ ÅëÇØ¼­ Àü´ÞµÇ¹Ç·Î Ä¿¸Çµå¶óÀÎ ÀÇ ±æÀÌ¿¡ ÀÇÇÑ Á¦ÇÑÀ» ¹Þ´Â ¹Ý¸é¿¡, post METHOD´Â stdinÀ» ÀÌ¿ëÇϹǷΠµ¥ÀÌŸ¾çÀÇ Á¦ÇÑÀÌ ¾ø´Ù. ¶ÇÇÑ post METHOD¿¡¼­µµ ȯ°æº¯¼öµéÀº stdin°ú ÇÔ²² Àü´ÞµÈ´Ù. ±×¸®°í post¹æ½Äµµ ¸¶Âù°¡Áö·Î ÀԷ°ªµéÀÌ encodingµÇ¾î ³Ñ¾î¿ÈÀ¸·Î CGI¿¡¼­ ±× °ªµéÀ» decodingÇØ¾ß ÇÑ´Ù.

ex) ´ÙÀ½°ú °°Àº Æû¿¡¼­ ´ÙÀ½ ±ÛÀÚ¸¦ ÀÔ·ÂÇϸé

 

´ÙÀ½°ú °°Àº °á°ú¸¦ º¸¿©ÁÖ´Â cgiÇÁ·Î±×·¥ÀÌ´Ù.

 

<form-post.cÀÇ ¼Ò½º>

// ¼Ò½º¸¦ º¸¸é¼­ À§ÀÇ °á°ú°¡ ¾î¶»°Ô Ãâ·ÂµÇ¾ú´ÂÁö Á¤È®ÇÏ°Ô ¾ËÀÚ.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#include "cgiutil.h"

 

typedef struct {

    char *name;

    char *value;

} ENTRY;

 

 

void main(void)

{

    ENTRY entVal[10000];

    int i, m = 0;

    int cl;

 

    /* MIME Çì´õ Àü´Þ */

    printf("Content-type: text/html\n\n");

 

    /* Æû Àü´Þ ¹æ¹ý(Method)ÀÌ POST°¡ ¾Æ´Ï¸é Á¾·á */

    if(strcmp(getenv("REQUEST_METHOD"), "POST"))

        exit(1);

 

    /* FORM ÀÎÄÚµù ŸÀÔÀÌ POSTÀÇ µðÆúÆ® ÀÎÄÚµù ¹æ½ÄÀÎ

       'application/x-www-form-urlencoded'°¡ ¾Æ´Ï¸é Á¾·á */

    if(strcmp(getenv("CONTENT_TYPE"), "application/x-www-form-urlencoded"))

        exit(1);

 

    /* Æûµ¥ÀÌÅÍÀÇ ÃÑ ±æÀÌ */

    cl = atoi(getenv("CONTENT_LENGTH"));

 

    /* Ç¥ÁØÀԷ¿¡¼­ cl¸¸Å­ name/value½ÖÀ» Àоî entVal¿¡ ÀúÀå */

    for(i = 0; cl && (!feof(stdin)); i++) {

        m = i;

        entVal[i].value = fmakeword(stdin, '&', &cl);   /* name/value¸¦ &·Î ±¸ºÐ */

 

        /* CGI µðÄÚµù */

        plustospace(entVal[i].value);   /* '+'´Â ' 'À¸·Î */

        unescape_url(entVal[i].value);  /* %xx´Â ascii·Î */

        entVal[i].name = makeword(entVal[i].value, '='); /* VALUE¿Í NAME°ªÀ» '=' ¹®ÀÚ·Î ±¸ºÐ */

    }

 

    /* ÁúÀÇ °á°ú È­¸é Ãâ·Â */

    printf("<H1>ÁúÀÇ °á°ú</H1><P>");

    for(i = 0; i <= m; i++)

        printf("<FONT     SIZE=+2>%s      =     %s</FONT><BR>\n",     entVal[i].name,

entVal[i].value);

}

 

5. Á¦Ãâ¹°

// À̹ø Á¦Ãâ¹°Àº ½±Áö ¾ÊÀ¸¹Ç·Î Á¶±³°¡ Àû´çÇÑ ½Ã°£À» ÁØ´Ù.(4ÀÏÁ¤µµ)

1) form-get.c¿Í form-post.c¿¡¼­ »ç¿ëµÈ libraryÇÔ¼öÀÇ ¼³¸í°ú »ç¿ë¹ýÀ» ¸ÞÀÏ·Î Á¦ÃâÇÑ´Ù.

2) ÀÚ½ÅÀÇ °Ô½ÃÆÇ¿¡ ¾²¿©Áú ÀڷḦ ÀԷ¹޴ formÀ» ¼³°èÇϰí À̰ÍÀ» post¹æ½ÄÀ¸·Î ÀÔ·Â¹Þ¾Æ À¥¿¡ º¸¿©ÁÖ´Â .cÆÄÀÏÀ» ¸¸µé¾î .cgi·Î ÄÄÆÄÀÏÇϰí À̰ÍÀ» ÀÚ½ÅÀÇ È¨ÆäÀÌÁö Á¦ÀÏ Ã³À½¿¡ ¸µÅ©½ÃÄÑ ³õ°í Á¶±³¿¡°Ô ¸µÅ©ÁÖ¼Ò¿Í ¼Ò½º¸¦ ¸ÞÀÏ·Î º¸³½´Ù.