    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: An Introduction to CGI Programming</title>
        <link>https://members.accu.org/index.php/articles/978</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Internet Topics + CVu Journal Vol 12, #2 - Mar 2000</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c69/">Internet</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c127/">122</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c69-127/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c69+127/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;An Introduction to CGI Programming</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 03 March 2000 13:15:35 +00:00 or Fri, 03 March 2000 13:15:35 +00:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e22" id="d0e22"></a></h2>
</div>
<p>CGI, the Common Gateway Interface, is a mechanism for allowing
your programs to be invoked by a Web server. Note that your program
is not downloaded and run on the user's computer, but is run by the
server. This allows the program to use the server's resources and
store things on the server, and it also means that CGI programs
(commonly called &quot;CGI scripts&quot;) can be used by almost any Web
browser, no matter how old (as long as it supports forms), on any
operating system. CGI programs are much more accessible to
disadvantaged users than the Java and Javascript equivalents, even
if the latter may be a little faster on some computers.</p>
<p>The downside of CGI is you need to be more worried about
security; because it is the web server that runs your program, a
misbehaving CGI program can interfere with the web server, so
anyone trying to break the web server may well start by giving your
program silly requests in an attempt to make it misbehave. For this
reason, many system administrators who are happy to give you space
for Web pages get a bit more worried when you speak of CGI. Some
sysadmins ask to read through your program first, expecting it to
be short (they get a bit funny when I dump my 200K of C++ on them
and tell them I want to update it often); others are more confident
about the restrictions that they have put in place. A program
called cgiwrap allows your CGI scripts to be run from your account
instead of the web server's account, and this helps with security
because your CGI program can't do anything that you can't do, but
some risks are still there. Many sysadmins insist that CGIs be
written in Perl or PHP-3. There is no technical reason why they
can't be written in C, C++ or almost any other language, but Perl's
string manipulation makes simple scripts easier to write in it and
more likely (but still not guaranteed) to be secure.</p>
<p>The execution of CGI programs should generally be quite brief.
They take input, do something, print out the results and exit. They
should ideally do this in less than one second (the user will see
more delay because of the network and so forth), but several
seconds is allowable if it is doing some kind of retrieval (such as
a search). Even a minute or two might be OK if the user knows it's
going to take that long (although in this case it helps to output
things as you go, which some web servers will propagate through to
the browser as it happens). If your program takes more than a few
minutes then the web server will probably kill it and say (perhaps
misleadingly) &quot;server overloaded&quot;. If you have administrative
control over the web server then you can set it to wait for longer,
but after a while the web browser will give up, and probably long
before that the user will give up. The server administrator may
also have something to say about long-running scripts, since while
they are running they take up resources on the server. It is easy
to make a &quot;denial of service&quot; attack that gives the server several
simultaneous requests to fill up a number of its connections for a
while. But then again, there is no known cure for denial of service
attacks if the attacker can break into enough machines to have more
bandwidth than you, and apart from knocking your server off the
Internet for a while they are mostly harmless.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e30" id="d0e30"></a>The FORM</h2>
</div>
<p>To get started with CGI, write a web page that goes something
like this:</p>
<pre class="programlisting">
&lt;HTML&gt;&lt;BODY&gt;
&lt;FORM METHOD=get ACTION=&quot;http://path/to/your/cgi/script&quot;&gt;
 &lt;LABEL NAME=L1&gt;
 What is your favourite colour?
 &lt;INPUT TYPE=text NAME=colour ID=L1&gt;
 &lt;/LABEL&gt;
 &lt;INPUT TYPE=submit VALUE=&quot;OK&quot;&gt;
 &lt;INPUT TYPE=reset VALUE=&quot;Reset&quot;&gt;
&lt;/FORM&gt;
&lt;/BODY&gt;&lt;/HTML&gt;
</pre>
<p>(HTML purists will not like the above, but I'm trying to be
brief.) If you then look at the above in a web browser, you can see
how it comes out in that particular browser. Netscape starts on a
new line when it finds a <tt class="literal">FORM</tt> tag, but
other browsers do not. Essentially you can use any HTML you like
within a <tt class="literal">FORM</tt>, but if you want the form to
do anything useful then you should include some <tt class=
"literal">INPUT</tt> tags, as in the above example, which
demonstrates the input types &quot;text&quot;, &quot;submit&quot; and &quot;reset&quot;. Notice
also the use of the <tt class="literal">LABEL</tt> tag, and its
matching <tt class="literal">ID</tt> attribute in the <tt class=
"literal">INPUT</tt> line. What this does (in the more advanced
browsers) is to cause the question and its text box to be treated
as one thing if you are using the keyboard to navigate through the
form. This is a great help to blind users, since they will always
hear the question when they find the text box.</p>
<p>If you want, you can limit the amount of text that the user can
type in the box by giving it a <tt class="literal">MAXLEN</tt>
attribute (e.g. <tt class="literal">&lt;INPUT TYPE=text MAXLEN=10
NAME=...</tt>). Note, however, that this only restricts the amount
of text that a web browser will let the user type; a malicious user
who wanted to break your program can still force a longer input by
hand, so your program has to be ready for inputs of any length. You
can control the width of the text box on the screen by using
<tt class="literal">SIZE</tt> (which need not be the same as
<tt class="literal">MAXLEN</tt>). Size is measured in characters,
which depends on the user's font size in some browsers but is fixed
in others (e.g. if you have large fonts, Netscape will enlarge the
forms also, but Internet Explorer will not). When allocating
<tt class="literal">SIZE</tt>, if you want the entirety of the text
to fit in the visible area then remember to allow one more place
for the cursor. It is not advisable to set a large <tt class=
"literal">SIZE</tt> value, since users with large fonts or small
windows may find that not all of the resulting text box fits on the
screen.</p>
<p>You can also include a default value in the text box, by using
the <tt class="literal">VALUE</tt> attribute. For example,
<tt class="literal">&lt;INPUT TYPE=text VALUE= &quot;Unspecified&quot;
NAME=...&gt;</tt> will cause the word &quot;Unspecified&quot; to appear in
the box by default, but the user can change it. Note that, when the
&quot;Reset&quot; button is pressed, the value of the text box now reverts to
&quot;Unspecified&quot; (rather than empty), and this is why it is called
&quot;reset&quot; rather than &quot;clear&quot;.</p>
<p>Another useful thing you can do is to put hidden values in the
form, such as the following:</p>
<pre class="programlisting">
&lt;INPUT TYPE=hidden NAME=language VALUE=Japanese&gt;
</pre>
<p>I use this for the Japanese entry page to my access gateway so
that the users are not confronted with irrelevant options; it can
also be useful when the CGI program itself is generating another
form (more on this below) and needs to include some values from the
first form. (Another use is for automating the selection of your
favourite options in a search engine. Simply copy the search
engine's form into your web page, taking care to ensure that the
action URL points to the right server, and change every option
except the &quot;what to search for&quot; box into hidden values. You do not
have to publish the URL of the resulting web page of course.)</p>
<p>There are, of course, other input types, such as radio buttons,
Netscape's &quot;file&quot; type (which allows the user to upload any file
from their computer to your program, although handling it is more
complicated), and other types that new browsers might implement
before you read this. There are also some special cases where INPUT
tags are not used at all, as the following two examples show:</p>
<pre class="programlisting">
&lt;SELECT NAME=&quot;colour&quot;&gt;
&lt;OPTION VALUE=&quot;red&quot;&gt;Red&lt;/OPTION&gt;
&lt;OPTION VALUE=&quot;green&quot;&gt;Green&lt;/OPTION&gt;
&lt;/SELECT&gt;
</pre>
<p>(Note that the <tt class="literal">VALUE</tt> gives what is
actually sent to your CGI program as though the user had typed it
into a text box, where the text before the <tt class=
"literal">&lt;/OPTION&gt;</tt> gives what is displayed by the
browser; these need not be the same.)</p>
<pre class="programlisting">
&lt;TEXTAREA NAME=&quot;text&quot; WRAP=&quot;hard&quot; HEIGHT=3 WIDTH=20&gt;
</pre>
<p>Here is some default text.</p>
<pre class="programlisting">
&lt;/TEXTAREA&gt;
</pre>
<p>If you make changes to the form while you are viewing it in your
web browser, you should, of course, tell the browser to re-load the
page to ensure you are looking at the latest version.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e111" id="d0e111"></a>The CGI
Program</h2>
</div>
<p>Let's get the form to actually do something. To do this, you
need to write a CGI program. Try the following C:</p>
<pre class="programlisting">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
int main(void) {
puts(&quot;Content-type: text/html&quot;);
puts(&quot;&quot;); /* blank line */
puts(&quot;&lt;HTML&gt;&lt;BODY&gt;&quot;);
puts(&quot;The query string is:&quot;);
puts(getenv(QUERY_STRING));
puts(&quot;&lt;/BODY&gt;&lt;/HTML&gt;&quot;);
}
</pre>
<p>If you compile that and run it from the command line, you will
find nothing interesting. It simply prints out the value of the
environment variable <tt class="literal">QUERY_STRING</tt>, which
is probably unset, wrapped in a load of HTML and a MIME header (the
&quot;Content-type&quot;). But if you try copying the executable into your
CGI directory, make sure the <tt class="literal">ACTION</tt>
attribute of your <tt class="literal">FORM</tt> points to its URL
(see your sysadmin if you don't know what the URL is), load the
form's page in your web browser, reload just in case, type
something in the box, and press OK, you should get something
like</p>
<p>The query string is <tt class="literal">colour=yellow</tt> in
your web browser. This is the output of the CGI program after it
has been decoded by the web browser, which, of course, understands
HTML. You can get CGI programs to output &quot;text/plain&quot; instead of
&quot;text/html&quot;. Then you do not have to get them to write HTML, but
the result (besides looking very amateurish) causes some web
browsers to load a text editor instead of displaying it in the
browser, which is not ideal. Of course, the HTML that is output by
the CGI can include links (which may be automatically generated)
and other forms (perhaps pointing back to the same CGI program and
including some values from the first). Some people write their
entire websites using CGI, and others (like myself) use a CGI
mediator for the whole World Wide Web.</p>
<p>Note that, when I printed out the query string, I used two
separate statements to do it, rather than doing something like
this:</p>
<pre class="programlisting">
printf(&quot;The query string is: %s\n&quot;,
             getenv(&quot;QUERY_STRING&quot;));
</pre>
<p>This is insecure, since many implementations of printf format
the string to a fixed-length buffer. If a malicious person puts
tens of thousands of characters in the box, and the web server lets
it through, then your program may get a buffer overflow,
overwriting its memory with the query string, and crash. A very
skilled attacker can even cause the web server to execute arbitrary
instructions in this way. This is why many prefer Perl, since it's
harder to make that kind of mistake. C++ streams (cin, cout) should
be fine; it's the printf functions that you need to be careful of.
(Yes, you can always say %500s instead of %s, but if you get into
the habit of doing that then your program will be riddled with
undocumented arbitrary limits.)</p>
<p>Aside: In fact, occasional web servers do not set the <tt class=
"literal">QUERY_STRING</tt> environment variable at all if there is
no string present, so in C/C++ you should check that the value
returned by getenv is not <tt class="literal">NULL</tt> before you
use it. You should do the same for any other environment variables
that you get.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e148" id="d0e148"></a>Parsing the
Query String</h2>
</div>
<p>Notice the value of the query string, &quot;<tt class=
"literal">colour=yellow</tt>&quot;. Try adding another text box (with
its question and <tt class="literal">LABEL</tt>) to the form, for
example, asking &quot;What is your friend's favourite colour&quot; and with
<tt class="literal">NAME=friend</tt>. Then go back and reload in
the web browser and you should see two text boxes (if you want them
to start on separate lines then use &lt;BR&gt; or whatever in the
HTML); type something in both of them and you should get something
like:</p>
<p>The query string is: <tt class=
"literal">colour=yellow&amp;friend=blue</tt></p>
<p>It helps if you read &amp; as &quot;and&quot;. In fact, your program can
go through the query string, splitting it whenever it comes to
'&amp;' (this is particularly easy for Perl programmers), and
splitting names and values whenever it comes to '='. If someone
types &amp; or = (or any other special character) in one of the
text boxes, then the special characters will be encoded as
hexadecimal sequences (see below). However, malicious queries can
of course be constructed by hand, and you need to be aware of this.
In your early CGI programs, you may not need to parse the query
string at all, but you will eventually (and note that the order of
the boxes, while often the same as the order they appear on the
form, is not guaranteed at all).</p>
<p>Note that spaces in the text are usually (but not always)
changed to + (pluses in the text will be encoded in hexadecimal).
So if you say your favourite colour is &quot;blue turquoise&quot;, the query
string will contain <tt class=
"literal">colour=blue+turquoise</tt>.</p>
<p>The hexadecimal values that I mentioned are of the form %xx,
where xx is a hexadecimal number (e.g. 9F or 9f). Your program does
need to be able to understand these, since what is and what is not
encoded in hex varies from browser to browser, and any text that
the user inputs might be encoded in this way. Essentially, whenever
you see a % sign, treat the next two characters as a hexadecimal
number giving the ASCII code of what should have been sent.</p>
<p>If you leave one of the boxes blank, then you might get
something like:</p>
<p>The query string is: <tt class=
"literal">colour=&amp;friend=blue</tt></p>
<p>Or, depending on the web browser, you might get:</p>
<p>The query string is: <tt class="literal">friend=blue</tt></p>
<p>You need to be prepared for such variations in browser
behaviour. This is particularly the case if you are using check
boxes (&quot;check&quot; is the American word for tick) on your form. Try
adding a checkbox, using</p>
<pre class="programlisting">
&lt;INPUT TYPE=checkbox NAME=box&gt;
</pre>
<p>(add <tt class="literal">CHECKED</tt> if you want the box to be
ticked to begin with). If you tick the box, you may get any of the
following:</p>
<p>The query string is: <tt class="literal">...&amp;box=on</tt></p>
<p>The query string is: <tt class="literal">...&amp;box=1</tt></p>
<p>The query string is: <tt class="literal">...&amp;box=</tt></p>
<p>The last result (from Konqueror) can be particularly confusing,
since an empty string for text boxes means an empty text box, but
an empty string for check boxes does NOT mean an empty check box.
If the check box is empty (unticked), then the &quot;<tt class=
"literal">box=</tt>&quot; will not be present in the query string at
all.</p>
<p>If you want more than one possible form submit button, then you
need to give each button a <tt class="literal">NAME</tt>, and which
button was pressed will be indicated in the query string as
<tt class="literal">name=value</tt> in the usual way (using the
<tt class="literal">NAME</tt> and <tt class="literal">VALUE</tt> of
the button). The <tt class="literal">VALUE</tt> is what will be
printed on the button. If you want an image to be printed on the
button instead, then you can do something like</p>
<pre class="programlisting">
&lt;INPUT TYPE=image SRC=&quot;fancy-button.gif&quot; ALT=&quot;OK&quot; HEIGHT=...
WIDTH=...&gt;
</pre>
<p>but there is a bug in Netscape that will complicate matters if
you use <tt class="literal">NAME</tt>/<tt class=
"literal">VALUE</tt>. What should happen in this case is &quot;OK&quot; to be
used as an <tt class="literal">ALT</tt> tag for the image, to be
displayed if images are turned off or to be used as &quot;bubble help&quot;
for the image. However, if the user happens to be running a recent
version of Netscape, then the <tt class="literal">NAME</tt>
attribute will be used instead of the <tt class="literal">ALT</tt>.
This is a bug, but browser bugs are something that you have to put
up with and work around (bearing in mind that they should one day
be fixed).</p>
<p>The attitude of a certain prominent Web standards consortium of
ignoring bugs on the grounds that they will eventually be fixed
leads to web pages that don't work on today's browsers (certain CSS
techniques being a prime example). It is therefore a good idea to
make such <tt class="literal">NAME</tt> tags at least vaguely
meaningful, since it is quite possible that the user will actually
see them.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e254" id="d0e254"></a>The MIME
Header</h2>
</div>
<p>The output of the CGI script before the first blank line is the
MIME header. It should at least contain &quot;Content-type&quot;; most web
servers will fill in the other details, and at this stage if you
come across a web server that doesn't then it's probably best to
use a better server (Apache is pretty good, and free).</p>
<p>If your script does not return the correct headers, then the web
server may return its &quot;500 Server Error&quot; page to the browser, which
is not particularly helpful but there might be a better message in
the server's error log. The way to debug a CGI that does this is to
set the query string at the command line, run it directly (not
through the web server) and look at the output.</p>
<p>The content type need not necessarily be &quot;text/html&quot;. It could
be something like &quot;image/x-gif&quot; and you could return an image file
instead of an HTML document. If you do this and your web server is
running on a Windows machine, remember to make sure that stdout is
opened in &quot;raw&quot; mode, otherwise the web server may turn every
character 10 (\n) into 13 10 (\r\n), which will corrupt a binary
file. The best way of returning binary files that are not
automatically generated is to use the &quot;Location&quot; header in the MIME
header, as in</p>
<pre class="programlisting">
Location: http://whatever
</pre>
<p>This is used for CGIs that take you to a random page or return a
random MIDI file. However, you do need to return some HTML as well
that points users in the right direction, in case their browser
does not honour such redirections.</p>
<p>You can also use the headers to set cookies (spare us) and
things like keywords for search engines, although sometimes it is
better to use <tt class="literal">META</tt> tags as these are saved
with the document if someone saves it to disk (the MIME header is
not saved).</p>
<p>The MIME header that the browser sends to the server is put in
the environment, with <tt class="literal">HTTP_</tt> prefixed to
each variable. Most web browsers send the &quot;User agent&quot; header to
identify the browser, so this is available in <tt class=
"literal">HTTP_USER_AGENT</tt> (which you can read with getenv in
C). It is inadvisable to return a completely different page to each
browser as this can make testing rather awkward (as well as making
it difficult for others who are testing your page if you do not
make it clear). Both Netscape and Internet Explorer announce
themselves as &quot;Mozilla&quot;; IE says &quot;Mozilla compatible&quot; so that it
works with servers and CGIs that search for the word Mozilla. My
access gateway uses a similar trick, since some web servers refuse
access to browsers not containing &quot;Mozilla 4&quot;.</p>
<p>It can be instructive to write a CGI program that executes the
&quot;env&quot; (or &quot;set&quot;) command so that you can see all the variables that
are available on a particular server. Never rely on any <tt class=
"literal">HTTP_</tt> variable being set (or being set to a sensible
value), since they are all coming from the browser and a malicious
attacker can of course construct bogus ones by hand. If you write a
&quot;robot trap&quot; that denies access to email-collecting robots based on
the user agent header, it is advisable to include a message
explaining the situation, just in case someone is viewing your page
through a personal proxy that removes or changes this information
(it can happen).</p>
<p>The <tt class="literal">REMOTE_HOST</tt> variable is usually set
to the domain name of the user's computer, which may be something
like <tt class="literal">pc003.joh.cam.ac.uk</tt> or it might be
unset if the DNS lookup fails (or if the server is set to not make
a lookup). <tt class="literal">REMOTE_ADDR</tt> is set to the IP
address. This can be used if you need to only allow local users to
use your script, but again it is best to include an explanatory
message when denying access in case for some reason access is
denied to someone for whom it should not be.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e296" id="d0e296"></a>The POST
Method</h2>
</div>
<p>You may notice when you try out your form that the URL actually
got by the browser is formed by adding a '?' to your CGI URL and
then the query string. This is useful, because the complete query
(including all the input) is a single URL that can be included in
links and bookmarks. It can also be used to construct and modify
CGI queries &quot;by hand&quot;. Note: If you are typing one of these things
on the Lynx command line, you must be careful to quote it
correctly, since &amp; happens to be the Unix &quot;background&quot;
operator; a command line of the form a&amp;b&amp;c does a, b and c
all at the same time, and the results can be quite spectacular (but
not necessarily what you wanted).</p>
<p>While <tt class="literal">GET URL</tt>s are useful, they do have
their disadvantages. You may not want it to be possible to include
all the user input in links and bookmarks, perhaps because running
your program will cause a credit card to be billed, in which case
you do not want any accidents with the program being run twice.
(You should of course make sure that the server has encryption if
you are going into that market.) Also, URLs that include all the
user input tend to be very long, and can get unwieldy especially in
links (take a look at the HTML source of a page processed by the
access gateway to see what I mean). If you do not like them then
you may wish to use <tt class="literal">METHOD=post</tt> instead of
<tt class="literal">METHOD=get</tt>.</p>
<p>In the <tt class="literal">POST</tt> method, instead of
<tt class="literal">QUERY_STRING</tt> being set, the query string
is placed on the standard input (<tt class="filename">stdin</tt>)
by the web server. (Some web servers can be set to set <tt class=
"literal">QUERY_STRING</tt> as well, but this does not always
happen.) The <tt class="literal">CONTENT_LENGTH</tt> environment
variable is set to the number of bytes placed on <tt class=
"filename">stdin</tt>, or you could just read it until <tt class=
"literal">EOF</tt>. It is probably worth writing your CGI in such a
way that it can get its query string from either the environment or
the standard input, so that it doesn't matter which method you use
and you can change it later.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e335" id="d0e335"></a>Wanted</h2>
</div>
<p>There is also another method that is sometimes used, which is a
variation on <tt class="literal">POST</tt>, with encoding set to
&quot;multipart&quot;. It is not supported by all browsers. You need to use
this method if you are using Netscape's <tt class=
"literal">FILE</tt> input type to allow the user to upload files,
but some people use it anyway, particularly if they've built their
website out of Microsoft tools, which seem to use it as the
default. I would very much like an article on how to deal with this
encoding method, since my access gateway currently does not support
it and so any web page that uses it is currently inaccessible to
me.</p>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
