1: #! /usr/local/bin/perl
2:
3: print <<Html;
4: content-type: text/html
5:
6: <html><head>
7: <title> 이 것은 CGI 출력을 시험하기위한 예입니다 </title>
8: </head><body bgcolor="#ff0000">
9: <h1> 이 것은 Content-type이 text/html인 문서입니다 </h1>
10: <img src="http://qaos.com/~artech/a.gif">
11: 와 같이 이미지를 출력할 수도 있으며
12: , 모든 HTML Tag를 사용할 수 있습니다.
13: 심지어는 Form Tag를 이용해서
14: 원래의 CGI를 다시 호출 할 수도 있습니다
15: <form action=/~artech/cgi-bin/print.cgi">
16: <input type=submit value="보내기">
17: </form>
18: </body></html>
19: Html
CGI는 반드시 Content-type:, Location:, Status Line중 하나를 출력해야 한다. 위의 예는 이러한 CGI 출력중 Content-Type:를 출력하는 예이다. MIME 형식은 출력할 문서에따라 달라지며, 이 경우에는 text/html이다.
첫 행은 스크립트 언어(perl, Sehll Script)를 사용하는 경우 반듯이 포함되어야 하는 행이다. 이 첫행으로 OS 는 현재 수행하고 있는 프로그램이 스크립트 언어로 작성되었으며, 이 프로그램을 수행하기위해 /usr/local/bin 밑에있는 perl이라는 인터프리터를 사용해야된다는 것을 인식하게 된다. 또한 perl로 이 파일을 실행 시키는 경우에는 첫열이 #으로 시작되므로 perl에서는 주석으로 처리하게 된다.
3행은 Content-Type중에서 MIME-Type이 /images/sections/cgi/gif를 출력하는 부분이다. 헤더부분은 MIME-Type이 /images/sections/cgi/gif로 바뀌었을 뿐 text/html을 출력하는 경우와 똑 같다.
다만 5-10까지 몸체를 출력하는 부분이 html문서가 아니라 그림이므로 a.gif를 읽어들어 출력하도록 변경되어있다. Compile 언어의 경우 바이너리 파일을 프로그램 자체에 내장할 수 있지만 perl은 스크립트 언어이므로 위에서처럼 a.gif라는 파일을 읽어 print 문을 이용해서 출력할 수밖에 없다.
5행은 a.gif라는 파일을 읽기 모드로 IMAGE라는 파일 핸들러로 open하는 부분이다. 앞절이서 다루었던 변수와는 달리 파일핸들러에는 어떠한 접두사도 붙지 않는다는 것을 유의하기 바란다.
6, 7행은 2진 파일을 입출력해야 하므로 IMAGE와 STDOUT을 2진 모드로 변환하는 부분이다. 이와같은 과정은 반드시 필요한 것은 아니지만 2진 파일을 화면에 출력할 때에는 가급적 수행해 주는 것이 좋다.
8-10행은 IMAGE라는 파일핸들러를 한줄씩(<>)읽어서 화면에 출력하는 부분이다. 위의 8-10행은
7: whiel($_ = <IMAGE>) {
8: print $_;
9: }
과 동일한 문장이다. 앞절의 변수에서 언급했듯이 perl에서는 $_라는 특수변수가 있으며, 인자가 생략된 경우 $_를 인자로해서 프로그램을 수행하게 된다.
또 한가지 뒷부분의 순환문에서 설명하겠지만 perl의 while문에서는 위의 예에서처럼 비교연산자가 아니라 지정연산자를 사용할 수도 있다. 이 경우 $_에 값을 지정할 수 있는 경우 참이고 그렇지 못한 경우 거짓이 된다.
따라서 위의 문장은 파일을 처음부터 끝까지 읽으라는 문장이 된다. 위의 예에서처럼 그림을 출력하는 CGI 프로그램은 Netscape의 Location 입력 상자에 직접입력해서 CGI를 수행시켜도 되지만 다음과 같이 HTML의 IMG 태그를 이용해서 수행시킬 수도 있다.
2행은 앞에서 배웠듯 lan이라는 연관배열을 선언하는 문장이다. 즉, ko라는 키워드에는 한글 홈페이지의 URL을 en이라는 키워드에는 영문 홈페이지의 URL을 저장하도록 선언하고 있다.
7행은 역시 앞에서 가끔씩 등장한 패턴매치를 사용한 것이다. 즉, HTTP_ACCEPT_LANGUAGE라는 환경변수에 ko라는 문자열이나 fr이라는 문자열을 포함하고 있으면, 그 결과는 참을 리턴하게 된다. 따라서 클라이언트의 언어설정에 korean이나 france가 포함된 경우에는 8행이 수행되며, 그렇지 않은 경우에는 11행이 수행된다.
이 프로그램을 Netscape의 Location 입력상자에 직접 입력하면 Netscape의 Options->General Preferences->Languages(Netscape 4.0미만) 또는 Edit->Preferences..->Languages(Netscape 4.0이상)의 설정값에따라 kindex.html이나 eindex.html 파일을 불러오게된다.
위와 같은 cgi 프로그램을 index.html 파일에서 수행시키면 사용자의 홈페이지에 접속한 클라이언트의 설정값에따라 한글 또는 영문 홈페이지를 자동적으로 연결시킬 수 있다.
index.html 파일에서 CGI 프로그램을 실행하기 위해서는 Client-Pull 기능을 사용하면된다. Client-Pull을 이용해서 CGI 프로그램을 실행하려면 index.html문서의 내용을 다음과 같이 하면 된다.
3행이 상태행을 출력하는 부분이다. 앞장에서 배웠듯이 상태라인은 HTTP-Version Status-Code Reason으로 구성된다. 원래 상태라인은 서버가 CGI의 출력에 덧붙여 Client에 되돌려 주지만 이 경우에는 CGI가 상태라인 까지 출력하고 있다. 상태라인을 출력하는 경우에도 앞서의 두가지 Header(Content-type이나 Location)중 하나를 포함해야 한다.
6행은 HTTP 명세에서 본 WWW-Authenticate: 헤더를 출력하는 부분이다. 이 헤더를 클라이언트가 받게되면 ID와 암호를 입력할 수 있는 입력창을 만들며, 사용자가 입력한 ID와 암호를 Base64로 코딩해서 서버로 전송하게된다.