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¸¦ ºÒ·¯³»¸é ÇØ´ç ½Ã½ºÅÛÀÇ È¯°æº¯¼ö¸¦ º¼ ¼ö ÀÖ´Ù.

|
ȯ°æº¯¼ö À̸§ |
¼³¸í |
|
SERVER_SOFTWARE |
À¥¼¹öÀÇ À̸§°ú
¹öÀüÀ» ³ªÅ¸³À´Ï´Ù. Çü½Ä: À̸§/¹öÀü
|
|
SERVER_NAME |
¼¹öÀÇ È£½ºÆ®
À̸§°ú DNS
alias ȤÀº IP
address |
|
GATEWAY_INTERFACE |
¼¹öÀÇ CGI ŸÀÔ°ú °³Á¤·¹º§À» ³ªÅ¸³À´Ï´Ù. Çü½Ä: CGI/revision |
|
ȯ°æº¯¼ö À̸§ |
¼³¸í |
|
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·Î ÄÄÆÄÀÏÇϰí À̰ÍÀ» ÀÚ½ÅÀÇ È¨ÆäÀÌÁö Á¦ÀÏ Ã³À½¿¡ ¸µÅ©½ÃÄÑ ³õ°í Á¶±³¿¡°Ô ¸µÅ©ÁÖ¼Ò¿Í ¼Ò½º¸¦ ¸ÞÀÏ·Î º¸³½´Ù.