annotate packages/net/athttpd/current/src/cgi.c @ 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 0e9d1d1df4a0
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 * cgi.c
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
4 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
5 * Handles the CGI requests via OBJLOADER or tcl
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 * ####ECOSGPLCOPYRIGHTBEGIN####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
9 * -------------------------------------------
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
10 * This file is part of eCos, the Embedded Configurable Operating
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
11 * System.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
12 * Copyright (C) 2005 eCosCentric Ltd.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
13 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
14 * eCos is free software; you can redistribute it and/or modify it
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
15 * under the terms of the GNU General Public License as published by
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
16 * the Free Software Foundation; either version 2 or (at your option)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
17 * any later version.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
18 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
19 * eCos is distributed in the hope that it will be useful, but
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
20 * WITHOUT ANY WARRANTY; without even the implied warranty of
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
22 * General Public License for more details.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
23 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
24 * You should have received a copy of the GNU General Public License
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
25 * along with eCos; if not, write to the Free Software Foundation,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
26 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
27 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
28 * As a special exception, if other files instantiate templates or
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
29 * use macros or inline functions from this file, or you compile this
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
30 * file and link it with other works to produce a work based on this
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
31 * file, this file does not by itself cause the resulting work to be
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
32 * covered by the GNU General Public License. However the source code
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
33 * for this file must still be made available in accordance with
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
34 * section (3) of the GNU General Public License.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
35 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
36 * This exception does not invalidate any other reasons why a work
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
37 * based on this file might be covered by the GNU General Public
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
38 * License.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
39 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
40 * -------------------------------------------
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
41 * ####ECOSGPLCOPYRIGHTEND####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
42 * =================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
43 * #####DESCRIPTIONBEGIN####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
44 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
45 * Author(s): Anthony Tonizzo (atonizzo@gmail.com)
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
46 * Contributors: Sergei Gavrikov (w3sg@SoftHome.net)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
47 * Date: 2006-06-12
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
48 * Purpose:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
49 * Description:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
50 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
51 * ####DESCRIPTIONEND####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
52 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
53 * =================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
54 */
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
55 #include <pkgconf/hal.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
56 #include <pkgconf/kernel.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
57 #include <cyg/hal/hal_tables.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
58 #include <cyg/fileio/fileio.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
59 #include <dirent.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
60 #include <network.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
61
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
62 #include <string.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
63 #include <stdio.h> // sprintf().
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
64
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
65 #define JIM_EMBEDDED
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
66 #include <cyg/athttpd/http.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
67 #include <cyg/athttpd/socket.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
68 #include <cyg/athttpd/handler.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
69 #include <cyg/athttpd/forms.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
70
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
71 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
72 #include <cyg/objloader/elf.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
73 #include <cyg/objloader/objelf.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
74 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
75
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
76 // =============================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
77 // Objloader CGI Support
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
78 // =============================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
79 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
80 CYG_LDR_TABLE_STDIO()
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
81 CYG_LDR_TABLE_STRING()
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
82
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
83 // Chunked transfers.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
84 CYG_LDR_TABLE_ENTRY(cyg_httpd_start_chunked_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
85 "cyg_httpd_start_chunked", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
86 cyg_httpd_start_chunked);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
87 CYG_LDR_TABLE_ENTRY(cyg_httpd_write_chunked_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
88 "cyg_httpd_write_chunked", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
89 cyg_httpd_write_chunked);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
90 CYG_LDR_TABLE_ENTRY(cyg_httpd_end_chunked_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
91 "cyg_httpd_end_chunked", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
92 cyg_httpd_end_chunked);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
93
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
94 // Mime strings.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
95 CYG_LDR_TABLE_ENTRY(cyg_httpd_write_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
96 "cyg_httpd_write", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
97 cyg_httpd_write);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
98
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
99 // Entry to find a GET/POST variable in the table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
100 CYG_LDR_TABLE_ENTRY(cyg_httpd_find_form_variable_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
101 "cyg_httpd_find_form_variable", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
102 cyg_httpd_find_form_variable);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
103
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
104 // Finds an internal resource given the URL. Returns a pointer to the entry
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
105 // in the resource table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
106 CYG_LDR_TABLE_ENTRY(cyg_httpd_find_ires_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
107 "cyg_httpd_find_ires", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
108 cyg_httpd_find_ires);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
109 // Sends an internal resource out, given the entry in the reource table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
110 CYG_LDR_TABLE_ENTRY(cyg_httpd_send_ires_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
111 "cyg_httpd_send_ires", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
112 cyg_httpd_send_ires);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
113
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
114 CYG_LDR_TABLE_ENTRY(cyg_httpd_format_header_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
115 "cyg_httpd_format_header", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
116 cyg_httpd_format_header);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
117 CYG_LDR_TABLE_ENTRY(diag_printf_entry, "diag_printf", diag_printf);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
118 CYG_LDR_TABLE_ENTRY(cyg_httpd_find_mime_string_entry, \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
119 "cyg_httpd_find_mime_string", \
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
120 cyg_httpd_find_mime_string);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
121 #endif // CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
122
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
123 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
124 cyg_int32 cyg_httpd_exec_cgi_objloader(char *file_name)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
125 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
126 // Check if the file is in the file system.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
127 struct stat sp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
128 cyg_int32 (*fn)(CYG_HTTPD_STATE*);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
129
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
130 cyg_int32 rc = stat(file_name, &sp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
131 if(rc < 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
132 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
133 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_FOUND);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
134 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
135 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
136
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
137 void *lib_handle = cyg_ldr_open_library((CYG_ADDRWORD)file_name, 0);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
138 CYG_ASSERT(lib_handle != 0, "Error opening the library");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
139 if (lib_handle == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
140 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
141 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
142 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
143 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
144 fn = cyg_ldr_find_symbol(lib_handle, "exec_cgi");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
145 if (fn)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
146 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
147 cyg_int32 rc = fn(&httpstate);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
148 cyg_ldr_close_library(lib_handle);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
149 return rc;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
150 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
151 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
152 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
153 cyg_ldr_close_library(lib_handle);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
154 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
155 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
156 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
157 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
158 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
159
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
160 // =============================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
161 // tcl CGI Support
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
162 // =============================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
163 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_TCL
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
164 int Jim_AioInit(Jim_Interp *);
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
165 cyg_int32
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
166 cyg_httpd_exec_cgi_tcl(char *file_name)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
167 {
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
168 char tcl_cmd[CYG_HTTPD_MAXPATH];
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
169 sprintf(tcl_cmd, "source %s", file_name);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
170
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
171 // Make sure that tcl sees the internal variables including the post_data.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
172 cyg_httpd_fvars_table_entry *entry = cyg_httpd_fvars_table;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
173 while (entry != cyg_httpd_fvars_table_end)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
174 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
175 if (strlen(entry->buf) != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
176 Jim_SetVariableStrWithStr(httpstate.jim_interp,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
177 entry->name,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
178 entry->buf);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
179 entry++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
180 }
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
181
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
182 if (httpstate.post_data != NULL)
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
183 Jim_SetVariableStrWithStr(httpstate.jim_interp,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
184 "post_data",
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
185 httpstate.post_data);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
186
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
187 Jim_Eval(httpstate.jim_interp, tcl_cmd);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
188 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
189 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
190
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
191 int
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
192 cyg_httpd_Jim_Command_startchunked(Jim_Interp *interp,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
193 int argc,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
194 Jim_Obj *const *argv)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
195 {
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
196 char *buf = (char*)Jim_GetString(argv[1], NULL);
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
197 cyg_httpd_start_chunked(buf);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
198 return JIM_OK;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
199 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
200
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
201 int
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
202 cyg_httpd_Jim_Command_writechunked(Jim_Interp *interp,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
203 int argc,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
204 Jim_Obj *const *argv)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
205 {
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
206 int len;
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
207 char *buf = (char*)Jim_GetString(argv[1], &len);
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
208 cyg_httpd_write_chunked(buf, len);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
209 return JIM_OK;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
210 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
211
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
212 int
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
213 cyg_httpd_Jim_Command_endchunked(Jim_Interp *interp,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
214 int argc,
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
215 Jim_Obj *const *argv)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
216 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
217 cyg_httpd_end_chunked();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
218 return JIM_OK;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
219 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
220
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
221 void
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
222 cyg_httpd_init_tcl_interpreter(void)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
223 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
224 // Start the TCL interpreter.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
225 Jim_InitEmbedded();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
226 httpstate.jim_interp = Jim_CreateInterp();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
227 Jim_RegisterCoreCommands(httpstate.jim_interp);
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
228 Jim_AioInit(httpstate.jim_interp);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
229
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
230 // Add a new cyg_httpd_write_chunked command for tcl.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
231 Jim_CreateCommand(httpstate.jim_interp,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
232 "start_chunked",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
233 cyg_httpd_Jim_Command_startchunked,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
234 NULL,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
235 NULL);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
236 Jim_CreateCommand(httpstate.jim_interp,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
237 "write_chunked",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
238 cyg_httpd_Jim_Command_writechunked,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
239 NULL,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
240 NULL);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
241 Jim_CreateCommand(httpstate.jim_interp,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
242 "end_chunked",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
243 cyg_httpd_Jim_Command_endchunked,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
244 NULL,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
245 NULL);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
246 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
247 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
248
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
249 // =============================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
250 // CGI Support
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
251 // =============================================================================
2326
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
252 #if defined(CYGOPT_NET_ATHTTPD_USE_CGIBIN_TCL ) || \
bd648d8929f6 * cdl/httpd.cdl: Improve CDL dependencies.
jlarmour
parents: 2265
diff changeset
253 defined(CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
254 cyg_int32
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
255 cyg_httpd_exec_cgi(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
256 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
257 char file_name[CYG_HTTPD_MAXPATH];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
258
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
259 strcpy(file_name, CYGDAT_NET_ATHTTPD_SERVEROPT_ROOTDIR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
260 if (file_name[strlen(file_name)-1] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
261 strcat(file_name, "/");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
262 strcat(file_name, httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
263 cyg_httpd_cleanup_filename(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
264
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
265 char *extension = rindex(httpstate.url, '.');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
266 if (extension == NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
267 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
268 // File in CGI request _must_ have an extension.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
269 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
270 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
271 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
272
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
273 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
274 if ( strcmp(extension, CYG_HTTPD_DEFAULT_CGIBIN_OBJLOADER_EXTENSION) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
275 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
276 // Load a cgibin via OBJLOADER.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
277 cyg_int32 rc = cyg_httpd_exec_cgi_objloader(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
278 return rc;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
279 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
280 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
281 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_TCL
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
282 if ( strcmp(extension, CYG_HTTPD_DEFAULT_CGIBIN_TCL_EXTENSION) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
283 {
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
284 // Load a cgibin via the TCL interpreter.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
285 cyg_int32 rc = cyg_httpd_exec_cgi_tcl(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
286 return rc;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
287 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
288 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
289 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
290 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
291 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
292 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
293