annotate packages/net/athttpd/current/doc/athttpd.sgml @ 2326:bd648d8929f6

* cdl/httpd.cdl: Improve CDL dependencies. * doc/athttpd.sgml: Updated to describe lasted changes and corrected minor typos. * src/http.c: Check for "Content-Type" header. This is needed if we want to support parsing form variables in POST requests. * src/jim.c: Updated with latest release from Jim CVS. * src/cgi.c: streamlined cyg_httpd_exec_cgi_tcl(), now uses the 'source' command of tcl to execute a tcl script. * src/forms.c: Modified cyg_handle_method_POST so that the variables in the payload are scanned only if the request has a Content-Type of 'application/x-www-form-urlencoded' * src/jim-aio.c: Added to package. Now tcl has IO functions to access a file system. * include/httpd.h: Added a new mode, CYG_HTTPD_MODE_FORM_DATA which is set when a POST request has a Content-Type of 'application/x-www-form-urlencoded' * cdl/httpd.cdl: add CYGOPT_NET_ATHTTPD_CLOSE_CHUNKED_CONNECTIONS. Default is set to CLOSE, so it is backward compatible with previous versions of the browser. * src/socket.c: cyg_httpd_process_request() uses a loop to collect at least one full frame (til a header terminator is found), cyg_httpd_start_chunked() only close if configured to do so. * src/httpd.c: Overhaul of cyg_httpd_send_error to avoid the use of inbuffer as temporary storage (conflicts with pipelined frames), removed the option to send a page after calling a C language handler * include/httpd.h: Added a new mode, CYG_HTTPD_MODE_NO_CACHE 2006-10-12 Lars Povlsen <lpovlsen@vitesse.com> and Anthony Tonizzo <atonizzo@gmail.com> * cdl/httpd.cdl: add CYGNUM_ATHTTPD_SERVER_MAX_POST to limit POST'ed data * include/http.h: Added header_end, post_data fields to httpstate, Added "302 Found" for POST handler redirect (CYG_HTTPD_STATUS_MOVED_TEMPORARILY) * src/forms.c: Fixed variable decoding, fixed large POST processing * src/http.c: Fixed some debug ouptuts, cleanup after POST processing, overhaul of the pipelined requests code which can now handle multiple requests per frame. * src/socket.c: Removed assert for socket write failure, Accumulating receiving of requests (Browsers (Firefox) may pass partial headers in separate fragments). Fixed some diagnostics output.
author jlarmour
date Mon, 27 Nov 2006 15:41:55 +0000
parents b5670f3c40f2
children a72554718436
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
2 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
3 <!-- athttpd.sgml -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
4 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
5 <!-- Another Tiny HTTPD Server for eCos -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
6 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
7 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
8 <!-- ####COPYRIGHTBEGIN#### -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
9 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
10 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
11 <!-- Copyright (C) 2003, 2004 eCosCentric Ltd. -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
12 <!-- This material may be distributed only subject to the terms -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
13 <!-- and conditions set forth in the Open Publication License, v1.0 -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
14 <!-- or later (the latest version is presently available at -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
15 <!-- http://www.opencontent.org/openpub/) -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
16 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
17 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
18 <!-- ####COPYRIGHTEND#### -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
19 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
20 <!-- #####DESCRIPTIONBEGIN#### -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
21 <!-- -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
22 <!-- ####DESCRIPTIONEND#### -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
23 <!-- =============================================================== -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
24
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
25 <!-- }}} -->
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
26
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
27
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
28 <part id="athttpd">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
29 <title>Another Tiny HTTP Server for <productname>eCos</productname></title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
30
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
31 <partintro>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
32 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
33 This package provides an extensible, small footprint, full featured HTTP
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
34 server for <productname>eCos</productname>. Many of these features can be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
35 disabled via the configuration tool, thus reducing the footprint of the server.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
36 The server has been written for the FreeBSD network stack.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
37 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
38 </partintro>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
39
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
40 <chapter id="net-athttpd">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
41 <title>The ATHTTP Server</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
42 <sect1 id="athttpd-features">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
43 <title>Features</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
44 <para>This ATHTTP implementation provides the following features:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
45 <itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
46 <listitem><para>GET, POST and HEAD Methods</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
47 <listitem><para>File system Access</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
48 <listitem><para>Callbacks to C functions</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
49 <listitem><para>MIME type support</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
50 <listitem><para>CGI mechanism through the OBJLOADER package or through a
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
51 simple tcl interpreter</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
52 <listitem><para>Basic Authentication</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
53 <listitem><para>Directory Listing</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
54 <listitem><para>Extendable Internal Resources</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
55 </itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
56
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
57 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
58 Ecos tables are used extensively throught the server to provide a high degree
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
59 of customization.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
60 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
61
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
62 <sect1 id="athttpd-using">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
63 <title>Starting the server</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
64 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
65 In order to start the web server, the user needs to call the function:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
66
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
67 <programlisting width=72>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
68 cyg_httpd_start();
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
69 </programlisting>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
70
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
71 <para>in the application code. The server initialization code spawns a new
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
72 thread which calls <command>init_all_network_interfaces()</command> to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
73 initialize the TCP/IP stack and then starts the deamon. The function is safe
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
74 to call multiple times.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
75 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
76 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
77
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
78 <sect1 id="athttpd-mime-types">
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
79 <title>MIME types</title>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
80 <para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
81 The server has an internal table with all the recognized mime types. Each time
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
82 a file or an internal resource is sent out by the server, its extension is
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
83 searched in this table and if a match is found, the associated MIME type is
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
84 then sent out in the header.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
85
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
86 The server already provides entries for the following standard file extensions:
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
87
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
88 'html', 'htm', 'gif', 'jpg', 'css', 'js', 'png'
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
89
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
90 and the user is responsible for adding any further entry. The syntax for
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
91 adding an entry is the following:</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
92
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
93 <para><programlisting width=72>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
94 CYG_HTTPD_MIME_TABLE_ENTRY(entry_label, extension_string, mime_tipe_sting);
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
95
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
96 entry table : an identifier unique to this entry
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
97 extension string : a string containing the extension for this entry
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
98 type_string : the mime string. The strings for many more mime types
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
99 is included in a file in the "doc" directory.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
100 </programlisting></para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
101
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
102 <para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
103 The following is an example of how to add the Adobe Portable Document Format
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
104 <command>pdf</command> MIME type to the table:</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
105
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
106 <para><programlisting width=72>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
107 CYG_HTTPD_MIME_TABLE_ENTRY(hal_pdf_entry, "pdf", "application/pdf");
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
108 </programlisting></para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
109
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
110 <sect2 id="athttpd-mime-types-chunked">
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
111 <title>MIME Types for Chunked Frames</title>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
112 <para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
113 For chunked frames, which are generally used inside c language callbacks, there
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
114 is no file name to match an extension to, and thus the extension to be used
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
115 must be passed in the <command>cyg_httpd_start_chunked()</command> call. The
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
116 server will then scan the MIME table to find a MIME type to match the extension.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
117
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
118 For example, to start a chunked transfer of an <command>html</command> file,
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
119 the following call is used:</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
120
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
121 <para><programlisting width=72>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
122 cyg_httpd_start_chunked("html");
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
123 </programlisting></para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
124
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
125 <para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
126 In any event, it is the responsibility of the user to make sure that a match to
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
127 all used extensions is found in the table search. Failing this,
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
128 the default MIME type specified in the CYGDAT_NET_ATHTTPD_DEFAULT_MIME_TYPE
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
129 string is returned.</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
130 </sect2>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
131 </sect1>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
132
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
133 <sect1 id="athttpd-callback">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
134 <title>C language callback functions</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
135 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
136 The server allows the association of particular URLs to C language callback
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
137 functions. eCos tables are used to define the association between a URL and its
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
138 corresponding callback. The syntax of the macro to add callback entries to
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
139 the table is:
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
140 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
141
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
142 <para><programlisting width=72>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
143 CYG_HTTPD_HANDLER_TABLE_ENTRY(entry_label, url_string, callback);
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
144
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
145 entry table : an identifier unique to this entry.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
146 url_string : a string with the extension url that will be appended to the
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
147 default directory.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
148 callback : a function with a prototype:
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
149 cyg_int32 callback_function(CYG_HTTPS_STATE*);
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
150 </programlisting></para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
151
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
152 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
153 <command>CYG_HTTPS_STATE*</command> is a pointer to a structure that
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
154 contains, among others, a buffer (outbuffer) that can be used to send data
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
155 out. The definitions of the structure is in http.h.</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
156
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
157 <para>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
158 The following is an example of how to add a callback to a function myForm()
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
159 whenever the URL /myform.cgi is requested:
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
160 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
161
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
162 <programlisting width=72>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
163 CYG_HTTPD_HANDLER_TABLE_ENTRY(hal_cb_entry, "/myform.cgi", myForm);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
164 </programlisting>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
165
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
166 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
167 and somewhere in the source tree there is a function:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
168
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
169 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
170 cyg_int32 myForm(CYG_HTTPS_STATE* p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
171 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
172 cyg_httpd_start_chunked("html");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
173 strcpy(p->outbuffer, "eCos Web Server");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
174 cyg_httpd_write_chunked(p->outbuffer, strlen(p->outbuffer))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
175 cyg_httpd_end_chunked();
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
176 }
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
177 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
178
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
179 <para>This function also shows the correct method of using the chunked frames
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
180 API inside a c language callback and also shows the use of outbuffer to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
181 collect data to send out.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
182
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
183 <para>Chunked frames are useful when the size of the frame is not known upfront.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
184 In this case it possible to send a response in chunks of various sizes, and
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
185 terminate it with a null chunk (See RFC 2616 for details). To use chunked
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
186 frames, the <command>cyg_httpd_start_chunked()</command> function is used.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
187 The prototype is the following:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
188
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
189 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
190 ssize_t cyg_httpd_start_chunked(char *);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
191 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
192
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
193 <para>The only parameter is the <command>extension</command> to use in the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
194 search for the MIME type. For most files this will be "html" or "htm" and
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
195 it will be searched in the MIME table for an approriate MIME type that will
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
196 be sent along in the header. The function returns the number of bytes sent
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
197 out.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
198
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
199 <para>The chunked frame must be terminated by a call to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
200 <command>cyg_httpd_end_chunked()</command>:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
201
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
202 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
203 void cyg_httpd_end_chunked()(void);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
204 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
205
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
206 <para>In between these two calls, the user can call the function
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
207 <command>cyg_httpd_write_chunked()</command> to send out data any number of
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
208 times. It is important that <command>cyg_httpd_write_chunked()</command> be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
209 the only function used to send data out for chunked frames. This
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
210 guarantees that proper formatting of the response is respected.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
211 The prototype for the function is:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
212
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
213 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
214 ssize_t cyg_httpd_write_chunked(char* p, int len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
215 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
216
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
217 <para>The 'char*' points to the data to send out, the 'int' is the length of the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
218 data to send.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
219
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
220 <para>In the case in which the size of the data is known upfront, the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
221 callback can instead create the header with a call to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
222 <command>cyg_httpd_create_std_header()</command> with the following
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
223 prototype:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
224
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
225 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
226 void cyg_httpd_create_std_header(char *ext, int len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
227
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
228 extension : the extension used in the search of the MIME type
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
229 len : length of the data to send out
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
230 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
231
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
232 <para>and use
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
233 <command>cyg_httpd_write()</command> to send data out to the client. The
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
234 prototype of <command>cyg_httpd_write()</command> is the same as
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
235 <command>cyg_httpd_write_chunked()</command></para></sect1>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
236
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
237 <sect1 id="athttpd-cgi">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
238 <title>CGI</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
239 <para>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
240 The web server allows writing of pseudo-CGI programs. This is helpful in order
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
241 to modify the functionality of the server without having to recompile it and
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
242 reflash it.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
243
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
244 <para>One way to implement CGI is, of course, the C language callback mechanism
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
245 described above: This assumes, of course, that all the callbacks are written
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
246 by compile time and cannot be modified later on. Another way to perform the
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
247 same functionality is the use of a library in the form of an object file.
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
248 These object files reside in the file system and are loaded, executed and
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
249 unloaded on demand.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
251 <para>Yet a third way is the use of a scripting language. Since full fledged
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
252 implementation of the most popular scripting languages such as Python or Perl
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
253 are too large for most embedded systems, a slim down implementation of tcl
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
254 was chosen for this server. Most of the tcl functionality is still there,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
255 and makes writing cgi a lot easier.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
256
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
257 <para>In order to limit the footprint of the operating system support for both
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
258 the objloader and the tcl script for dealing with cgi files can be
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
259 independently selected out. Tcl support in particular increases the memory
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
260 requirements considerably.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
261 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
262
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
263 <sect2 id="athttpd-cgi-objloader">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
264 <title>CGI via objloader</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
265 <para>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
266 In order to use the cgi mechanism the CYGPKG_OBJLOADER must be included
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
267 when building the operating system. This will enable the proper option in the
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
268 configuration tool and if selected, the necessary code will be compiled
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
269 in the eCos kernel. The user will then have to compile the necessary libraries
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
270 and place them in the file system under a directory defined by
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
271 CYGDAT_NET_ATHTTPD_SERVEROPT_CGIDIR.
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
272 When a request is made, the web server checks if the root directory of the
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
273 requested URL is inside the CYGDAT_NET_ATHTTPD_SERVEROPT_CGIDIR directory.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
274 If so, the server assumes that the user requested a cgi file and looks into the
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
275 directory to see if a library by the same name is present, and if so load it
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
276 and tries to execute a function inside the library with the following prototype:
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
277 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
278
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
279 <programlisting width=72>void exec_cgi(CYG_HTTPS_STATE *)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
280 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
281
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
282 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
283 The pointer <command>CYG_HTTPS_STATE*</command> gives access to the socket
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
284 data: The user will use this pointer to access the 'outbuffer' and use it to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
285 copy data to send data out.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
286 </para>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
287
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
288 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
289 When using the OBJLOADER package within the HTTP server a number of functions
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
290 are automatically added to the externals table of the OBJLOADER package. These
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
291 functions are likely to be used inside the library and the relocator need to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
292 have a pointer to them. In order to add more functions, see the OBJLOADER
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
293 documentation. The complete list of the functions automatically added is:
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
294 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
295
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
296 <itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
297 <listitem><para>cyg_httpd_start_chunked()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
298 <listitem><para>cyg_httpd_write_chunked()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
299 <listitem><para>cyg_httpd_end_chunked()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
300 <listitem><para>cyg_httpd_write()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
301 <listitem><para>cyg_httpd_find_form_variable()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
302 <listitem><para>cyg_httpd_find_ires()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
303 <listitem><para>cyg_httpd_send_ires()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
304 <listitem><para>diag_printf()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
305 <listitem><para>cyg_httpd_format_header()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
306 <listitem><para>cyg_httpd_find_mime_string()</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
307 </itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
308
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
309 <para>Every time the web client issues a GET or POST request for a file with an
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
310 extension of '.o'in the /cgi-bin directory (or whatever path the user chooses
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
311 to hold the libraries) then the library by that name is loaded, run and
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
312 when the execution is over, it is dumped from memory.
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
313
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
314 The library must be compiled separately, using the same toolchain used to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
315 compile the server and then added to the file system.</para>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
316
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
317 <para>In order to reduce the footprint of the server, CGI through OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
318 can be compiled out by unchecking CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
319 in the configuration tool.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
320 </sect2>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
321
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
322 <sect2 id="athttpd-cgi-tcl">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
323 <title>CGI via the simple tcl interpreter</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
324 <para>A small tcl interpreter has been added to the web server, and it can
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
325 be used to write simple cgi scripts. The interpreter is admittedly very
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
326 minimal, and it is only useful for very simple applications, but it is an
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
327 excellent starting point for further development.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
328
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
329 <para>In order for the scripting language to be useful, it has to access
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
330 the form variables passed on during the GET or POST request. Because of
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
331 this, all form variables registered with the CYG_HTTPD_FVAR_TABLE_ENTRY()
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
332 macro are accessible via tcl. For example, if we have registered a
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
333 form variable called foo, and during the GET request we are defining foo
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
334 as being "1":</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
335
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
336 <programlisting width=72>GET /myForm.cgi?foo=1</programlisting>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
337
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
338 <para>then tcl will be able to access the variable foo as $foo.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
339
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
340 <para>In order to send back a response to the client a few functions have been
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
341 added to the interpreter. These functions are:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
342
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
343 <sect3 id="athttpd-start-chunked">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
344 <title>start_chunked</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
345 <programlisting width=72>start_chunked "extension";</programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
346 <para>"extension" is a string used to search the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
347 table of the mime types. For example, to send back to the client an HTML file,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
348 we can use: start_chunked "html";
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
349 </para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
350 </sect3>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
351
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
352 <sect3 id="athttpd-write-chunked">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
353 <title>write_chunked</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
354 <programlisting width=72>write_chunked content;</programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
355 <para>content is a string to send back to the client.
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
356 </para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
357 </sect3>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
358
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
359 <sect3 id="athttpd-end-chunked">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
360 <title>end_chunked</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
361 <programlisting width=72>end_chunked;</programlisting>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
362 <para>No parameters. Send back an end of frame to the client.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
363 </sect3>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
364 </sect2>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
365 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
366
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
367 <sect1 id="athttpd-authentication">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
368 <title>Authentication</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
369 <para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
370 The server supports both Basic (base64) and Digest (MD5) authentication,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
371 although they have not been tested with all clients. In this implementation,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
372 the contents of certain directories of the file system can be protected, such
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
373 that the user will be required to issue a username/password to access the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
374 content of the directory.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
375
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
376 <para>To protect a directory with a basic authentication, there is a
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
377 specific macro:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
378
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
379 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
380 CYG_HTTPD_AUTH_TABLE_ENTRY(entry, path, domain, un, pw, mode)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
381
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
382 entry : an identifier unique to this entry.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
383 path : the path to the directory whose content must be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
384 authenticated before it is sent out
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
385 domain : a domain identifier for this directory.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
386 un : username for authentication
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
387 pw : password for authentication
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
388 mode : CYG_HTTPD_AUTH_BASIC for base64 encoding or
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
389 CYG_HTTPD_AUTH_DIGEST for MD5 encoding
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
390 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
391
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
392 <para>for example, to require basic authentication of the content of directory
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
393 "/ecos/" with a username of "foo" and password "bar", the following is used:
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
394 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
395
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
396 <programlisting>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
397 CYG_HTTPD_AUTH_TABLE_ENTRY(hal_domain1_entry, \
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
398 "/ecos/", "ecos_domain", \
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
399 "foo", "bar", \
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
400 CYG_HTTPD_AUTH_BASIC);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
401 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
402
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
403 <para>Any request for a file in the directory /ecos/ will now trigger a
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
404 credential check. These credentials, once provided, are automatically sent by
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
405 the client for every request within the particular domain.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
406
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
407 <para>It must be noticed that the path name set in the macro is relative to the
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
408 HTML document directory, CYGDAT_NET_HTTPD_SERVEROPT_HTMLDIR and it is the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
409 first part of the path provided by the client request (including the leading
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
410 slash).</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
411
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
412 <para>In order to reduce the footprint of the server, authentication
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
413 is not enabled by default, and so the option CYGOPT_NET_ATHTTPD_USE_AUTH must
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
414 be used to enable support for basic and digest authentication.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
415
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
416 <para>The MD5 digest authentication support is implemented using the RSA
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
417 Data Security, Inc. MD5 Message-Digest Algorithm. Derivative works with
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
418 MD5 digest authentication included must be identified as "derived from the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
419 RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
420 mentioning or referencing the derived work. See the file md5.c within this
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
421 package for license details.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
422 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
423
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
424 <sect1 id="athttpd-dirlist">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
425 <title>Directory Listing</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
426
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
427 <para>If the user issues a "GET" request with a URL terminating in a slash, the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
428 server will try to locate one of the following index files in the directory,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
429 choosing one in the following order:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
430
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
431 <itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
432 <listitem><para>index.html</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
433 <listitem><para>index.htm</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
434 <listitem><para>default.html</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
435 <listitem><para>home.html</para></listitem>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
436 </itemizedlist>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
437
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
438 <para>If any of these files is found, its contents are sent back
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
439 to the client. If no such file is found the server uses the user-provided
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
440 index file name (if any is specified with the CYGDAT_NET_ATHTTPD_ALTERNATE_HOME
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
441 setting. Failing all this a directory listing is sent.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
442
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
443 <para>Trailing slash redirection for directory names is supported.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
444
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
445 <para>In order to reduce the footprint of the server, directory listing can
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
446 be disabled by unchecking CYGOPT_NET_ATHTTPD_USE_DIRLIST. The savings are
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
447 substantial since directory listing also makes use of a few internal
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
448 resources (gif files) which are also compiled out.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
449 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
450
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
451 <sect1 id="athttpd-formvars">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
452 <title>Form Variables</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
453
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
454 <para>The server will automatically try to parse form variables when a form is
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
455 submitted in the following cases:
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
456
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
457 <itemizedlist>
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
458 <listitem><para>In a GET request, when the URL is followed by a question
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
459 mark sign</para></listitem>
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
460 <listitem><para>In a POST request, when the the 'Content-Type' header line
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
461 is set to 'application/x-www-form-urlencoded'</para></listitem>
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
462 </itemizedlist>
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
463
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
464 The variable names to look for during the parsing are held in
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
465 an eCos table. In order to take advantage of this feature, the user first
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
466 adds the variable names to the table, which also requires providing a buffer
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
467 where the parsed value will eventually be stored. The values will then be
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
468 available in the buffers during the processing of the request, presumably in
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
469 the body of a c language callback or CGI script.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
470
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
471 <para>For example, if the user wants two form variables, "foo" and "bar", to
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
472 be parsed automatically, those variable names must be added to the table
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
473 with the following macro:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
474
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
475 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
476 CYG_HTTPD_FVAR_TABLE_ENTRY(entry, name, buffp, bufflen)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
477
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
478 entry : an identifier unique to this entry.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
479 name : name of the form variable
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
480 buffp : a pointer to a buffer of characters where to store the value
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
481 of the form variable.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
482 bufflen : The length of the buffer. Must include a trailing string
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
483 terminator.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
484 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
485
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
486 <para>or, in the specific instance mentioned above:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
487
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
488 <programlisting>
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
489 #define HTML_VAR_LEN 20
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
490 char var_foo[HTML_VAR_LEN];
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
491 char var_bar[HTML_VAR_LEN];
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
492 CYG_HTTPD_FVAR_TABLE_ENTRY(hal_form_entry_foo, "foo", var_foo, HTML_VAR_LEN);
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
493 CYG_HTTPD_FVAR_TABLE_ENTRY(hal_form_entry_bar, "bar", var_bar, HTML_VAR_LEN);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
494 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
495
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
496 <para>and after the GET or POST submissions, the list will contain the value
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
497 for "foo" and "bar" (if they were found in the form data.) It is the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
498 responsability of the user to make sure that the buffer is large enough
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
499 to hold all the data parsed (including the string terminator). The parser will
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
500 write only up to the length of the buffer minus one (the last being the
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
501 terminator) and discard any additional data.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
502
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
503 <para>The values parsed are likely going to be used in c language callback, or
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
504 in CGI files. In a c language callback the user can directly access the pointers
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
505 of individual variables for further processing, keeping in mind that the parsing
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
506 always result in a string of characters to be produced, and any conversion
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
507 (e.g. from strings to integer) must be performed within the callback. In
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
508 a TCL script the user can just access a variable by its name. For example,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
509 in the case of the variables 'foo' and 'bar' shown above, it is possible
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
510 to do something like 'write_chunked "You wrote $foo". The data that was sent in
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
511 the body of a POST request is accessible in through a variable called
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
512 'post_data'. In CGI functions
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
513 implemented using the objloader the pointers to the
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
514 variables cannot be accessed directly, since the library will likely not
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
515 know their location in memory. The proper way to access them is by using the
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
516 cyg_httpd_find_form_variable() function from within the library:</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
517
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
518 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
519 char* cyg_httpd_find_form_variable(char* name)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
520
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
521 name : name of the form variable to look up
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
522
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
523 returns a pointer to the buffer, or 0 if the variable was not found.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
524 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
525
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
526 <para>When using the OBJLOADER package within the web server, an entry
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
527 for the cyg_httpd_find_form_variable() function is automatically added to the
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
528 externals table the OBJLOADER for relocation. See the OBLOADER paragraph of
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
529 the ATHTTP user's guide for the full list of the exported functions.</para>
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
530
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
531 <para>In order to avoid stale data, all the buffers in the table are cleared
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
532 before running the parser and thus any variable in the list that was not
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
533 assigned a new value dureing the request will be an empty string.</para>
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
534 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
535
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
536 <sect1 id="athttpd-ires">
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
537 <title>Internal Resources</title>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
538
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
539 <para>When the server does not use a file system the user must be responsible
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
540 to provide a C language callback function for each URL that will be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
541 requested by the client. This means locating the data and sending it out
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
542 using either <command>cyg_httpd_write()</command> or
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
543 <command>cyg_httpd_write_chunked()</command>.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
544
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
545 <para>In order to simplify this process the server allows registering
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2253
diff changeset
546 any number of URLs as internal resources, by providing the URL name, the
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
547 pointer to the resource data and its size. When a URL is requested the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
548 server will look it up among all internal resources, and if found, it
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
549 will send out the resource.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
550
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
551 <para>Internal resource can also be used along with a file system. In this
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
552 case the file system is searched first, and if a file is found, it it
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
553 sent. If a file is not found, the internal resources are searched and
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
554 if a match if found it is sent.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
555
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
556 <para>The drawback of this approach is, of course, that all these
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
557 resources are going to add to the size of the operating system image, and thus
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
558 it should be used only when memory is not a major constraint of the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
559 design.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
560
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
561 <para>As always, to provide this type of customization, ecos tables are used.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
562 The format for adding a new resource to the internal table is the following:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
563 </para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
564
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
565 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
566 CYG_HTTPD_IRES_TABLE_ENTRY(entry, name, buffp, len)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
567
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
568 entry : an identifier unique to this entry.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
569 name : name of the URL including leading '/'
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
570 buffp : a pointer to a buffer of characters where to store the value
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
571 of the form variable.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
572 len : size of the array
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
573 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
574
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
575 <para>As an example, if the user wants to provide his own web page by
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
576 hardcoding it in the application code, here is how he would do it:</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
577
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
578 <programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
579 #define MY_OWN_HOME_PAGE "eCos RTOS"
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
580 CYG_HTTPD_IRES_TABLE_ENTRY(cyg_httpd_ires_home, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
581 "/index.html", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
582 MY_OWN_HOME_PAGE, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
583 9);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
584 </programlisting>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
585
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
586 <para>The extension of the file name determines the MIME type to be used for
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
587 internal resources.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
588
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
589 <para>When using directory listing you are implicitly making use of internal
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
590 resources. The small icons that appear to the left of file names and
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
591 directories are internal resources. Unchecking CYGOPT_NET_HTTP_USE_DIRLIST
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
592 will prevent the addition of these files.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
593
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
594 <para>In order to use internal resources, a generic file must first be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
595 turned into a c language array, which is then compiled in the application
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
596 code. To create this array you can use the tcl script that comes with the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
597 ecos distribution at packages/fs/rom/current/support/file2.tcl.</para>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
598 </sect1>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
599 </chapter>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
600 </part>