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

제 14강 - CGI의 출력


Content-Tyep: MIME 유형 출력 MIME-Type이 text/html인 경우

 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
실행결과

content.cgi

CGI는 반드시 Content-type:, Location:, Status Line중 하나를 출력해야 한다. 위의 예는 이러한 CGI 출력중 Content-Type:를 출력하는 예이다. MIME 형식은 출력할 문서에따라 달라지며, 이 경우에는 text/html이다.

첫 행은 스크립트 언어(perl, Sehll Script)를 사용하는 경우 반듯이 포함되어야 하는 행이다. 이 첫행으로 OS 는 현재 수행하고 있는 프로그램이 스크립트 언어로 작성되었으며, 이 프로그램을 수행하기위해 /usr/local/bin 밑에있는 perl이라는 인터프리터를 사용해야된다는 것을 인식하게 된다. 또한 perl로 이 파일을 실행 시키는 경우에는 첫열이 #으로 시작되므로 perl에서는 주석으로 처리하게 된다.

3행은 Document Here를 이용해서 출력하는 출력문이다.

4행은 Content-Type을 출력하는 행이다. Body와 Header을 구분하기위해 빈줄이 삽입되었다는 것에 주의하기 바란다.

6-18행은 일반적인 HTML 문서를 출력하는 부분이다. Document Here을 고려하지 않으면 일반적인 HTML 문서와 완전히 동일하다는 것을 알 수 있다.

19 행은 Document Here을 닫아주는 문장이다. Document를 닫아줄 때에는 반드시 Document Here의 앞뒤에 공백이 있는지 확인해야 한다.

Content-Type에는 MIME-Type에서 지정하고 있는 모든 형식이 가능하다. 간단한 예로서 그림을 출력하는 예를 보도록하자. MIME-Type이 /images/sections/cgi/gif인 경우

CGI 출력의 두 번째 예로서 출력하는 문서의 내용이 그림이기 때문에 MIME 형식은 /images/sections/cgi/gif를 사용했다.

 1: #! /usr/local/bin/perl
 2:
 3: print "content-type: /images/sections/cgi/gif\n\n";
 4:
 5: open(IMAGE, "a.gif");
 6: binmode(IMAGE);
 7: binmode(STDOUT);
 8: while(<IMAGE>) {
 9:      print;
10: }
11:  
12: close(IMAGE);
실행결과

image.cgi

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 태그를 이용해서 수행시킬 수도 있다.

1:  <html>
2:  <head>
3:  <title> 이것은 그림을 출력하는 CGI의 예입니다 </title>
4:  </head>
5:  <body>
6:  <h3><img src="http://qaos.com/~artech/cgi-bin/image.cgi">는 
						CGI를 실행한 결과입니다.</h3>
7:  </body></html>
Location: 리턴될 문서의 URL

CGI 출력의 두 번째 예로서 Location: 헤더를 출력하는 예이다. Location: 헤더는 일반적으로 자원의 위치가 변경된 경우에 자주 사용된다.

다음의 예는 환경변수 중에서 HTTP_ACCEPT_LANGUAGE를 이용해서 Client의 언어설정이 Korean이면 한글 홈페이지를 그렇지 않은 경우에는 영문 홈페이지를 보여주는 예이다.

 1:  #! /usr/local/bin/perl
 2:  %lan = (
 3:      "ko", "http://qaos.com/kindex.htm", 
 4:      "fr", "http://qaos.com/findex.htm", 
 5:      "en", "http://qaos.com/eindex.htm"
 6:  );
 7:  if($ENV{'HTTP_ACCEPT_LANGUAGE'} =~ /(ko|fr)/g) {
 8:      print "Location: $lan{}\n\n";
 9:  }
10:  else {
11:      print "Location: $lan{'en'}\n\n";
12:  }
실행결과

language.cgi

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문서의 내용을 다음과 같이 하면 된다.

1:  <html><head>
2:  <meta http-equiv="refresh" Content="0; URL=http://syscon.soongsil.ac.kr
					/~artech/cgi-bin/language.cgi">
3:  </head>
4:  </html>
상태행(Status Line)

상태라는 Respons 메시지에서 가장 중요한 행으로서 서버응답에는 반드시 포함되는 행이다. CGI가 이 상태행을 출력해야 하는 경우는 거의 없으며 이 상태행을 출력하는 경우에는 다른 Response Header도 출력해야 한다.

다음 예는 유료사이트를 방문하면 나타나는 ID와 암호를 입력할 수 있는 입력창을 만드는 CGI이다. 암호를 받아들여 인증하는 부분이 없으므로 ID와 암호를 통한 인증은 불가능하다는 것에 주의하기 바란다.

 1 : #!/usr/local/bin/perl
 2 : print <<Html;
 3 : HTTP/1.1 401 Authorization Required
 4 : Date: Tue, 30 Jun 1998 03:44:01 GMT
 5 : Server: Apache/1.3.0 (Unix)
 6 : WWW-Authenticate: Basic realm="DoA"
 7 : Connection: close
 8 : Content-Type: text/html
 9 : 
10 : <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
11 : <HTML><HEAD>
12 : <TITLE>401 암호가 틀렸어 임마!!!</TITLE>
13 : </HEAD><BODY>
14 : <H1>암호, 암호, 암호!!!</H1>
15 : <P>
16 : 넌 요기로 못와. 왜냐고 암호가 틀렸으니까.<BR>
17 : 암호는 대소문자를 구분하거든, 잘보고 다시해봐.<BR>
18 : 또 틀리면 죽어.<BR>
19 : </BODY></HTML>
20 : Html
실행결과

lnph-auth.cgi

3행이 상태행을 출력하는 부분이다. 앞장에서 배웠듯이 상태라인은 HTTP-Version Status-Code Reason으로 구성된다. 원래 상태라인은 서버가 CGI의 출력에 덧붙여 Client에 되돌려 주지만 이 경우에는 CGI가 상태라인 까지 출력하고 있다. 상태라인을 출력하는 경우에도 앞서의 두가지 Header(Content-type이나 Location)중 하나를 포함해야 한다.

6행은 HTTP 명세에서 본 WWW-Authenticate: 헤더를 출력하는 부분이다. 이 헤더를 클라이언트가 받게되면 ID와 암호를 입력할 수 있는 입력창을 만들며, 사용자가 입력한 ID와 암호를 Base64로 코딩해서 서버로 전송하게된다.

10~19행은 ID와 암호가 틀렸을 경우에 출력되는 메시지이다.

주의: NPH-CGI로 기동하기위해는 파일명이 반드시 nph-로 시작해야 한다.



다음글: 제 15강 - 제어구조 (5841)1996-04-15
이전글: 제 13강 - print 문 (6844)1996-04-13

세상사는 이야기

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


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