날짜: 1996-04-22 | 글쓴이: 도아 | 6244 번 | 프린트 | 메일로보내기

제 22강 - CGI용 라이브러리(cgi-lib.pl)


cgi-lib.pl은 펄용 CGI Library로서 가장 보편적으로 사용된다. 기능면에서는 CGI.pm에비해 떨어지지만 사용하기쉽우며, CGI 프로그래밍에 필요한 핵심적인 서브루틴을 포함하기때문 많이 사용되고 있다.

cgi-lib.pl은 다음 사이트에서 문서, 예제와 함께 구할 수 있다.

http://cgi-lib.stanford.edu/cgi-lib/

현재 최신 버전은 2.17이며, 다음 주소에서 라이브러리만 바로 다운 받을 수 있다. http://cgi-lib.stanford.edu/cgi-lib/2.17/cgi-lib.pl.txt ReadParse 사용형식

&ReadParse;
FORM 데이터는 %in이라는 연관배열에 저장된다. 따라서 &ReadParse를 호출한 후, $in{'name'}과 같은 형식으로 참조한다.
&ReadParse(*FORM);
FORM 데이터는 %FORM이라는 연관배열에 저장된다. 따라서 &ReadParse를 호출한 후, $FORM{'name'}과 같은 형식으로 참조한다.
설명

cgi-lib.pl에서 가장 핵심적인 루틴으로 폼입력 데이터를 디코딩한다. 현재 GET, HEAD, POST의 메소드를 지원하며, Netscape에서 지원하기 시작한 File Upload 기능까지 지원한다. Off-Line Mode 지원

Method가 주어지지 않으면 명령행 인자로부터 변수를 읽어들인다. 이 기능은 CGI 디버깅에 아주 유용한 기능으로서 Unix 명령행에서

env.cgi name=value

와 같이 입력하면 웹브로우저에서

http://david.bit.co.kr/cgi-bin/env.cgi?name=value

를 입력한 것과 동일하게 동작한다. PrintHeader

&PrintHeader;
CGI의 출력헤더중 content-type: text/html을 출력한다.

주의: &PrintHeader을 호출하는 것만으로는 아무 효과가 없으며 반드시 print 문과 함께 사용해야 한다. HtmlTop

&HtmlTop($var);
&HtmlTop는 다음과 같은 HTML의 시작부분을 출력한다.

<html>
<head>
<title>$var</title>
</head>
<body>
<h1>$var</h1>

주의: &HtmlTop을 호출하는 것만으로는 아무 효과가 없으며 반드시 print 문과 함께 사용해야 한다. HtmlBot

&HtmlBot;
&HtmlBot;는 다음과 같은 HTML의 종료부분을 출력한다.

</body>
</html>

주의: &HtmlBot을 호출하는 것만으로는 아무 효과가 없으며 반드시 print 문과 함께 사용해야 한다. 예1

 1: #! /usr/local/bin/perl
 2: require './cgi-lib.pl';
 3: 
 4: &ReadParse;
 5: print &PrintHeader;
 6: print &HtmlTop("ReadParse 루틴 시험");
 7: print "<PRE>\n";
 8: foreach $key (keys %in) {
 9: 	print "$key	= $in{$key}\n";
10: }
11: print "<PRE>\n";
12: print &HtmlBot;
실행결과

이름: 암호:
SplitParam
&SplitParam($var);
다중 폼데이타(Select 태그에서 MULTIPLE 속성을 준경우)의 값을 분리해서 배열로 리턴한다.
MethGet, MethPost
&MethGet;
요청방법(REQUEST_METHOD)이 GET(&MethGET)이면 참을 리턴한다.
&MethPost;
요청방법(REQUEST_METHOD)이 POST(&MethPost)이면 참을 리턴한다.
MyBaseUrl, MyFullUrl, MyURL
&MyBaseUrl; &MyURL;
추가적인 경로정보와 질의정보를 제외한 순수한 URL을 리턴한다.
&MyFullUrl;
추가적인 경로정보와 질의정보를 포함한 완전한 URL을 리턴한다.
PrintVariables
&PrintVariables;
%in(&ReadParse를 인자 없이 호출한 경우)의 값(폼데이타)를 출력한다.
&PrintVariables(%HASH);
주어진 연관배열의 내용을 출력한다.
&PrintVariables(*FORM);
%FORM의 내용을 출력한다.

주의: &PrintVariables을 호출하기전에 반드시 &ReadParse를 먼저 호출하거나 인자를 주고 호출해야 한다. PrintEnv

&PrintEnv;
현재 설정된 모든 환경변수를 출력한다. &PrintEnv는 내부적으로 &PrintVariables(*ENV)를 이용해서 구현된다.
예 2

 1: #! /usr/local/bin/perl
 2: 
 3: require './cgi-lib.pl';
 4: &ReadParse;
 5: 
 6: if(&MethGet) {
 7:     print &PrintHeader;
 8:     print &HtmlTop("요청방법: GET");
 9:     print "<p>기본 URL: ", &MyBaseUrl, "\n";
10:     print "<p>완전한 URL: ", &MyFullUrl, "\n";
11:     print "<p>다음은 현재 설정된 모든 변수입니다\n";
12:     print &PrintVariables;
13:     print &PrintVariables(*ENV);
14:     exit;
15: }
16: 
17: if(&MethPost) {
18:     print &PrintHeader;
19:     print &HtmlTop("요청방법: POST");
20:     print "<p>기본 URL: ", &MyBaseUrl, "\n";
21:     print "<p>완전한 URL: ", &MyFullUrl, "\n";
22:     print "<p>다음은 현재 설정된 모든 변수입니다\n";
23:     print &PrintVariables;
24:     print &PrintVariables(*ENV);
25:     exit;
26: }
실행결과

이름: 암호:
CgiError
&CgiError;
CGI의 출력 헤더, HTML 헤더를 포함한 기본적인 오류 메시지를 출력한다.
&CgiError($var1, $var2);
CGI의 출력 헤더, HTML 헤더를 출력하며, $var1은 TITLE 태그에 $var2는 BODY 태그의 P태그를 이용해서 출력한다.
CgiDie
&CgiDie;, &CgiDie($var1, $var2);
&CgiError과 유사하게 오류 메시지를 출력하며, 오류 메시지를 출력한 직후, 프로그램을 종료한다.
예 3 - Mail Gateway

다음 예는 cgi-lib.pl을 이용해서 구현한 간단한 Mail Gateway이다. Network 효율을 위해 폼 검사는 CGI가 아니라 간단한 JavaScript를 이용했다. JavaScript에대한 자세한 사항은 다른 책을 참고하기 바란다. HTML - mail.html 소스

 1 : <HTML>
 2 : <HEAD>
 3 : <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-KR">
 4 : <LINK REV="Made" HREF="mailto:webmaster@mailx2.com">
 5 : <LINK REL="StyleSheet" HREF="http://qaos.com/style.css">
 6 : <TITLE>DoA의 웹 메일 게이트웨이 입니다.</TITLE>
 7 : <script language="JavaScript">
 8 : <!-- JavaScript를 지원하지 않는 브로우저를 위해 주석처리
 9 : function checkForm(form) {
10 : 	if(form.from.value == '') {
11 : 		alert("이름이 빠졌습니다. 이름은 꼭 적어주십시요");
12 : 		form.from.focus();
13 : 		return;
14 : 	}
15 : 	if(form.subject.value == '') {
16 : 		alert("제목이 빠졌습니다. 제목은 꼭 적어주십시요");
17 : 		form.subject.focus();
18 : 		return;
19 : 	}
20 : 	if(form.comments.value == '') {
21 : 		alert("의견이 빠졌습니다. 의견은 꼭 적어주십시요");
22 : 		form.comments.focus();
23 : 		return;
24 : 	}
25 : 	form.submit();
26 : }
27 : // --스크립트의 끝-->
28 : </script>
29 : </HEAD>
30 : <body class=guestbook>
31 : <H2 class=h3> Mail Gateway </H2>
32 : <H2 class=ban> 팬  레  터 </H2>
33 : <hr noshade size=4>
34 : <FORM METHOD="POST" ACTION="cgi-bin/mg.cgi">
35 : <CENTER>
36 : <TABLE  border="0" cellpadding="1" cellspacing="0" 
		width=400 class=border>
37 : <tr><td class=bgblue>
38 : <table border="0" cellpadding="0" cellspacing="3">
39 : <tr>
40 : 	<th rowspan=2>송 신 자</th><td>이  름</td>
41 : 	<td><INPUT TYPE="text" NAME="from" maxlength=20 SIZE=40></td>
42 : </tr>
43 : <tr>
44 : 	<td>전자우편</td>
45 : 	<td><INPUT TYPE="text" NAME="fromaddr" SIZE=40></td>
46 : </tr>
47 : <tr>
48 : 	<th>제  목</th>
49 : 	<td colspan=2><INPUT TYPE="text" NAME="subject" SIZE=50></td>
50 : </tr>
51 : <tr>
52 : 	<th valign=top rowspan=2>의  견</th>
53 : 	<td colspan=2>
	<textarea  name="comments" cols="50" ROWs="5" wrap="hard"></textarea>
	</td>
54 : </tr>
55 : <tr>
56 : 	<td colspan=2 align=center>
	<INPUT TYPE="button" value="보내기" onClick="checkForm(this.form)">
	<INPUT TYPE="reset" value="지우기">
	</td>
57 : </tr>
58 : </table>
59 : </td></tr>
60 : </TABLE>
61 : </CENTER>
62 : </FORM>
63 : <p class=bar2>도움말</p>
64 : <p>
65 : <ul>
66 : 	<li>사용할 수 있는 메일 서버가 없는 경우, 사용할 수 있습니다.
67 : 	<li>송신자의 이름은 가급적 영문으로 적어 주기 바랍니다.
68 : 	<li>제목과 의견은 반드시 적어주기 바랍니다.
69 : </ul>
70 : </body>
71 : </html>
실행결과

mg.cgi 설명

7~27
폼을 검사하는 자바스크립트이다. 자바스크립트에서 폼을 검사하므로 CGI 프로그램에서 폼을 검사하는 루틴이 생략되었다.
36~38
테이블의 경계(Border) 색성을 지정하기위해 TABLE 태그를 중복해서 사용했다. 폼 관련태그는 앞절을 참조한다.
56
폼의 제출을 자바스크립트로 하기위해 태그의 TYPE 속성을 button으로 했다.
CGI - mg.cgi 소스

 1 : #! /usr/local/bin/perl
 2 : require './cgi-lib.pl';
 3 : $mailprog='/usr/lib/sendmail -t';
 4 : $toaddr = 'webmaster@mailx2.com';
 5 : $to = '김재근';
 6 : $home = 'http://syscon.soongsil.ac.kr/~artech';
 7 : &ReadParse(*FORM);
 8 : &CgiDie("오류", "이름, 의견, 제목중 하나가 빠졌습니다.") 
		unless($FORM{from} && $FORM{subject} && $FORM{comments});
 9 : open(MAIL, "|$mailprog $toaddr");
10 : print MAIL <<Mail;
11 : From: "$FORM{'from'}"<$FORM{fromaddr}>
12 : To: "$to"<$toaddr>
13 : Subject: $FORM{'subject'}
14 : $FORM{comments}
15 : Mail
16 : close(MAIL);
17 : print &PrintHeader;
18 : print &HtmlTop("편지전송완료");
19 : print <<Html;
20 : <p>
21 : 편지를 성공적으로 전송했습니다.
22 : <p>
23 : 홈페이지로 전송하기위해서는 <a href="$home">여기</a>를 클릭해 주세요.
24 : Html
25 : print &HtmlBot;
설명
2 : require './cgi-lib.pl';
cgi-lib.pl을 블러온다. CGI 프로그램과 라이브러리 파일이 같은 디렉토리에 있는 경우 반드시 "./"를 이용해서 현재 디렉토리임을 명시적으로 표시해야 한다. 'cgi-lib.pl'을 사용하는 경우 현재 디렉토리가 아니라 펄의 표준 라이브러리 경로(@INC에 저장된)에서 cgi-lib.pl을 찾는 다는 것에 주의하기 바란다.
3 : $mailprog='/usr/lib/sendmail -t';
메일을 전송할 프로그램을 지정한다. 여기서 -t는 명령행으로 제공된 전자우편 주소가 아니라 To: 헤더로 지정한 전자우편 주소를 사용해서 편지를 전송하라는 의미이다.
9 : open(MAIL, "|$mailprog $toaddr");
필터 모드로 화일을 오픈한다. 이렇게 오픈한 파일핸들에 데이타를 출력하면 이들 데이타를 이용해서 편지를 전송하게 된다.
10~15
MAIL이라는 파일핸들에 데이타를 출력한다. From:, To:, Subject: 헤더를 이용해서 송신자, 수신자, 제목을 지정하며, $FORM{comments}를 이용해서 사용자의 의견을 Body에 삽입한다.
16 : close(MAIL);
실제 편지의 전송은 MAIL이라는 파일핸들을 닫는 시점에서 이루어 진다.
17~25
편지를 전송한 후 전송결과를 출력하는 부분이다.


다음글: 제 23강 - 패키지(Package) - 작성중 (4248)1996-04-23
이전글: 제 21강 - 라이브러리 (4984)1996-04-21

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.