CGI applications can return nearly any type of virtual document, as long as the client can handle it properly. It can return a plain text file, an HTML file ... or it can send PostScript, PDF, SGML, etc.
This is why the client sends a list of "accept types" it supports, both directly and indirectly through helper applications, to the server when it issues a request. The server stores this information in the environment variable HTTP_ACCEPT, and the CGI program can check this variable to ensure that it returns a file in a format the browser can handle.
It's also why when you are returning a document, the CGI program needs to use the Content-type header to notify the client what type of data it is sending, so that the browser can format and display the document properly.
Here's a simple snippet of code that checks to see if the browser accepts JPEG or GIF images:
#!/usr/local/bin/perl $gif_image = "logo.gif"; $jpeg_image = "logo.jpg"; $plain_text = "logo.txt"; $accept_types = $ENV{'HTTP_ACCEPT'}; if ($accept_types =~ m|image/gif|) { $html_document = $gif_image; } elsif ($accept_types =~ m|image/jpeg|) { $html_document = $jpeg_image; } else { $html_document = $plain_text; } . . .
We use a regular expression to search the $accept_types variable for a MIME content type of image/gif and image/jpeg. Once that's done, you can open the file, read it, and output the data to standard output, like we've seen in previous examples.