Axil S/E kdk015
				  1997. 4. 16
				  Kim Do Kyung

SUBJECT: CGI(Common Gateway Interface)

CONTENTS:

★  CGI(Common Gateway Interface)

CGI(Common Gateway Interface)는 정보를 제공하는 서버를 통해서 외부 프로그램이나 
게이트웨이를 실행시키기 위한 인터페이스 프로그램을 말한다. 일반적으로 이것을 지
원하는 정보 제공 서버는 HTTP서버가 된다.

	※ CGI 소개

   * Gateway는 무엇인가?
        o Gateway라는 것은 하나의 실제적인 프로그램으로서 정보요청을
          관리하고 그에 따른 적절한 문서들을 생성 및 제공한다.
          CGI는 서버가 제공하는 정보를 Client가 읽을 수 있는 형태로
          전환한다. 즉, 이 둘 사이의교량 역할을 한다고 할 수 있다.
        o Gateway는 여러가지 목적에 쓰일 수 있다.
          그 중 가장 대표적인 것이 HTTP를 요구하는 ISINDEX와 FROM을 다루는
          일이다.

	※ CGI의 몇 가지 활용 예

        o 매뉴얼을 HTML로 변환시켜서 그 결과를 Client에게 제공한다.
        o WAIS 및 archie database와의 인터페이스 결과를 HTML로 변환시켜서 그
          결과를 Client로 보낸다.

	※ Gateway Program이란 정확히 무엇인가?

   * Gateway Program(또는 script)은 독립적으로 실행 될 수 있는 실행
     프로그램을 말한다. 왜냐하면 다양한 정보제공 서버하에서 실행 될 수 있게
     하기 위해서이다.

	※ Gateway를 만들기 위해서 어떠한 언어를 사용하는가?

* Gateway를 만들기 위해 필요한 언어는 실행화일을 생성할 수 있는 모든 언어를
포함한다.

* -C/C++
* -PERL
* -TCL
* -Bourne Shell
* -C Shell
* - ..
* - ..

	※ CGI는 누가 만들었나?

HTTP 서버의 주요한 저자들에 의해서 작성되었다.

        Tony Sanders sanders@bsdi.com
        Ari Luotonen luotonen@ptsun00.cern.ch
        George Phillips phillps@cs.ubc.ca
        John Franks john@math.nwu.edu


	※ CGI 프로그램 개요

서버로부터 gateway 프로그램으로의 인수전달은 어떻게 이루어지나?

Client가 URL을 요청할 때마다 서버는 그에 해당하는 gateway를 실행시킨다.
그리고 그 출력은 직접 혹은 간접적으로 client에게로 전달된다. CGI는 program으로
인수를 전달하기 위해서 환경변수를 이용한다.
그 대표적인 두가지 변수는 다음과 같다.

   * QUERY_STRING
        o 이것은 gateway를 접근하기 위해서 이용된 URL 속의 첫번째
          물음표를(?) 뒤에 오는 것들을 정의하기 위해서 쓰인다. 이러한
          정보들은 HTML ISINDEX 문서나 HTML form(get을 쓸때)에 의해서
          첨가된다.
   * PATH_INFO
        o CGI는 URL에 첨가된 extra 정보를 허용하는데, 이것은 스크립트로
          extra context-specific 정보를 전달하기 위해서 사용된다. 보통,URL의
          gateway path 뒤에 따라가게 되며 서버에 의해서 decode되지는 않는다.

	※ Gateway에서 client로의 문서 전달은 어떻게 이루어지나?

CGI 프로그램은 이미지나 HTML 문서,일반적인 문서 또는 audio clip과 같은
것들을 되돌려 주게 된다. 또한 다른 문서에 대한 reference를 돌려 줄 수 도
있다. 이러한 것들에 대한 정보를 client에게 알려주기 위해서 CGI는 출력의 앞
부분에 짧은 header 를 놓게된다. 이것을 마임이라 하고, 이와같은 문서를 직접 리턴할 때와 reference를
리턴할 때마다 각각의 경우에 header의 형식은 다음과 같다.

   * MIME type의 완전한 문서의 경우:
     MIME type에 관한 정보를 다음과 같이 명시한다.


             Content-type : type/subtype


   * 다른 문서에 대한 reference일 경우:
     현재 서버 내의 문서일 경우에는 다음과 같이 할 수도 있다.

            Location: /dir1/dir2/myfile.html


   * 만일 고퍼서버 내의 문서를 참조할 경우에는 다음과 같이 하면 된다.

            Location: gopher://httprules.foobar.org/0


     이 경우 클라이언트는 이것을 decode하여 URL을 직접 가져올 것이다.
     Header의 다음 라인은 반드시 공백라인이어야 한다. 이것은 header의 끝을
     명시하기 위해서 이다.
     -----------------------------------------------------------------------

     CGI로 FORM을 지원하기

     CGI는 Form data를 어떻게 넘겨 받는가?

     다음 각 방법에 따라서 다른 방식이 적용된다.
        o GET method 환경변수 QUERY_STRING을 통해서 전달된다.
        o POST method stdin으로 입력한다. EOF를 명시하지 않음으로 변수
          CONTENT_LENGTH를 사용해야 한다.



	※ SSI(Server Side Include)

  SSI는 여러분의 웹서버의 관리자가  활성화(enabled) 시켜야만 사용할 수 있다. 그
  리고, 이것은 서버가 매 SSI 문서에 대해 더욱  열심히 동작할 것을 요구한다. (SSI
  를 서버가 지원할 경우, 서버는 매 라인에 SSI 명령어가 있는지 확인해야 한다. 따
  라서 서버에 과부하를 주게 된다.)

  SSI의 형식은 주석 태그와 형태가 비슷하다.

     HTML 태그의 주석
      

     SSI 명령어 형식
      

     SSI 명령어의 종류
      -------------------------------------------------------------------
      config     시간, 크기 와 에러 메시지의 포맷을 설정한다.
      echo       SSI 변수의 값을 웹 페이지에 삽입한다.
      exec       시스템 명령어나 CGI 프로그램을 실행시키고 그것의 결과를 
                 웹 페이지에 삽입한다.
      fsize      파일의 크기를 웹 문서에 삽입한다.
      flastmod   파일이 변경된 최종 시간을 웹 문서에 삽입한다.
      include    명시한 HTML 파일을 웹 문서에 삽입한다.
      -------------------------------------------------------------------

● config

     config명령어의 argument와 argument 값
      errmsg     Any ASCII 텍스트
      sizefmt    Bytes or abbrev
      timefmt    Any of the date codes 

     config명령어의 각 argument의 사용예
      
       
      
      
      

     웹 페이지에 어떻게 시간을 출력할 것인가에 관한 date 코드
      %a      생략한 요일 이름
      %A      생략하지 않은 요일 이름
      %b      생략된 달 이름
      %B      생략되지 않은 달 이름
      %c      날짜와 시간 표시
      %d      날짜(십진수)
      %m      달(십진수)
      %U      일요일을 처음으로 해서 요일 수(십진수)
      %W      월요일을 처음으로 해서 요일 수(십진수)
      %x      날짜 표시(시간은 없는)
      %y      100단위 이상은 생략한 년도(십진수)
      %Y      100단위 이상을 포함한 년도(십진수)
      %H      24시간제에서의 시간(00-23)
      %I      12시간제에서의 시간(01-12)
      %j      날수(001-366)
      %M      분(십진수)
      %p      a.m. 또는 p.m. 주어진 시간에 따라
      %S      초(십진수)
      %X      시간 표시(날짜는 없는)
      %Z      시간대(Time Zone), 이름 또는 생략

● echo

     echo 명령어의 변수와 그 의미

      ------------------------------------------------------------------
      DATE_LOCAL     현재의 날짜와 시간, 이것의 출력 양식은 SSI의 config 
                     timefmt에 의존한다.
      DATE_GMT       그리니치 천문대의 현재의 날짜와 시간
      DOCUMENT_NAME  파일 이름
      DOCUMENT_URI   파일의 경로와 이름
      LAST_MODIFIED  최종 변경된 날짜와 시간
      ------------------------------------------------------------------

     echo명령어의 각 argument의 사용예

      The  file was last modified.
      .
● exec exec명령어의 사용예 exec의 argument로 실행시키는 프로그램은 Unis Shell이 될 수도 있다. 이때는 더 욱 강력한 위력을 발휘할 것이다. 하지만 CGI를 실행시킬 수 있다면 더욱 강력할 것이다. exec는 이것을 지원한다. exec와 cgi의 사용 형식 ● fsize 웹 페이지에 화일의 크기를 집어 넣을 때 사용된다. ● flastmod 여기서 잠시 상식하나를 짚고 넘어가면, flastmod란 이름은 last와 modified를 합 쳐서 만든 이름이다. 특히 접두어 f는 file에 대한 연산을 의미한다. 이 명령어는 우리의 웹 페이지가 가장 최근에 업데이트된 날짜를 자동으로 알릴 수 있는 방법 을 제공한다. ● include include명령어의 argument와 argument 값 file 현 디렉토리나 현 디렉토리의 서브디렉토리에서 시작하는 어떤 경로나 화일 virtual 서버의 root에서 시작하는 어떤 경로나 화일 include명령어의 각 argument의 사용예 위의 표에 있듯이 argument가 file일 경우 현 디렉토리나 현 디렉토리의 서브디렉 토리가 되어야 한다. 따라서, 경로의 처음은 /, ..이 되어서는 안된다. ★ PERL Larry Wall에 의해 만들어진 이 언어는 Practical Extraction and Report Language 의 약자로 이름에서 알 수 있듯이 원래 데이타를 처리하고 데이타로부터 보고서를 생성하기 위해 만들어 졌다. 또한, 이 언어의 최대 장점으로 PERL로 짜여진 프로그램 은 거의 별다른 수정없이 다른 플랫폼에서 실행이 가능하다는 것이다. ※ Hello World Code #! /usr/local/bin/perl print "Content-type: text/html\n\n"; <= HTML 문서임을 알려줌 <주의>반드시 \n\n이어야 한다. print <<`END` <= END가 있는곳까지 출력하라 My First CGI

My First CGI Program


Hello World? END PERL의 기본 코드이다. ※ Summary of Regular Expression ● set of pattern /abc/ Matches abc anywhere within the string. /^abc/ Matches abc at the beginning of the string. /abc$/ Matches abc at the end of the string. /a|b/ Matches either a or b Can also be used with words (i.e., /perl|tcl/) /ab{2,4}c/ Matches an a followed by 2-4 b's, followed by c. If the second number is omitted, such as /ab{2,}c/, the expression will match two or more b's. /ab*c/ Matches an a followed by zero or more b's, followed by c Expressions are greedy-it will match as many as possible. Same as /ab{0,}c/ /ab+c/ Matches an a followed by one or more b's followed by c Same as /ab{1,}c/ /ab?c/ Matches an a followed by an optional b followed by c Same as /ab{0,1}c/. This has a different meaning in Perl 5. In Perl 5, the expression: /ab*?c/ matches an a followed by as few b's as possible(non-greedy) /./ Matches any single character except a newline(\n) /p..1/ matches a p followed by any two characters, followed by 1, so it will match such strings as perl, pall, pdgl, p3gl, etc. /[abc]/ A character class-matches any one of the three characters listed. A pattern of /[abc]+/ matches strings such as abcab, acbc, abbac, aaa, abcacbac, ccc, etc. /\d/ Matches a digit Same as /[0-9]/ Multipliers can be used (/\d+/ matches one or more digits) /\w/ Matches a character classified as a word Same as /[a-zA-Z0-9_]/ /\s/ Matches a character classified as whitespace Same as /[ \r\t\n\f]/ /\b/ Matches a word boundary or a backspace /test\b/ matches test, but not testing However, \b matches a backspace character inside a class (i.e., [\b]) /[^abc]/ Matches a character that is not in the class /[^abc]+/ will match such strings as hello, test, perl, etc. /\D/ Matches a character that is not a digit Same as /[^0-9]/ /\W/ Matches a character that is not a word Same as /[^a-zA-Z0-9_]/ /\S/ Matches a character that is not whitespace Same as /[^ \r\t\n\f]/ /\B/ Requires that there is no word boundary /hello\B/ matches hello, but not hello there /\*/ Matches the * character, Use the \ character to escape characters that have significance in a regular expression. /(abc)/ Matches abc anywhere within the string, but the parentheses act as memory, storing abc in the variables $1, $2, $3. Example 1: /name=(.*)/ will store zero or more characters after name= in variable $1. Example 2: /name=(.*)&user=\1/ will store zero or more characters after name= in $1. Then, Perl will replace \1 with the value in $1, and check to see if the pattern matches. Example 3: /name=([^&]*) will store zero or more characters after name= but before the & character in variable $1. Example 4: /name=([^&]+)&age=(.*)$/ will store one or more characters after name= but before & in $1. It then matches the & character. All characters after age= but before the end of the line are stored in $2. /abc/i Ignores case. Matches either abc, Abc, ABC, aBc, aBC, etc.