Denis Vlasenko | 136f42f | 2007-02-11 14:52:07 +0000 | [diff] [blame] | 1 | <html><head><title>CGI Script output</title></head><body><h1><img alt="" src="out_files/CGIlogo.gif"> CGI Script Output</h1> |
| 2 | <hr> |
| 3 | |
| 4 | <h2>Script output</h2> |
| 5 | |
| 6 | The script sends its output to stdout. This output can either be a |
| 7 | document generated by the script, or instructions to the server for |
| 8 | retrieving the desired output. <p> |
| 9 | </p><hr> |
| 10 | |
| 11 | <h2>Script naming conventions</h2> |
| 12 | |
| 13 | Normally, scripts produce output which is interpreted and sent back to |
| 14 | the client. An advantage of this is that the scripts do not need to |
| 15 | send a full HTTP/1.0 header for every request. <p> |
| 16 | <a name="nph"> |
| 17 | Some scripts may want to avoid the extra overhead of the server |
| 18 | parsing their output, and talk directly to the client. In order to |
| 19 | distinguish these scripts from the other scripts, CGI requires that |
| 20 | the script name begins with nph- if a script does not want the server |
| 21 | to parse its header. In this case, it is the script's responsibility |
| 22 | to return a valid HTTP/1.0 (or HTTP/0.9) response to the client. </a></p><p> |
| 23 | |
| 24 | </p><hr> |
| 25 | <h2><a name="nph">Parsed headers</a></h2> |
| 26 | |
| 27 | <a name="nph">The output of scripts begins with a small header. This header consists |
| 28 | of text lines, in the same format as an </a><a href="http://www.w3.org/hypertext/WWW/Protocols/HTTP/Object_Headers.html"> |
| 29 | HTTP header</a>, terminated by a blank line (a line with only a |
| 30 | linefeed or CR/LF). <p> |
| 31 | |
| 32 | Any headers which are not server directives are sent directly back to |
| 33 | the client. Currently, this specification defines three server |
| 34 | directives:</p><p> |
| 35 | |
| 36 | </p><ul> |
| 37 | <li> <code>Content-type</code> <p> |
| 38 | |
| 39 | This is the MIME type of the document you are returning. </p><p> |
| 40 | |
| 41 | </p></li><li> <code>Location</code> <p> |
| 42 | |
| 43 | This is used to specify to the server that you are returning a |
| 44 | reference to a document rather than an actual document. </p><p> |
| 45 | |
| 46 | If the argument to this is a URL, the server will issue a redirect |
| 47 | to the client. </p><p> |
| 48 | |
| 49 | If the argument to this is a virtual path, the server will |
| 50 | retrieve the document specified as if the client had requested |
| 51 | that document originally. ? directives will work in here, but # |
| 52 | directives must be redirected back to the client.</p><p> |
| 53 | |
| 54 | |
| 55 | </p></li><li> <a name="status"><code>Status</code></a><p> |
| 56 | |
| 57 | This is used to give the server an HTTP/1.0 <a href="http://www.w3.org/hypertext/WWW/Protocols/HTTP/HTRESP.html">status |
| 58 | line</a> to send to the client. The format is <code>nnn xxxxx</code>, |
| 59 | where <code>nnn</code> is the 3-digit status code, and |
| 60 | <code>xxxxx</code> is the reason string, such as "Forbidden".</p><p> |
| 61 | |
| 62 | </p></li></ul> |
| 63 | |
| 64 | <hr> |
| 65 | <h2>Examples</h2> |
| 66 | |
| 67 | Let's say I have a fromgratz to HTML converter. When my converter is |
| 68 | finished with its work, it will output the following on stdout (note |
| 69 | that the lines beginning and ending with --- are just for illustration |
| 70 | and would not be output): <p> |
| 71 | |
| 72 | </p><pre>--- start of output --- |
| 73 | Content-type: text/html |
| 74 | |
| 75 | --- end of output --- |
| 76 | </pre> |
| 77 | |
| 78 | Note the blank line after Content-type. <p> |
| 79 | |
| 80 | Now, let's say I have a script which, in certain instances, wants to |
| 81 | return the document <code>/path/doc.txt</code> from this server just |
| 82 | as if the user had actually requested |
| 83 | <code>http://server:port/path/doc.txt</code> to begin with. In this |
| 84 | case, the script would output: </p><p> |
| 85 | </p><pre>--- start of output --- |
| 86 | Location: /path/doc.txt |
| 87 | |
| 88 | --- end of output --- |
| 89 | </pre> |
| 90 | |
| 91 | The server would then perform the request and send it to the client. |
| 92 | <p> |
| 93 | |
| 94 | Let's say that I have a script which wants to reference our gopher |
| 95 | server. In this case, if the script wanted to refer the user to |
| 96 | <code>gopher://gopher.ncsa.uiuc.edu/</code>, it would output: </p><p> |
| 97 | |
| 98 | </p><pre>--- start of output --- |
| 99 | Location: gopher://gopher.ncsa.uiuc.edu/ |
| 100 | |
| 101 | --- end of output --- |
| 102 | </pre> |
| 103 | |
| 104 | Finally, I have a script which wants to talk to the client directly. |
| 105 | In this case, if the script is referenced with <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html#protocol"><code>SERVER_PROTOCOL</code></a> of HTTP/1.0, |
| 106 | the script would output the following HTTP/1.0 response: <p> |
| 107 | |
| 108 | </p><pre>--- start of output --- |
| 109 | HTTP/1.0 200 OK |
| 110 | Server: NCSA/1.0a6 |
| 111 | Content-type: text/plain |
| 112 | |
| 113 | This is a plaintext document generated on the fly just for you. |
| 114 | |
| 115 | --- end of output --- |
| 116 | </pre> |
| 117 | |
| 118 | |
| 119 | <hr> |
| 120 | |
| 121 | <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html"><img alt="[Back]" src="out_files/back.gif">Return to the |
| 122 | interface specification</a> <p> |
| 123 | |
| 124 | CGI - Common Gateway Interface |
| 125 | </p><address><a href="http://hoohoo.ncsa.uiuc.edu/cgi/mailtocgi.html">cgi@ncsa.uiuc.edu</a></address> |
| 126 | </body></html> |