³¯Â¥: 1996-04-19 | ±Û¾´ÀÌ: µµ¾Æ | 9255 ¹ø | ÇÁ¸°Æ® | ¸ÞÀϷκ¸³»±â

Á¦ 19°­ - CGI ÀÔ·Â µðÄÚµù


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 ¼Ó¼ºÀ» »ç¿ëÇÑ °æ¿ì¿¡µµ Á¤»óÀûÀ¸·Î µ¿ÀÛÇØ¾ß ÇÑ´Ù.



´ÙÀ½±Û: Á¦ 20°­ - ¼­ºê·çƾ (8648)1996-04-20
ÀÌÀü±Û: Á¦ 18°­ - ´ëÄ¡¿Í º¯È¯ (9132)1996-04-18

¼¼»ó»ç´Â À̾߱â



RSS ±¸µ¶ (À͸í | ȸ¿ø | °­Á | Æ÷·³)
(C) 1996 ~ 2017 QAOS.com All rights reserved.