Lihtsaid cgi programminäiteid

Allikas: Lambda

Serveripoolne 'Hello world' pythonis (käimapanekuks tee chmod a+x progenimi, siis peab linux seda faili programmiks, ning dijkstras pane fail cgi-bin kataloogi alla, et apache oleks valmis teda käivitama).

#!/usr/bin/python

print "content-type: text/plain\n\n"
print "hello"

NB! esimene rida

 #!/usr/bin/python

ütleb linuxis (ja teistes unixites), et fail tuleb anda sisendiks sellel real näidatud interpretaatorile, siin siis pythonile asukohaga /usr/bin/python

Sama perlis:

#!/usr/bin/perl

print "content-type: text/plain\n\n";
print "hello\n";

ning C-s (tee gcc failinimi -o programminimi ja käivita siis tehtud programm):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char **argv) {
  printf("content-type: text/html\n\n");
  printf("Hello!\n");
}  

proov.sh on shelli skript, mis trükib välja serverile saadetud info. Proovi anda urli lõppu näiteks ?miskijutt, a la http://dijkstra.cs.ttu.ee/~t012345/cgi-bin/progefailinimi?miskijutt kus t012345 asemele pane oma matriklinumber:

#!/bin/sh
echo 'Content-type: text/html'
echo
echo
echo 'tere tali'
echo '<p>'
echo $QUERY_STRING


proov.py on pythoni programm, mis parsib serverile saadetud infost (cgi protokolli järgi, kasutades Pythonisse ehitatud cgi moodulit) parameetrit ja trükib sisendvalja nimega 'arg', kui selline on olemas:

#!/usr/bin/python
import cgi

print "Content-type: text/html"
print

print "<html><head><title>Vorm pythonis</title></head><body><h1>Hello, World!</h1><p>Parameeter arg oli "

formdata = cgi.FieldStorage()
if formdata.has_key("arg"):
  print formdata['arg'].value
else:
  print "puudu"

print ".</p></body>"


Seda programmi saab hästi katsetada lihtsalt brauseris cgi argumentidega url-i avades, seejärel aga proovi kasutada teda sellise vormi abil (t012345 asemele pane oma matriklinumber):

Siin on tore vorm.
<p>

<form action="http://dijkstra.cs.ttu.ee/~t012345/cgi-bin/proov.py" method="GET">

a <input type="text" name="arg"><br>
b <input type="text" name="arg2"><br>
<input type="submit">

</form>

Viimase vormi juures katseta, mis juhtub, kui method="GET" asemel kirjutad method="POST": cgi töötab nagu enne, kuid kodeeritud parameetreid ei anta kaasa mitte url-ga, vaid http kehas, seega neid brauseri http real peale vormi teelesaatmist enam ei näe.

Järgmine proov.py on pythoni programm, mis parsib serverile saadetud info (cgi protokolli järgi, kasutades Pythonisse ehitatud cgi moodulit), trükib argumendid (sõltumatult nende nimedest!!) ja liidab kõigi väärtused kokku.


#!/usr/bin/python

import string, os, cgi, sys, tempfile, traceback
import cgitb; 


def main():
  print 'content-type: text/html\n\n' 
  print '<h2>Väike näide</h2>' 
  cgitb.enable()
  form = cgi.FieldStorage() 
  sum=0 
  for key in form.keys():  
    val=form[key].value
    print key,' võrdub ',val
    print '<br>'
    sum=sum+int(val) 
  print '<p>'  
  print '<b>summa on: ',sum,'</b>' 
  return

main()


järgmine C-keelne rakendus kuvab lihtsalt serverile saadetud info ilma seda väljanimede järgi parsimata:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void getquery_str();

int main(int argc, char **argv) {
  printf("content-type: text/plain\n\n");
  printf("Hello!\n");
  
  getquery_str();
}  


void getquery_str() {
  char* result;
  char* tmp1;
  char* tmp2;
  
  tmp1=getenv("QUERY_STRING");
  tmp2=getenv("SCRIPT_NAME");
  
  printf("QUERY_STRING: %s\n",tmp1);
  printf("SCRIPT_NAME: %s\n",tmp2);
}  


adder.c on C-s kirjutatud rakendus, mis parsib kaks argumenti (eeldades ampersandi eraldajaks ja nimede puudumist!) ja liidab nad kokku. Mingeid teeke peale standardse ei kasutata.

/*
 * adder.c - a minimal CGI program that adds two numbers together
 */
/* $begin adder */
#include "csapp.h"

int main(void) {
    char *buf, *p;
    char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
    int n1=0, n2=0;

    /* Extract the two arguments */
    if ((buf = getenv("QUERY_STRING")) != NULL) {
        p = strchr(buf, '&');
        *p = '\0';
        strcpy(arg1, buf);
        strcpy(arg2, p+1);
        n1 = atoi(arg1);
        n2 = atoi(arg2);
    }

    /* Make the response body */
    sprintf(content, "Welcome to add.com: ");
    sprintf(content, "%sTHE Internet addition portal.\r\n<p>", content);
    sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>", 
            content, n1, n2, n1 + n2);
    sprintf(content, "%sThanks for visiting!\r\n", content);
  
    /* Generate the HTTP response */
    printf("Content-length: %d\r\n", strlen(content));
    printf("Content-type: text/html\r\n\r\n");
    printf("%s", content);
    fflush(stdout);
    exit(0);
}
/* $end adder */

See C-keelne rakendus trükib välja suurema hulga veebiserveri poolt püsti pandud keskkonnamuutujaid. Enamikku neist pole üldjuhul vaja kasutada. Eelpool kasutasime muidugi QUERY_STRING-i, kuhu pannakse GET päringu parameetrid, nagu nad kliendi (ntx brauser) poolt välja saadetakse.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void getquery_str();

int main(int argc, char **argv) {
  printf("content-type: text/html\n\n");
  printf("Hello!<p>\n");
  
  getquery_str();
}  


void getquery_str() {
  char* result;
  char* tmp1;
  char* tmp2;

    
  printf("<h2>Universal</h2>\n");
  
  printf("<p>SERVER_SOFTWARE: %s\n",getenv("SERVER_SOFTWARE"));
  printf("<p>SERVER_NAME: %s\n",getenv("SERVER_NAME"));
  printf("<p>GATEWAY_INTERFACE: %s\n",getenv("GATEWAY_INTERFACE"));
  
  printf("<h2>Classical request-specific</h2>\n");
  
  printf("<p>SERVER_PROTOCOL: %s\n",getenv("SERVER_PROTOCOL"));
  printf("<p>SERVER_PORT: %s\n",getenv("SERVER_PORT"));
  printf("<p>REQUEST_METHOD: %s\n",getenv("REQUEST_METHOD"));
  printf("<p>PATH_INFO: %s\n",getenv("PATH_INFO"));
  printf("<p>PATH_TRANSLATED: %s\n",getenv("PATH_TRANSLATED"));
  printf("<p>SCRIPT_NAME: %s\n",getenv("SCRIPT_NAME"));
  printf("<p>QUERY_STRING: %s\n",getenv("QUERY_STRING"));
  printf("<p>REMOTE_HOST: %s\n",getenv("REMOTE_HOST"));
  printf("<p>REMOTE_ADDR: %s\n",getenv("REMOTE_ADDR"));
  printf("<p>AUTH_TYPE: %s\n",getenv("AUTH_TYPE"));
  printf("<p>REMOTE_USER: %s\n",getenv("REMOTE_USER"));
  printf("<p>REMOTE_IDENT: %s\n",getenv("REMOTE_IDENT"));
  printf("<p>CONTENT_TYPE: %s\n",getenv("CONTENT_TYPE"));  
  printf("<p>CONTENT_LENGTH: %s\n",getenv("CONTENT_LENGTH"));
  
  printf("<h2>Some client headers</h2>\n");
  
  printf("<p>HTTP_ACCEPT: %s\n",getenv("HTTP_ACCEPT"));
  printf("<p>HTTP_USER_AGENT: %s\n",getenv("HTTP_USER_AGENT")); 
}