From: Subject: JumpStart to the Web technologies tutorial: CGI - Common Gateway Interface Date: Thu, 14 Nov 2002 10:48:00 +0100 MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_000E_01C28BCB.4CD95A50"; type="text/html" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 This is a multi-part message in MIME format. ------=_NextPart_000_000E_01C28BCB.4CD95A50 Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.sergey.com/web_course/part_5.html JumpStart to the Web technologies tutorial: CGI - = Common Gateway Interface
Jumpstart into=20 the Web technologies: <- Prev. Start Contents References Home Next=20 ->
CGI=20 - Common Gateway Interface

The Common Gateway Interface (CGI) is a standard for interfacing = external=20 applications with information servers, such as HTTP or Web servers. A = plain HTML=20 document that the Web daemon retrieves is static, which = means it=20 exists in a constant state: a text file that doesn't change. A CGI = program, on=20 the other hand, is executed in real-time, so that it can output=20 dynamic information.=20

Simple diagram of how CGI is working:
=20

Basically it's very simple:=20

  1. User enters the input on his Web browser into the form = (<FORM> tag)=20
  2. Browser packs the input according to the CGI specifications and = sends it=20 to the URL, which is specified in ACTION field of the = FORM.=20 It's actually sent to the HTTP server.=20
  3. Server extracts the program name from the URL and calls the = program,=20 passing the packed user input to the program as well.=20
  4. Server takes the output (standard output) of the program and = passes it=20 back to the browser.

So basically in our CGI program we need to know how to do two things: = first,=20 take the user's input & unpack, so we can use it and, second, figure = out=20 what to print to stdout, so broswer will understand.=20

Getting the user's = input
There are two=20 methods (METHOD parameter of the FORM tag) of = passing=20 parameters to CGI program:=20

Note, that if=20 METHOD is not specified, the default is GET.
In most of the = cases=20 POST method should be used, because it't more flexible and also, there = is a high=20 probability, that while using GET method, long input will be = truncated.
GET=20 method is useful if you want to create a URL link to some CGI program = and pass=20 some parameters (you just append them to the URL with '?' = character).=20 Just don't forget to encode all the special characters (space is encoded = with=20 '+'), but most of the CGI libraries have functions to do the = encoding=20 for you.
In both cases, the content of the form will be encoded in = the=20 following form: name=3Dvalue&name=3Dvalue&name=3Dvalue =
Most=20 likely, you won't have to deal with encoding & decoding, because = it's a good=20 idea to use some CGI library. In case of Perl it would be = CGI.pm, which=20 comes with standard perl distribution.=20

Producing the output and sending it = back to the=20 client
The output of CGI program consists of two parts: = header &=20 body. The delimiter between the header and body is an empty = string.
The body=20 is usually a simple HTML page, created by the program. It can also be = any other=20 type of thing, like image or binary document, but in most cases it'll be = HTML.=20

Here is the list of valid HTTP headers:=20

The minimal thing you'll need to do in your CGI program is to produce = Content-type header.e.g.:

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>Hello =
world!</TITLE></HEAD>\n";
print "<BODY><H1>Hello world!</H1></BODY>\n";
print "</HTML>\n";

Keeping the state (session) between the = CGI=20 calls
Since it's typical client-server model, to produce each = screen,=20 a new process should be started on the server. Which means, that there = is no way=20 for this process to know what happened in the previous one.
There are = some=20 techniques, that allow you to keep some info between the sessions:=20

The List of environment variables, used = by=20 CGI:

Possible Form tags (quick = reference):=20 =
Form Tag Look Description
<FORM ACTION=3D"/cgi-bin/prog.cgi"=20 METHOD=3D"POST">
Begin of the form
<INPUT TYPE=3D"text" NAME=3D"name" = VALUE=3D"value"=20 SIZE=3D"size"> Text field
<INPUT TYPE=3D"password" NAME=3D"name" = VALUE=3D"value"=20 SIZE=3D"size"> Password field
<INPUT TYPE=3D"hidden" NAME=3D"name"=20 VALUE=3D"value">   Hidden field
<INPUT TYPE=3D"checkbox" NAME=3D"name"=20 VALUE=3D"value1"> Checkbox
<INPUT TYPE=3D"radio" NAME=3D"name"=20 VALUE=3D"value1">
<INPUT TYPE=3D"radio" NAME=3D"name"=20 VALUE=3D"value2">
Radio button
<SELECT NAME=3D"name" = SIZE=3D1>
<OPTION=20 VALUE=3D"1" SELECTED>Choice1
<OPTION=20 VALUE=3D"2">Choice2
</SELECT>
Menu
<SELECT NAME=3D"name" SIZE=3Dn=20 MULTIPLE>
<OPTION=20 = SELECTED>Choice1
<OPTION>Choice2
</SELECT>
Scrolled list
<TEXTAREA ROWS=3Dyy COLS=3Dxx = NAME=3D"name"> some text=20 . </TEXTAREA> Multiline text fields
<INPUT TYPE=3D"submit"=20 VALUE=3D"Message">
<INPUT TYPE=3D"submit" NAME=3D"name"=20 VALUE=3D"value">
<INPUT TYPE=3D"image" = SRC=3D"images/submit.gif"=20 NAME=3D"name" VALUE=3D"value">


Submit buttons
<INPUT TYPE=3D"reset" = VALUE=3D"Message"> Reset button
</FORM>   Ends form

Note: All values should be in double quotes! Now = it's=20 working without it, but next year it will not! XML doesn't allow it, = it's much=20 more strict.=20

Summary:
Now we can receive user's input and do = something=20 with it. There are some pluses and some minuses with CGI:=20

More info on CGI can be found here<= /I>.=20

Jumpstart into=20 the Web technologies: <- Prev. Start Contents References Home Next=20 ->

Copyright =A9 2000 Sergey=20 Gribov
------=_NextPart_000_000E_01C28BCB.4CD95A50 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.sergey.com/web_course/images/cgi.jpg /9j/4AAQSkZJRgABAQAAAQABAAD//gBYQ1JFQVRPUjogWFYgVmVyc2lvbiAzLjEwYSAgUmV2OiAx Mi8yOS85NCAoUE5HIHBhdGNoIDEuMikgIFF1YWxpdHkgPSA3NSwgU21vb3RoaW5nID0gMAr/2wBD AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5 PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAFSAfgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2GxsY7yGWaaa8Lm5nX5byVQAJWAAAYAYAAq1/ Y9t/z1vv/A6b/wCLo0f/AI8pP+vq4/8ARz1fpElD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq /RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wAD pv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z 1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9FAFD+x7b/nrff+B03/xd H9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/ 4HTf/F0f2Pbf89b7/wADpv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se 2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9 FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm /wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW +/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f 2Pbf89b7/wADpv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/g dN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9FAFD+x7b /nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0U AUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/ AOLq/RQBQ/se2/5633/gdN/8XR/Y9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7 /wADpv8A4ur9FAFD+x7b/nrff+B03/xdH9j23/PW+/8AA6b/AOLq/RQBQ/se2/5633/gdN/8XR/Y 9t/z1vv/AAOm/wDi6v0UAUP7Htv+et9/4HTf/F0f2Pbf89b7/wADpv8A4ur9FAGJqunRW2j3s8M9 8ssVvI6N9tmOCFJB5airmuf8i/qX/XrL/wCgGimNBo//AB5Sf9fVx/6Oer9UNH/48pP+vq4/9HPV +kIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAoa5/yL+pf9esv/oBoo1z/AJF/Uv8Ar1l/9ANFMaDR/wDjyk/6+rj/ANHPV+qGj/8A HlJ/19XH/o56v0hBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAFDXP+Rf1L/r1l/wDQDRRrn/Iv6l/16y/+gGimNBo//HlJ/wBfVx/6 Oer9UNH/AOPKT/r6uP8A0c9X6QgooooAKKKKACiiigAooooAKKKKACiivCr2yt7XxZJd3Udjq0Oo eKgljrUTH7Xpt6rAJbzI2C8IKBdoYDYCwwWTAB7rRXzX4o+I15448A3dpf22lMyaUmoOYEJe3uBf rCAMsduYmB9fn64OK9CHxE137PApi07z18TyeG5n8l9rsQfLnVfMyoU43IS27sy0DPUqK8WtviVq vinwzqtvd2GnBLjwxPqYXZIVxHI8E0TYcEh9hKsCpTdj58ZPNt4p8V2/g7xRNZ6vBZ22n6Vo6QW8 Fu48iKeMELCzSEowDkF23s2BgrgYAPo2ivLdW+IHie18V6vounWGnXb6Lb2011vZIROrKHmk3STr 5KBWAHyy4ONx5FZHw71ybxR8WF8Qz2trbPqXh2WURW8ZBVVvfKXexP7x9sY+bC8YGBigD2mivEn8 IWfiP4seNdKk0Sxl06aW0+1XQwk9nvtZH8yHj7zShSxyc91YElZ/FXxW8R6RpWravYQaULay1+TR Utp4JHdtkZYymQSKOSD8u3jPU45APZqK8l1X4ieKdNtNMvTFo5g1rTbnUbJBDKWt1it0uNsh8wBy QXj+UL/C/qldH4C8bXniu+1a2u7WCL7LFZ3ULQk/6u5hEqowJOWTkFhgN12r0oEdvRRRQAUUUUAF FFFABRRRQAUUUUAFV769t9M0+5v7uTy7a2iaaZ9pO1FBLHA5OAD0qxWfrtpb6h4e1KyuzOLa4tZY pjboXkCMhDbFAJLYJwADk9jQBiaL4q1bVhpN0/ht4dN1V2aC4W6EjQw+W7o8yhcIXCpgBmA3kFgQ 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 I/6BVj/4Dp/hRRRQB//Z ------=_NextPart_000_000E_01C28BCB.4CD95A50 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.sergey.com/web_course/images/submit.gif R0lGODdhXgAbAPQAAMbGxq2tnP8AAIyUnFpjzq2tvcbG3tbW/4SErb29/62t76Wl/4SE3oyM/2tr znNz3nNz/2Nj3lpa/0pK70JC/ykp/yEh9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAA XgAbAAAF/qAgjmRpnmiqrmzrvnAsz3Rt33iu76Ll/5WgkFKhGI+TCSUpmUiez4gEEoFYr1ZGA9LQ Nr7fRWNBLpcTi4R6zT4kDvA46mcRDovEo54i4UP/EFNVWFZbXGCIYmaLaI1sam5vcXBzPnZBeXhI Rk1+ToBPhIVbiKWKp2ZoaY+QkG6TlZZ3mkUIJA62A39SgVZTDyVch6ZjY4tpCwokrHCSsCdAl0RF FRMjRdYifn9RvlYkh8OlxcdpJW0JIq/PJtF3eQ4kEUcCfdxTob8kDBBaXF5gUB1DAwDAqgQGRgCQ 5OxArDrSipgY4MQBhQgjEEgANuLbCTAFRjQIKWLkCDLK/kaoAXBinRxo7qhRQ1GxhAQSGjmKCDAi QAOePUmwHKEgpUoF6UYYaDaJEkyIEbOZQBDB1ogBGDtCCEaiAIOuYE8KGCpi5TJXDR9GJELgxACq JG6OeCAhqwgGOgOQHLFXQN8CRseqIbGUYVO1dijY0jSAhOK4JB4wkHtXZ4EGXffq7algAWGDn1u5 dPj0UhARBKhJdSBVQITGV+mC69mPBGaxfAH0XUh2rIBXDZ22swS1QlsRSigct0iBRACrd6dk/CqC S1egAnwK9Sw0cNk3wYWXoGPHGsXjIiguoSxggl0HVSRQp21dpG3uY1ESNStiIXjg7IwXk0xH4JGc PffgnBPKIIR8IU4ixgxEhiNrABhcLKZhksce6/HxCTeiNPhgGOREOOGJrLTRFGnDyYIJNRxy4iEU n/CST4Ok5AhhOWescpArAL7UYoaZ6HEgH9uA2IsoOo5TooQUMjMaiwK6+OKGMSIISiAMEsLPFgCR KBAjP1YIXniIvQijJjI+kWRdUywpopNhKGIiilFWyFRaPPTp55+ABirooIGGAAA7 ------=_NextPart_000_000E_01C28BCB.4CD95A50 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.sergey.com/web_course/style.css .toolbar1 { PADDING-RIGHT: 3pt; PADDING-LEFT: 3pt; FONT-WEIGHT: bold; FONT-SIZE: = 8pt; PADDING-BOTTOM: 1pt; COLOR: #002255; PADDING-TOP: 1pt; FONT-FAMILY: = Tahoma, Arial, sans-serif } .toolbar2 { PADDING-RIGHT: 4pt; PADDING-LEFT: 4pt; FONT-WEIGHT: bold; FONT-SIZE: = 8pt; PADDING-BOTTOM: 1pt; COLOR: navy; PADDING-TOP: 1pt; FONT-FAMILY: = Tahoma, Arial, sans-serif } .title1 { PADDING-RIGHT: 4pt; PADDING-LEFT: 4pt; FONT-WEIGHT: bold; FONT-SIZE: = x-large; PADDING-BOTTOM: 7pt; COLOR: navy; PADDING-TOP: 10pt; = TEXT-ALIGN: center } .title2 { PADDING-RIGHT: 4pt; PADDING-LEFT: 4pt; FONT-WEIGHT: bold; FONT-SIZE: = x-large; PADDING-BOTTOM: 7pt; COLOR: navy; PADDING-TOP: 10pt; = TEXT-ALIGN: center; TEXT-DECORATION: underline } P { PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 7pt; = PADDING-TOP: 7pt } ------=_NextPart_000_000E_01C28BCB.4CD95A50 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.sergey.com/web_course/navig.js =0A= // Navigation function to go to the next / previous page=0A= // n is offset (1, -1 etc.)=0A= function goto_page (n) {=0A= var first =3D 0;=0A= var last =3D 14; // should be the next after the last one=0A= var part_name =3D "part_";=0A= var loc =3D window.location.href;=0A= var re =3D /(.*)\/(\w+)\.html([^\/]*)$/;=0A= var ra =3D re.exec(loc);=0A= =0A= // may be it ends with '/' instead of index.html=0A= if (ra =3D=3D null) {=0A= ra =3D re.exec(loc + "index.html");=0A= }=0A= var path =3D ra[1];=0A= var fname =3D ra[2]; =0A= =0A= // alert("=3D=3D" + ra[1] + "=3D=3D" + ra[2] + "=3D=3D" + ra[3]);=0A= =0A= if (n !=3D -1 && n !=3D 1) {=0A= alert("Hmmm... Wrong parameter to goto_page()...");=0A= }=0A= else if (fname =3D=3D "index" || fname =3D=3D "content") {=0A= if (n =3D=3D -1) {=0A= window.location.href =3D path + "/index.html";=0A= }=0A= else { // +1=0A= window.location.href =3D path + "/" + part_name + "1.html";=0A= }=0A= }=0A= else if (fname =3D=3D "reference") {=0A= if (n =3D=3D -1) {=0A= window.location.href =3D path + "/" + part_name + last + ".html";=0A= }=0A= else { // +1=0A= window.location.href =3D path + "/reference.html";=0A= }=0A= }=0A= else {=0A= var re1 =3D new RegExp("^" + part_name + "(\\d+)");=0A= var ra1 =3D re1.exec(fname);=0A= var num =3D parseInt(ra1[1]);=0A= if (num !=3D null) {=0A= num +=3D n;=0A= if (num > last) {=0A= window.location.href =3D path + "/reference.html";=0A= }=0A= else if (num <=3D first) {=0A= window.location.href =3D path + "/index.html";=0A= }=0A= else {=0A= window.location.href =3D path + "/" + part_name + num + ".html";=0A= }=0A= }=0A= else {=0A= alert("Hmmm... the filename " + fname + " looks strange...");=0A= }=0A= }=0A= }=0A= ------=_NextPart_000_000E_01C28BCB.4CD95A50--