CGI (Common Gateway Interface)

CGIÀÇ Ãâ·Â

  1. HTML¹®¼­·ÎÀÇ Ãâ·Â
    CGI´Â STDOUTÀ¸·Î Ãâ·ÂÀ» ÇÕ´Ï´Ù. ´Ù¸¸ MIME typeÀ» ´ÙÀ½°ú °°Àº ¾ç½ÄÀ¸·Î ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. ¾Æ·¡ ÄÚµå´Â C·Î ÀÛ¼ºµÈ °ÍÀ̸ç, STDOUTÀ¸·ÎÀÇ °¡Àå ù¹ø° Ãâ·ÂÀÌ µÇ¾î¾ß ÇÕ´Ï´Ù.
    
    printf("Content-type: text/html\n");     
    printf("\n");
    

    ¹°·Ð ´Ù¸¥ ¾ð¾î·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡µµ °°Àº Äڵ带 °¡Àå ¸ÕÀú Ãâ·ÂÇØÁÖ¸é °°Àº È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. PerlÀÇ °æ¿ì¿¡´Â ´ÙÀ½°ú °°½À´Ï´Ù.
    
    print "Content-type: text/html\n";     
    print "\n";
    
    Content-typeÀº ¹Ù·Î MIME typeÀ» ÀǹÌÇÏ´Â °ÍÀÌ°í, ÀÌ ¹®ÀåÀº ±× ´ÙÀ½ºÎÅÍ ³ª¿À´Â ½ÇÁ¦ Ãâ·Â¹®°ú ±¸ºÐÇϱâ À§Çؼ­ \n(newline)À» ÇÑ ¹ø ´õ Ãâ·ÂÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. (¸¸¾à \nÀ¸·Î ±¸ºÐÇØÁÖÁö ¾ÊÀ¸¸é HTTP¼­¹ö´Â ÀÌ ÇÁ·Î±×·¥À» ¹®Á¦ÀÖ´Â ÇÁ·Î±×·¥À¸·Î °£ÁÖÇÏ°í ½ÇÇàÇÏÁö ¾Ê½À´Ï´Ù.)

    ½ÇÇàµÈ °á°ú, ´Ù½Ã ¸»Çؼ­ Ãâ·ÂµÇ´Â ³»¿ëÀº web browserÀÎ NetscapeÀ̳ª Mosaic, Explorer, lynxµîÀÌ ¹Þ°Ô µÇ¸é À§¿¡¼­ Ãâ·ÂÇß´ø Çì´õ¿¡ µû¶ó¼­ ±× ³»¿ëÀ» ´Ù¸£°Ô ÀνÄÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â HTML ¹®¼­·Î Ãâ·ÂÇϹǷΠ±× ÀÌÈÄÀÇ Ãâ·ÂÀº ¸ðµÎ HTML ¾ð¾î·Î Àνĵǰí HTML¹®¼­·Î º¸¿©Áö°Ô µË´Ï´Ù.
    
    printf("Content-type: text/html\n");     
    printf("\n");
    printf("<html>\n");
    printf("<head>\n");
    printf("<title> Welcome to my homepage! </title>\n");
    printf("<body>\n");
    .
    . ¿©±â¿¡ HTML¾ð¾î¸¦ Ãâ·ÂÇØÁÖ¸é µË´Ï´Ù.
    .
    printf("<body>\n");
    printf("<html>\n");
    

    ¾Æ¸¶ ´ëÃæ ¾î¶»°Ô Ãâ·ÂÇÏ´ÂÁö ÃæºÐÈ÷ ÀÌÇØÇϼÌÀ» °Å¶ó°í ¹Ï°í ´Ù½Ã ÀԷ¿¡ °üÇÑ À̾߱⸦ ´Ù½Ã ´Ù·ç¾îº¸°Ú½À´Ï´Ù. ÀÌÀü¿¡ ¼³¸íÇß´ø °ÍÀº ÀÔ·ÂÀÇ ´Ù¾çÇÑ Çü½Ä¿¡ °üÇÑ °ÍÀ̾úÀ¸³ª À̹ø¿¡´Â ÀÔ·ÂÀÌ ½ÇÁ¦·Î ¾î¶² ÇüÅ·Πµé¾î¿À°í, ±×°ÍÀ» ¾î¶»°Ô ó¸®ÇØ¾ß ÇÏ´ÂÁö¸¦ ¾Ë¾Æ¾ß ¿Ã¹Ù¸£°Ô ÀÛµ¿ÇÏ´Â CGI programÀ» ÀÛ¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

     

  2. CGI·ÎºÎÅÍÀÇ ÀԷ ó¸®
    CGIÀÇ ÀÔ·ÂÀº name=valueÇü½ÄÀÇ ¹®ÀÚ¿­ÀÌ ½ºÆ®¸²(stream)ÇüÅ·Π³Ñ°ÜÁý´Ï´Ù. getc°°Àº ÇÁ·Î±×·¥À̳ª fscanfµîÀÇ ¾Æ¹« ÀÔ·ÂÇÔ¼ö¸¦ ½á¼­ STDIN¿¡¼­ Á¤º¸¸¦ ÀоîµéÀÔ´Ï´Ù.
    
    void getcgiinput(void)
    {
      int i = 0, x;
      
      do {
        x = fgetc(stdin);      
        buffer[i++] = x;
      while (x != EOF);
      buffer[i] = '\0';
    }
    

    À§ ¿¹Á¦ Äڵ忡¼­ »ç¿ëÇÑ buffer´Â ÀÌ ÇÔ¼ö(callee)¸¦ È£ÃâÇÑ ÇÔ¼ö(caller)¿¡¼­µµ ÀÐ¾î µéÀÏ ¼ö ÀÖµµ·Ï Àü¿ªº¯¼ö·Î ÁöÁ¤µÇ°Å³ª parameter·Î ³Ñ°Ü¹Þ¾Æ¼­ ó¸®ÇØ Á־ µË´Ï´Ù. ÀÌÁ¦ ÀÌ buffer¶ó´Â ¹è¿­Àº ¿©·¯ tokenµéÀÌ ´ë°³ &(and)³ª |(or)·Î ±¸ºÐµÇ¾î ¹­¿©ÀÖÀ¸¹Ç·Î »ç¿ëÀÚ°¡ Á÷Á¢ token´ÜÀ§·Î ÂÉ°³ÁÖ¾î¾ß ÇÕ´Ï´Ù.
    
    /* ¸ÞÀÎ ÇÔ¼ö¿¡¼­ */
    token = strtok(buffer, "&");
    while (token != NULL) {
      process_pair(token);
      token = strtok(NULL, "&");
    }
    
    /* ²÷¾îÁø ÇÑ token="name_string=value_string"À» 
       name°ú value·Î ÂÉ°³¾î ó¸®ÇÏ´Â ÇÔ¼ö */
    void process_pair(char *varval)
    {
      char *ptr_value;
      char name[1024];
      char value[1024];
    
      strcpy(name, varval);
      ptr_value = strchr(name, '=');  
      if (ptr_value != NULL) {        
        *ptr_value++ = '\0';
        strcpy(value, ptr_value);
        urldecode(name);
        urldecode(value);
        if (!stricmp(name, "keyword"))
          strncpy(input, value, sizeof(input)-1);
          /* ´Ù ³ª´©¾îÁ³À¸´Ï 󸮸¸ ÇØÁÖ¸é µË´Ï´Ù. */
          /* ½ÇÁ¦ ÄÚµå´Â °¢ ÇÁ·Î±×·¥¸¶´Ù ´Ù¸£°ÚÁÒ. */
          /* nameÀ̶ó´Â º¯¼ö¿¡´Â º¯¼öÀ̸§ÀÌ,       */
          /* value¶ó´Â º¯¼ö¿¡´Â º¯¼öÀÇ °ªÀÌ        */
          /* ½ºÆ®¸µ ÇüÅ·ΠÀúÀåµÇ¾îÁ® ÀÖ½À´Ï´Ù.    */
          .
          .
          .
        }
      }
    }
    
    /* encodeµÇ¾î µé¾î¿Â ¹®ÀÚµéÀ» decodeÇØÁÖ´Â ÇÔ¼ö */
    void urldecode(unsigned char *encoded) 
    {
      char *decoded;
      int temp;
    
      swapchar(encoded, '+', ' ');
      decoded = encoded;
      while (*encoded) {
        if (*encoded == '%') {
          encoded++;
          if (isxdigit(encoded[0]) && isxdigit(encoded[1])) {
            sscanf(encoded, "%2x", &temp);
            *decoded++ = (char) temp;
            encoded += 2;
          }
        } else {
          *decoded++ = *encoded++;
        }
      }
      *decoded = '\0';
    }
    

ÀÌÀü ¹®¼­, ´ÙÀ½ ¹®¼­