CGIÀÇ ÀÔ·Â ¹®ÀÚ¿À» µðÄÚµùÇÏ°í °¢ º¯¼öÀÇ À̸§°ú °ªµéÀ» ÃßÃâÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
1: $method = $ENV{'REQUEST_METHOD'};
2: $length = $ENV{'CONTENT_LENGTH'};
3:
4: if($method eq 'GET' || $method eq 'HEAD') { # GET ¹æ¹ý
5: $inputstring = $ENV{'QUERY_STRING'};
6: } elsif($method eq 'POST') { # POST »ç¿ë
7: $ret = read(STDIN, $inputstring, $length);
8: if($ret != $length) {
9: &cgi_die("¿À·ù",
"STDINÀ» Àд Áß¿¡ ¾Ë ¼ö ¾ø´Â ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù");
10: }
11: } else {
12: print "Off-Line Mode: name1=value1&name2=value2\n";
13: chop($inputsting = <STDIN>);
14: }
15:
16: @in = split(/&/, $inputstring);
17: for(0 .. $#in) { # 0 À妽ººÎÅÍ ¸¶Áö¸· À妽º±îÁö
18: $in[$_] =~ s/\+/ /g; # '+'¸¦ °ø¹é¹®ÀÚ·Î
19: ($name, $value) = split(/=/, $in[$_], 2);
20:
21: # %HH Çü½ÄÀ» ÇØ´ç ¹®ÀÚ·Î ¹Ù²Þ
22: $name =~ s/%(..)/pack("c", hex())/ge;
23: $value =~ s/%(..)/pack("c", hex())/ge;
24:
25: # ¿¬°ü ¹è¿ ±¸¼º
26: $in{$name} .= "$inputstring = $ENV{'QUERY_STRING'};
" if defined($in{$name});
27: $in{$name} .= $value;
28: }
»ç¿ëÀÚ ÀÔ·Â Àбâ
»ç¿ëÀÚÀÇ ÀÔ·ÂÀº ¿äûÇÑ ¹æ¹ýÀÌ GETÀÌ³Ä POSTÀ̳Ŀ¡ µû¶ó ´Þ¶óÁø´Ù. µû¶ó¼ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ÀбâÀ§Çؼ´Â ¸ÕÀú REQUEST_METHOD¸¦ ÀÌ¿ëÇؼ ¿äû ¹æ¹ýÀ» ÆÇÁ¤ÇØ¾ß ÇÑ´Ù.
GET
»ç¿ëÀÚÀÇ ¿äû ¹æ¹ýÀÌ GETÀÎ °æ¿ì »ç¿ëÀÚÀÇ ÀÔ·ÂÀº QUERY_STRINGÀ̶ó´Â ȯ°æ º¯¼ö¿¡ ÀúÀå µÇ¹Ç·Î %ENV¸¦ ÀÌ¿ëÇؼ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ÀÐÀ¸¸é µÈ´Ù.
@query = <STDIN>; # STDINÀ¸·Î Àü´ÞµÇ´Â ¸ðµç °ªÀ» ÀÐÀ½
# <INPUT> ű×ÀÇ TypeÀ» FILE·Î ÇÏ°í
# <FORM> ű×ÀÇ ENCTYPEÀ» multipart/form-data·Î
# ÇÑ°æ¿ì¿¡ »ç¿ëµÈ´Ù.
$query = <STDIN>; # STDINÀ¸·Î Àü´ÞµÇ´Â °ªÁß ÇÑÁÙ¸¸ Àд´Ù.
# Method°¡ POSTÀÎ °æ¿ì¿¡ »ç¿ë.
$ret = read(STDIN, $inputstring, $length);
# Method°¡ POSTÀÎ °æ¿ì, ÀüºÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
# ÀÐÀ» ¹ÙÀÌÆ®ÀÇ ¼ö´Â CONTENT_LENGTH·Î ÆÇÁ¤ÇÑ´Ù.
POST
»ç¿ëÀÚÀÇ ¿äû¹æ¹ýÀÌ POST¶ó¸é »ç¿ëÀÚÀÇ ÀÔ·Â STDINÀ» ÅëÇØ Àü´ÞµÈ´Ù. µû¶ó¼ »ç¿ëÀÚÀÇ ÀÔ·ÂÀº ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÀÐÀ» ¼ö ÀÖ´Ù.
read FILEHANDLE,SCALAR,LENGTH
read FILEHANDLE,SCALAR,LENGTH,OFFSET
FILEHANDLE : ÀаíÀÚÇÏ´Â ÆÄÀÏÇÚµé.
SCALAT : ÀÐÀº ³»¿ëÀ» ÀúÀåÇÒ ½ºÄ®¶óº¯¼ö
LENGTH : ÀÐÀ» ¹ÙÀÌÆ®ÀÇ ¼ö
OFFSET : °Ç³Ê¶Û ¹ÙÀÌÆ®ÀÇ ¼ö
@query = <STDIN>;
Method°¡ POSTÀÎ °æ¿ì »ç¿ëÀÚÀÇ ÀÔ·ÂÀº STDINÀ¸·Î Àü´ÞµÈ´Ù. ÆÞ¿¡¼´Â ÆÄÀÏÇÚµéÀ» ó¸®ÇÏ´Â »ó´çÈ÷ ´Ù¾çÇÑ ¹æ¹ýÀ» Á¦°øÇϴµ¥, ±×Áß Çϳª°¡ <> ¿¬»êÀÚ ÀÌ´Ù. <> ¿¬»êÀÚ´Â ¾Õ¾î ¾ð±ÞÇßµç ÆÄÀÏÀ» ÀÐÀ» ¶§ ÁÙ´ÜÀ§(°³Ç๮ÀÚ±îÁö)·Î Àд´Ù.
<STDIN>À» @query¿Í °°ÀÌ ¹è¿(¹è¿È¯°æ)·Î ¹ÞÀ¸¸é ÇÑÁÙÀ̾ƴ϶ó STDINÀ¸·Î Àü´ÞµÈ ¸ðµç µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ´Ù.
ÀÌ ¹æ¹ýÀº ÁÖ·Î <INPUT> ű×ÀÇ TypeÀ» FILE·Î ÇÏ°í <FORM> ű×ÀÇ ENCTYPEÀ» multipart/form-data·Î ÇÑ°æ¿ì¿¡ »ç¿ëµÈ´Ù.
$query = <STDIN>;
À§ÀÇ ¹®Àå°ú µ¿ÀÏÇÑ ¹®ÀåÀÌ´Ù. ´Ù¸¸ <STDIN>À» $query(½ºÄ®¶ó ȯ°æ)·Î ¹ÞÀ¸¸é STDINÀ¸·Î Àü´ÞµÈ µ¥ÀÌÅÍÀÇ ÀüºÎ°¡ ¾Æ´Ï¶ó ¿À·ÎÁö ÇÑÁÙ¸¸ ÀаԵȴÙ.
ÀÌ ¹æ¹ýÀº ÁÖ·Î <FORM> ű×ÀÇ Method°¡ POSTÀÌ°í, ENCTYPEÀÌ application/x-www-form-urlencodedÀÎ °æ¿ì¿¡ »ç¿ëµÈ´Ù.
$ret = read(STDIN, $inputstring, $length);
STDINÀ» <> ¿¬»êÀÚ¸¦ »ç¿ëÇؼ Àд °æ¿ì Àü¼ÛµÈ µ¥ÀÌÅ͸¦ À߸øÀÐÀ» ¼ö ÀÖÀ¸¸ç, ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ì¿¡µµ ¿À·ù°¡ ¹ß»ýÇÑ »ç½ÇÀ» ¾Ë ¼ö ¾ø´Ù. µû¶ó¼ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ó¸®ÇÏ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀº read ÇÔ¼öÀÌ´Ù.
»ç¿ëÇü½Ä
if($ret != $length) {
&cgi_die("¿À·ù", "STDINÀ» Àд Áß¿¡ ¾Ë ¼ö ¾ø´Â ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù");
}
¼³¸í
read ÇÔ¼ö´Â FILEHANDLE·ÎºÎÅÍ µ¥ÀÌÅ͸¦ LENGTH ¹ÙÀÌÆ®¸¸Å Àоî SCALAR º¯¼ö¿¡ ÀúÀåÇϸç ÀÐÀ» ¹ÙÀÌÆ® ¼ö¸¦ ¸®ÅÏÇÑ´Ù.
µû¶ó¼ read ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ ÆÄÀÏÇÚµéÀ» Àд °æ¿ì ¸®ÅÏ °ª°ú LENGTH¸¦ Á¶»çÇؼ µ¥ÀÌÅÍ°¡ Á¤»óÀûÀ¸·Î ÀÐÇôÁ³´ÂÁö´Â Á¶»çÇØ¾ß ÇÑ´Ù.
print "Off-Line Mode: name1=value1&name2=value2\n";
chop($inputsting = <STDIN>); # Å°º¸µå¿¡¼ Á÷Á¢Àд °ÍÀ̹ǷΠchop ÇÔ¼ö¸¦
# ÀÌ¿ëÇؼ °³Ç๮ÀÚ¸¦ »èÁ¦ÇÑ´Ù.
GETÀ̳ª POST°¡ ¾Æ´Ñ °æ¿ì.
»ç¿ëÀÚÀÇ ¿äûÀÌ GETÀ̳ª POST°¡ ¾Æ´Ñ °æ¿ì´Â Unix ¸í·ÉÇà¿¡¼ CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÑ °æ¿ìÀÌ´Ù.
ÀϹÝÀûÀ¸·Î CGI ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °ÍÀº »ó´çÈ÷ ±î´Ù·Î¿îµ¥ ±× ÀÌÀ¯´Â CGI ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀº À¥»ó¿¡¼¸¸ ÁÖ¾îÁö¸ç, Unix ¸í·ÉÇà¿¡¼´Â ±× ÀÔ·ÂÀ» ÁÙ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
µû¶ó¼ Method°¡ GETÀ̳ª POST°¡ ¾Æ´Ñ °æ¿ì¿¡´Â CGI ÀÔ·ÂÀ» ¸í·ÉÇà¿¡¼ ÀоîµéÀ̵µ·Ï ó¸®ÇÑ °ÍÀÌ´Ù. Áï, CGI¸¦ Unix ¸í·ÉÇà¿¡¼ ½ÇÇàÇÏ°í URL ÀÎÄÚµù Çü½ÄÀ¸·Î ÀÔ·ÂÀ» ÁÖ¸éµÈ´Ù.
name1=value1&name2=value2&name2=value2&name2=value2&name2=value2&name2=value2
name=value ½Ö ºÐ¸®
À§ÀÇ ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é ¿äû¹æ¹ýÀÌ ¹«¾ùÀ̵çÁö »ç¿ëÀÚÀÇ ÀÔ·ÂÀº $inputstring¶ó´Â º¯¼ö¿¡ ÀúÀåµÇ¸ç »ç¿ëÀÚÀÇ ÀÔ·ÂÀº URL ÀÎÄÚµùµÇ¼ Àü´ÞµÇ¹Ç·Î ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®°ÔµÈ´Ù.
16: @in = split(/&/, $inputstring);
µû¶ó¼ $inputstring¸¦ splitÀ» ÀÌ¿ëÇؼ ºÐ¸®ÇÏ¸é »ç¿ëÀÚÀÇ ÀԷ°ú <FORM>ÀÇ À̸§À» ºÐ¸®ÇÒ ¼ö ÀÖ´Ù.
19: ($name, $value) = split(/=/, $in[$_], 2);
name=value ½ÖÀÌ ¸î °³°¡ µÉÁö ¸ð¸£¹Ç·Î splitÇÑ °á°ú¸¦ @inÀ̶ó´Â ¹è¿·Î ¹Þ¾Ò´Ù.
18: $in[$_] =~ s/\+/ /g; # '+'¸¦ °ø¹é¹®ÀÚ·Î
ÀÏ´Ü name=value ½ÖÀ¸·Î ºÐ¸®µÇ¸ç, ÀÌ °ªÀº Ç×»ó name°ú value °ªÀ¸·Î ±¸¼ºµÇ¹Ç·Î ($name, $value)·Î ¹ÞÀº °ÍÀÌ´Ù.
+¸¦ °ø¹éÀ¸·Î º¯È¯
Æû¿¡¼ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ø¹éÀº +·Î º¯È¯µÇ¾î CGI¿¡ Àü´ÞµÈ´Ù. µû¶ó¼ ÀÌ·¯ÇÑ +¸¦ °ø¹éÀ¸·Î ´ëÄ¡ÇϱâÀ§Çؼ´Â ¾Õ¿¡¼ ¹è¿î ÆÐÅÏ´ëÄ¡¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
22: $name =~ s/%(..)/pack("c", hex())/ge;
+´Â Á¤±Ô½Ä¿¡¼ Çϳª ÀÌ»óÀÇ ¾Õ¹®ÀÚ¸¦ ¹Ýº¹½ÃÅ°´Â ¸ÞŸ¹®ÀÚÀ̹ǷΠ¿ª½½·¡½¬(\)¸¦ »ç¿ëÇß´Ù.
%HH¸¦ ¿ø·¡ÀÇ ¹®ÀÚ·Î º¯È¯
¸î¸î ±¸µÎÁ¡°ú ¿µ¾î ´ë¼Ò¹®ÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ´Â %HH Çü½ÄÀ¸·Î º¯È¯µÇ¾î CGI·Î Àü´ÞµÈ´Ù. µû¶ó¼ %HH Çü½ÄÀ» ¿ø·¡ÀÇ ¹®ÀÚ·Î º¯È¯ÇØ¾ß ÇÑ´Ù.
pack TEMPLATE,LIST
TEMPLATE
A ASCII ¹®ÀÚ¿. °ø¹éÀÌ »ðÀÔµÊ
a ASCII ¹®ÀÚ¿. NullÀÌ »ðÀÔµÊ
b ºñÆ® ¹®ÀÚ¿(³»¸²Â÷¼ø)
B ºñÆ® ¹®ÀÚ¿(¿À¸£Â÷¼ø)
h 16Áø¼ö ¹®ÀÚ¿(ÇÏÀ§ 4ºñÆ®¸¦ ¸ÕÀú Ç¥½Ã)
H 16Áø¼ö ¹®ÀÚ¿(»óÀ§ 4ºñÆ®¸¦ ¸ÕÀú Ç¥½Ã)
c ºÎÈ£¸¦ °®´Â ¹®ÀÚ°ª
C ºÎÈ£¸¦ °®Áö ¾Ê´Â ¹®ÀÚ°ª
s ºÎÈ£¸¦ °®´Â Á¤¼ö(Short Çü)
S ºÎÈ£¸¦ °®Áö ¾Ê´Â Á¤¼ö(Short Çü)
I ºÎÈ£¸¦ °®´Â Á¤¼ö
I ºÎÈ£¸¦ °®Áö ¾Ê´Â Á¤¼ö
l ºÎÈ£¸¦ °®´Â Á¤¼ö(Long Çü)
L ºÎÈ£¸¦ °®Áö ¾Ê´Â Á¤¼ö(Long Çü)
%(..)
%HH Çü½ÄÀÇ ÆÐÅÏÀ» °Ë»öÇÏ°í, ÀÏÄ¡µÇ´Â ÆÐÅÏÀÌ ÀÖ´Â °æ¿ì $1¿¡ ÀúÀå
hex($1)
$1(HH)À» 10Áø¼ö·Î º¯È¯. ÆÞ¿¡¼ ¿¬»êÀÇ ±âÁØÀº Ç×»ó 10Áø¼ö À̹ǷΠ16Áø¼öÀÎ HH¸¦ 10Áø¼ö º¯È¯ÇϱâÀ§ÇØ »ç¿ëµÇ¾ú´Ù.
pack("c", hex($1))
10Áø¼ö·Î º¯È¯µÈ $1À» ºÎÈ£¸¦ °®´Â ¹®ÀÚ·Î º¯È¯.
»ç¿ëÇü½Ä
$a = '%B1%E8%C0%E7%B1%D9';
$b = '%B1%E8%C0%E7%B1%D9';
$c = '%B1%E8%C0%E7%B1%D9';
$a =~ s/%(..)//g;
print $a, "\n";
$b =~ s/%(..)/hex()/ge;
print $b, "\n";
$c =~ s/%(..)/pack("c", hex())/ge;
print $c, "\n";
¼³¸í
ÁÖ¾îÁø LIST¸¦ TEMPLATE¿¡µû¸¥ ¹®ÀÚ¿·Î º¯È¯ÇÑ´Ù. ´Ù¸¸ ÁÖÀÇÇÒ °ÍÀº pack´Â Ç×»ó 10Áø¼ö¸¦ °ªÀ¸·Î ÃëÇÑ´Ù.
ge
ÆÐÅÏ´ëÄ¡¸¦ ¼öÇàÇÏ´Â Áß¿¡ ÇÔ¼ö¸¦ ¸¸³ª¸é ±× ÇÔ¼ö¸¦ ½ÇÇàÇÑ °á°ú·Î ´ëÄ¡(e).
¿¹
<FORM METHOD="POST" ACTION="/~artech/cgi-bin/env.cgi">
<SELECT NAME=FOOD SIZE=3 MULTIPLE>
<OPTION value=apple>»ç°ú
<OPTION value=kiwi>Å°À§
<OPTION value=orange> ¿À·£Áö
</SELECT>
</FORM>
Select ű×ÀÇ Multiple ¼Ó¼º ó¸®
<FORM> ű׸¦ ¼³¸íÇÏ¸ç¼ ¾ê±âÇß´ø ±ÔÄ¢À» ÁؼöÇÏ¸é µ¿ÀÏÇÑ À̸§(<FORM> °ü·Ãű×ÀÇ name)¿¡ ´Ù¸¥ °ªÀ» °®´Â °æ¿ì´Â Select ű׿¡¼ Multiple ¼Ó¼ºÀ» ºÎ¿©ÇÑ °æ¿ì¿¡¸¸ ¹ß»ýÇÑ´Ù.
FOOD=apple&FOOD=kiwi
À§¿Í °°Àº Æû¿¡¼ »ç°ú¿Í Å°À§¸¦ ¼±ÅÃÇÑ´Ù¸é CGI¿¡´Â
26: $in{$name} .= "$in{$name} = $in{$name} . $value;
" if defined($in{$name});
27: $in{$name} .= $value;
°¡ Àü´ÞµÈ´Ù. ÀÌ¿Í °°Àº ´ÙÁß¼±Åà µ¥ÀÌÅ͸¦ ó¸®ÇϱâÀ§ÇØ
$in{$name} = $value;
¹®ÀåÀ» »ç¿ëÇÏ¿´´Ù.
$in{$name} .= "\0" if defined($in{$name});
$in{$name}°¡ ÃʱâȵǾú´Ù¸é $in{$name}¿¡ '\0'°¡ Ãß°¡µÈ´Ù. ÃʱâÈ ¿©ºÎ¸¦ °Ë»çÇϴµ¥ defined ÇÔ¼ö°¡ »ç¿ëµÇ¾ú´Ù.
$in{$name} .= $value;
$in{$name}ÀÇ ³¡ºÎºÐ¿¡ $value¸¦ Ãß°¡. ÀÌ ¹®ÀåÀº
[code=xml]$in{$name} = $in{$name} . $value;[/code]
¿Í µ¿ÀÏÇÑ ¹®ÀåÀ̹ǷΠ$in{$name}°¡ °ªÀ» °®°í ÀÖ´Â °æ¿ì¿¡´Â $value°¡ $in{$name}¿¡ µ¡ºÙ¿©Áö¸ç, $in{$name}°¡ °ªÀ» °®°í ÀÖÁö ¾Ê´Â °æ¿ì¿¡´Â
[code=xml]$in{$name} = $value;[/code]
¿Í µ¿ÀÏÇÑ ¹®ÀåÀ̵ȴÙ.
¼³¸í
À§ÀÇ Æû ¹®¼¸¦ ¿¹·Î °¢ º¯¼ö °ªÀÇ º¯È¸¦ º¸¸é ´ÙÀ½°ú °°´Ù.
FOOD=apple&FOOD=kiwi ÀÎ °æ¿ì |
$in{$name}(½ÃÀÛ) |
$name |
$value |
$in{$name}(³¡) |
ÃʱâÈ¾ÈµÊ |
FOOD |
apple |
apple |
apple |
FOOD |
kiwi |
apple\0kiwi |
|
¿¬½À - ¹æ¸í·Ï
guest.cgiÀÇ µðÄÚµù ºÎºÐÀ» ÃÖÁ¾ÀûÀ¸·Î º¯°æÇÑ´Ù. ¹æ¸í·ÏÀÇ ¸ðµç µ¥ÀÌŸ(%HH Æ÷ÇÔ)´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ±×´ë·Î Ãâ·ÂµÇ¾î¾ß Çϸç, Select ű׿¡¼ Multiple ¼Ó¼ºÀ» »ç¿ëÇÑ °æ¿ì¿¡µµ Á¤»óÀûÀ¸·Î µ¿ÀÛÇØ¾ß ÇÑ´Ù.