annotate packages/net/athttpd/current/src/http.c @ 2265:b5670f3c40f2

* cdl/httpd.cdl: * doc/athttpd.sgml: Corrected some typos and rectified some omissions. * include/jim.h: Added an inline to Jim_InitExtension() * src/cgi.c: used malloc() instead of cyg_ldr_malloc(); * src/forms.c: Added a #define to be able tio use the TCL scripting without OBJLOADER * src/http.c: * src/socket.c: Lots of typos stamped out, and some better comments too.
author jlarmour
date Thu, 10 Aug 2006 17:37:48 +0000
parents 0830ae6acddc
children bd648d8929f6
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 * http.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 client requests.
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
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
56 #include <pkgconf/hal.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
57 #include <pkgconf/kernel.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
58 #include <cyg/kernel/kapi.h> // Kernel API.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
59 #include <cyg/infra/diag.h> // For diagnostic printing.
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 #include <time.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
62
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
63 #include <cyg/hal/hal_tables.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
64 #include <cyg/fileio/fileio.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
65 #include <stdio.h> // sprintf().
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
66 #include <stdlib.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
67
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
68 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
69 #include <cyg/objloader/elf.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
70 #include <cyg/objloader/objelf.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
71 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
72
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
73 #include <cyg/athttpd/http.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
74 #include <cyg/athttpd/socket.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
75 #include <cyg/athttpd/handler.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
76 #include <cyg/athttpd/forms.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
77
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
78 cyg_int32 debug_print = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
79
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
80 const char *day_of_week[7] = { "Sun", "Mon", "Tue", "Wed",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
81 "Thu", "Fri", "Sat" };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
82 const char *month_of_year[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
83 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
84 const char *home_pages[] = { "index.html", "index.htm",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
85 "default.html", "home.html" };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
86 CYG_HAL_TABLE_BEGIN(cyg_httpd_mime_table, httpd_mime_table);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
87 CYG_HAL_TABLE_END(cyg_httpd_mime_table_end, httpd_mime_table);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
88
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
89 __externC cyg_httpd_mime_table_entry cyg_httpd_mime_table[];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
90 __externC cyg_httpd_mime_table_entry cyg_httpd_mime_table_end[];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
91
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
92 // Standard handlers added by default. Correspond to the most used extensions.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
93 // The user can add his/her own later.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
94 CYG_HTTPD_MIME_TABLE_ENTRY(hal_htm_entry, "htm",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
95 "text/html; charset=iso-8859-1");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
96 CYG_HTTPD_MIME_TABLE_ENTRY(hal_html_entry, "html",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
97 "text/html; charset=iso-8859-1");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
98 CYG_HTTPD_MIME_TABLE_ENTRY(hal_gif_entry, "gif", "image/gif");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
99 CYG_HTTPD_MIME_TABLE_ENTRY(hal_jpg_entry, "jpg", "image/jpg");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
100 CYG_HTTPD_MIME_TABLE_ENTRY(hal_css_entry, "css", "text/css");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
101 CYG_HTTPD_MIME_TABLE_ENTRY(hal_js_entry, "js", "application/x-javascript");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
102
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
103 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
104 cyg_httpd_format_time_string(char *ptr, time_t *t)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
105 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
106 struct tm *gmt_time = gmtime(t);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
107 if (gmt_time != NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
108 sprintf(ptr,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
109 "%s, %02d %s %d %02d:%02d:%02d GMT",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
110 day_of_week[gmt_time->tm_wday],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
111 gmt_time->tm_mday,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
112 month_of_year[gmt_time->tm_mon],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
113 1900 + gmt_time->tm_year,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
114 gmt_time->tm_hour,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
115 gmt_time->tm_min,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
116 gmt_time->tm_sec);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
117 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
118 // If anything fails, then we'll just create a bogus date.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
119 sprintf(ptr, "Thu, 01 Jan 1970 00:00:01 GMT");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
120 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
121
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
122 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
123 cyg_httpd_send_error(cyg_int32 err_type)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
124 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
125 httpstate.status_code = err_type;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
126
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
127 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
128 diag_printf("Sending error: %d\n", err_type);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
129 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
130
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
131 #ifdef CYGOPT_NET_ATHTTPD_USE_FS
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
132 // Check if the user has defines his own error pages.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
133 struct stat sp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
134 char file_name[CYG_HTTPD_MAXPATH];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
135 strcpy(file_name, CYGDAT_NET_ATHTTPD_SERVEROPT_ROOTDIR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
136 if (file_name[strlen(file_name)-1] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
137 strcat(file_name, "/");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
138 strcat(file_name, CYGDAT_NET_ATHTTPD_SERVEROPT_ERRORDIR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
139 if (file_name[strlen(file_name)-1] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
140 strcat(file_name, "/");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
141 sprintf(file_name + strlen(file_name), "error_%d.html", err_type);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
142 cyg_httpd_cleanup_filename(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
143 cyg_int32 rc = stat(file_name, &sp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
144 if (rc == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
145 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
146 char *extension = rindex(file_name, '.');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
147 if (extension == NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
148 // No extension in the file name.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
149 httpstate.mime_type = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
150 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
151 httpstate.mime_type = cyg_httpd_find_mime_string(++extension);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
152
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
153 httpstate.payload_len = sp.st_size;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
154 cyg_int32 header_length = cyg_httpd_format_header();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
155 cyg_httpd_write(httpstate.outbuffer, header_length);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
156
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
157 // File found.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
158 FILE *fp = fopen(file_name, "r");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
159 if(fp == NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
160 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
161
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
162 ssize_t payload_size = fread(httpstate.outbuffer,
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
163 1,
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
164 CYG_HTTPD_MAXOUTBUFFER,
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
165 fp);
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
166 while (payload_size > 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
167 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
168 ssize_t bytes_written = cyg_httpd_write_chunked(httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
169 payload_size);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
170 if (bytes_written != payload_size)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
171 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
172
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
173 payload_size = fread(httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
174 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
175 CYG_HTTPD_MAXOUTBUFFER,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
176 fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
177 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
178
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
179 fclose(fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
180 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
181 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
182 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
183
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
184 // If no file has been defined, send a simple notification. We use inbuffer
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
185 // for temporary storage of the error messages, so that we know the length
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
186 // of the frame prior to building the header, thus avoiding the use of
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
187 // chunked frames.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
188 strcpy(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
189 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
190 switch (err_type)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
191 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
192 case CYG_HTTPD_STATUS_MOVED_PERMANENTLY:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
193 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
194 "<html><head><title>301 Moved Permanently</title></head>\r\n"
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
195 "<body><h1>Moved Permanently</h1>\r\n"
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
196 "<p>The documenthas moved <a href=\"" );
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
197 strcat(httpstate.inbuffer, httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
198 strcat(httpstate.inbuffer, "\">here</a>.\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
199 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
200 case CYG_HTTPD_STATUS_NOT_AUTHORIZED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
201 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
202 "<html><head><title>401 Not Authorized</title></head>\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
203 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
204 "<p>Authorization required to access this URL.</p>");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
205 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
206 case CYG_HTTPD_STATUS_NOT_MODIFIED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
207 httpstate.mode |= CYG_HTTPD_SEND_HEADER_ONLY;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
208 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
209 case CYG_HTTPD_STATUS_NOT_FOUND:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
210 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
211 "<html><head><title>404 Not Found</title></head>\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
212 sprintf(httpstate.inbuffer + strlen(httpstate.inbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
213 "<p>The requested URL: %s was not found on"
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
214 " this server</p>",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
215 httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
216 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
217 case CYG_HTTPD_STATUS_SYSTEM_ERROR:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
218 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
219 "<html><head><title>500 Server Error</title></head>\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
220 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
221 "<p>The server encountered an unexpected condition that "
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
222 "prevented it from fulfilling the request by the client</p>");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
223 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
224 case CYG_HTTPD_STATUS_NOT_IMPLEMENTED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
225 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
226 "<html><head><title>501 Not Implemented</title></head>\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
227 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
228 "<p>The method requested is not implemented</p>");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
229 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
230 default:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
231 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
232 "<html><head><title>400 Bad Request</title></head>\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
233 strcat(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
234 "<p>Bad request</p>");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
235 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
236 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
237
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
238 sprintf(httpstate.inbuffer + strlen(httpstate.inbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
239 "</p><hr><address>%s at %d.%d.%d.%d Port %d</address>\r\n"
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
240 "</body></html>\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
241 CYGDAT_NET_ATHTTPD_SERVEROPT_SERVERID,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
242 httpstate.host[0],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
243 httpstate.host[1],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
244 httpstate.host[2],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
245 httpstate.host[3],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
246 CYGNUM_NET_ATHTTPD_SERVEROPT_PORT);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
247
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
248 httpstate.last_modified = -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
249 httpstate.mime_type = cyg_httpd_find_mime_string("html");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
250 httpstate.mode |= CYG_HTTPD_MODE_CLOSE_CONN;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
251 httpstate.payload_len = strlen(httpstate.inbuffer);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
252 cyg_int32 header_length = cyg_httpd_format_header();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
253 cyg_httpd_write(httpstate.outbuffer, header_length);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
254 if (httpstate.mode & CYG_HTTPD_SEND_HEADER_ONLY)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
255 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
256 cyg_httpd_write(httpstate.inbuffer, strlen(httpstate.inbuffer));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
257 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
258
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
259 time_t
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
260 cyg_httpd_parse_date(char *time)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
261 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
262 int i;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
263 char month[4];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
264 struct tm tm_mod;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
265
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
266 // We are going to get rid of the day of the week. This is always the first
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
267 // part of the string, separated by a blank.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
268 time = strchr( time, ' ' );
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
269 if ( time == NULL )
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 time++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
272
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
273 /// RFC1123. The date is in the format: Sun, 06 Nov 1994 08:49:37 GMT.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
274 cyg_int32 rc = sscanf(time,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
275 "%2d %3s %4d %2d:%2d:%2d GMT",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
276 &tm_mod.tm_mday,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
277 month,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
278 &tm_mod.tm_year,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
279 &tm_mod.tm_hour,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
280 &tm_mod.tm_min,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
281 &tm_mod.tm_sec);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
282 if (rc != 6)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
283 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
284 // RFC1036. The date is in the format: Sunday, 06-Nov-94 08:49:37 GMT.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
285 rc = sscanf(time,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
286 "%2d-%3s-%2d %2d:%2d:%2d GMT",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
287 &tm_mod.tm_mday,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
288 month,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
289 &tm_mod.tm_year,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
290 &tm_mod.tm_hour,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
291 &tm_mod.tm_min,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
292 &tm_mod.tm_sec);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
293 if (rc != 6)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
294 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
295 // asctime() in the stdlibc library.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
296 // The date is in the format: Sun Nov 6 08:49:37 1994.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
297 rc = sscanf(time,"%3s %2d %2d:%2d:%2d %4d",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
298 month,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
299 &tm_mod.tm_mday,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
300 &tm_mod.tm_hour,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
301 &tm_mod.tm_min,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
302 &tm_mod.tm_sec,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
303 &tm_mod.tm_year);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
304 if (rc != 6)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
305 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
306 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
307 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
308
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
309 for (i = 0; i < sizeof(month_of_year); i++)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
310 if (strcmp(month, month_of_year[i]) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
311 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
312 tm_mod.tm_mon = i;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
313 if (tm_mod.tm_year > 1900)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
314 tm_mod.tm_year -= 1900;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
315 return mktime(&tm_mod);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
316 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
317
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
318 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
319 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
320
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
321 // Finds the mime string into the mime_table associated with a specific
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
322 // extension. Returns the MIME type to send in the header, or NULL if the
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
323 // extension is not in the table.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
324 char*
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
325 cyg_httpd_find_mime_string(char *ext)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
326 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
327 cyg_httpd_mime_table_entry *entry = cyg_httpd_mime_table;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
328
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
329 while (entry != cyg_httpd_mime_table_end)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
330 {
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
331 if (!strcmp((const char*)ext, entry->extension ))
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
332 return entry->mime_string;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
333 entry++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
334 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
335
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
336 return (char*)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
337 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
338
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
339 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
340 cyg_httpd_cleanup_filename(char *filename)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
341 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
342 char *src = filename;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
343
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
344 src = strstr(filename, "//");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
345 while (src != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
346 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
347 strcpy(src + 1, src + 2);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
348 src = strstr(filename, "//");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
349 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
350
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
351 src = strstr(filename, "/./");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
352 while (src != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
353 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
354 strcpy(src + 1, src + 3);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
355 src = strstr(filename, "/./");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
356 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
357
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
358 src = strstr(filename, "/../");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
359 while (src != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
360 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
361 char *comp1 = filename, *comp2 = filename;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
362
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
363 // Search the path component before this redirection.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
364 while ((comp1 = strchr(comp1, '/')) != src)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
365 comp2 = ++comp1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
366
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
367 strcpy(comp2, src + 4);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
368 src = strstr(filename, "/../");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
369 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
370 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
371
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
372 cyg_int32
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
373 cyg_httpd_initialize(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
374 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
375 httpstate.needs_auth = (cyg_httpd_auth_table_entry *)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
376 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
377 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
378
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
379 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
380 cyg_httpd_append_homepage(char *root)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
381 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
382 #ifdef CYGOPT_NET_ATHTTPD_USE_FS
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
383 struct stat sp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
384 cyg_int32 i;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
385
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
386 cyg_int32 root_len = strlen(root);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
387 for (i = 0; i < sizeof(home_pages)/sizeof(char*); i++)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
388 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
389 root[root_len] = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
390 sprintf(root + root_len, "%s", home_pages[i]);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
391 cyg_int32 rc = stat(root, &sp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
392 if (rc == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
393 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
394 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
395 root[root_len] = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
396 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
397
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
398 #ifdef CYGDAT_NET_ATHTTPD_ALTERNATE_HOME
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
399 if (strcmp(root, "/") == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
400 // The client is trying to open the main index file.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
401 strcat(root, CYGDAT_NET_ATHTTPD_ALTERNATE_HOME);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
402 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
403 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
404
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
405 #ifdef CYGOPT_NET_ATHTTPD_USE_FS
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
406 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
407 cyg_httpd_send_file(char *name)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
408 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
409 cyg_int32 err;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
410 FILE *fp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
411 struct stat sp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
412 char file_name[CYG_HTTPD_MAXPATH];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
413
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
414 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
415 diag_printf("Sending file: %s\n", name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
416 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
417 #ifdef CYGOPT_NET_ATHTTPD_USE_AUTH
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
418 // Let's check that the requested URL is not inside some directory that
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
419 // needs authentication.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
420 cyg_httpd_auth_table_entry* auth = cyg_httpd_is_authenticated(name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
421 if (auth != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
422 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
423 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_AUTHORIZED);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
424 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
425 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
426 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
427
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
428 strcpy(file_name, CYGDAT_NET_ATHTTPD_SERVEROPT_ROOTDIR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
429 if (file_name[strlen(file_name)-1] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
430 strcat(file_name, "/");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
431 strcat(file_name, name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
432 cyg_httpd_cleanup_filename(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
433
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
434 // Check if the file is in the file system. This will also give us the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
435 // size of the file, to be used in the HTTP header.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
436 cyg_int32 rc = stat(file_name, &sp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
437 if (rc < 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
438 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
439 // Before giving up, we make a last ditch attempt at finding a file
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
440 // within the internal resources of the server. The user can add
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
441 // his/her own files to the table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
442 cyg_httpd_ires_table_entry *p = cyg_httpd_find_ires(name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
443 if (p != NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
444 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
445 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
446 diag_printf("Sending Internal Resource: %s\n", name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
447 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
448 cyg_httpd_send_ires(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
449 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
450 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
451 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_FOUND);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
452 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
453 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
454
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
455 if (S_ISDIR(sp.st_mode))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
456 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
457 char tmp_url[CYG_HTTPD_MAXURL];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
458 strcpy(tmp_url, httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
459 // Directories need a trialing slash, and if missing, we'll redirect
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
460 // the client to the right URL. This is called (appropriately
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
461 // enough) "Trailing-Slash Redirection".
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
462 if (name[strlen(name)-1] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
463 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
464 if (CYGNUM_NET_ATHTTPD_SERVEROPT_PORT == 80)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
465 sprintf(httpstate.url,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
466 "http://%d.%d.%d.%d%s/",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
467 httpstate.host[0],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
468 httpstate.host[1],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
469 httpstate.host[2],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
470 httpstate.host[3],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
471 tmp_url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
472 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
473 sprintf(httpstate.url,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
474 "http://%d.%d.%d.%d:%d%s/",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
475 httpstate.host[0],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
476 httpstate.host[1],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
477 httpstate.host[2],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
478 httpstate.host[3],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
479 CYGNUM_NET_ATHTTPD_SERVEROPT_PORT,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
480 tmp_url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
481 cyg_httpd_send_error(CYG_HTTPD_STATUS_MOVED_PERMANENTLY);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
482 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
483 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
484
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
485 // We are going to try to locate an index page in the directory we got
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
486 // in the URL.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
487 cyg_httpd_append_homepage(file_name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
488 if (file_name[strlen(file_name)-1] == '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
489 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
490 #ifdef CYGOPT_NET_ATHTTPD_USE_DIRLIST
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
491 // No home page found, we are sending a directory listing.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
492 cyg_httpd_send_directory_listing(name);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
493 #else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
494 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_FOUND);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
495 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
496 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
497 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
498 stat(file_name, &sp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
499 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
500
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
501 httpstate.last_modified = sp.st_mtime;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
502
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
503 // Let's see if we luck out and can send a 304.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
504 if ((httpstate.modified_since != -1) &&
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
505 (httpstate.modified_since >= sp.st_mtime))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
506 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
507 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_MODIFIED);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
508 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
509 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
510 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
511 httpstate.status_code = CYG_HTTPD_STATUS_OK;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
512
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
513 // Here we'll look for extension to the file. Consider the case where
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
514 // there might be more than one dot in the file name. We'll look for
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
515 // the last dot, then we'll check the extension.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
516 char *extension = rindex(file_name, '.');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
517 if (extension == NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
518 httpstate.mime_type = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
519 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
520 httpstate.mime_type = cyg_httpd_find_mime_string(++extension);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
521
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
522 httpstate.payload_len = sp.st_size;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
523 cyg_int32 payload_size = cyg_httpd_format_header();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
524 if ((httpstate.mode & CYG_HTTPD_SEND_HEADER_ONLY) != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
525 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
526 send(httpstate.sockets[httpstate.client_index].descriptor,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
527 httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
528 payload_size,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
529 0);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
530 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
531 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
532
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
533 fp = fopen(file_name, "r");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
534 if(fp == NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
535 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
536 // We should really read errno and send messages accordingly...
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
537 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
538 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
539 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
540
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
541 // Fill up the rest of the buffer and send it out.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
542 cyg_int32 bread = fread(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
543 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
544 CYG_HTTPD_MAXOUTBUFFER - payload_size,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
545 fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
546 cyg_httpd_write(httpstate.outbuffer, payload_size + bread);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
547
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
548 cyg_iovec bufs[2] = { { httpstate.outbuffer, 0 },
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
549 { httpstate.inbuffer, 0 } };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
550 ssize_t bytes_written = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
551 sp.st_size -= bread;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
552 while (bytes_written < sp.st_size)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
553 if (sp.st_size - bytes_written <= CYG_HTTPD_MAXOUTBUFFER)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
554 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
555 bufs[0].iov_len = fread(httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
556 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
557 CYG_HTTPD_MAXOUTBUFFER,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
558 fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
559 bytes_written += cyg_httpd_write(httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
560 bufs[0].iov_len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
561 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
562 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
563 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
564 bufs[0].iov_len = fread(httpstate.outbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
565 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
566 CYG_HTTPD_MAXOUTBUFFER,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
567 fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
568 bufs[1].iov_len = fread(httpstate.inbuffer,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
569 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
570 CYG_HTTPD_MAXINBUFFER,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
571 fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
572 bytes_written += cyg_httpd_writev(bufs, 2);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
573 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
574
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
575 err = fclose(fp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
576 if(err < 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
577 cyg_httpd_send_error(CYG_HTTPD_STATUS_SYSTEM_ERROR);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
578 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
579 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
580
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
581 cyg_int32
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
582 cyg_httpd_format_header(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
583 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
584 char date[CYG_HTTPD_TIME_STRING_LEN];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
585 sprintf(httpstate.outbuffer, "HTTP/1.1 %d", httpstate.status_code);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
586 time_t time_val = time(NULL);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
587
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
588 // Error messages (i.e. with status other than OK, automatically add
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
589 // the no-cache header.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
590 switch (httpstate.status_code)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
591 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
592 case CYG_HTTPD_STATUS_MOVED_PERMANENTLY:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
593 strcat(httpstate.outbuffer, " Moved Permanently\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
594 strcat(httpstate.outbuffer, "Location: ");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
595 strcat(httpstate.outbuffer, httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
596 strcat(httpstate.outbuffer, "\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
597 strcat(httpstate.outbuffer, "Cache-Control: no-cache\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
598 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
599 "Content-Length: %d\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
600 httpstate.payload_len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
601 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
602 #ifdef CYGOPT_NET_ATHTTPD_USE_AUTH
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
603 case CYG_HTTPD_STATUS_NOT_AUTHORIZED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
604 // A 401 error closes the connection right away.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
605 httpstate.mode |= CYG_HTTPD_MODE_CLOSE_CONN;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
606 strcat(httpstate.outbuffer, " Not Authorized\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
607
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
608 // Here we should set the proper header based on the authentication
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
609 // required (httpstate.needs_authMode) but for now, with only
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
610 // Basic Authentication supported, there is no need to do so.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
611 if (httpstate.needs_auth->auth_mode == CYG_HTTPD_AUTH_BASIC)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
612 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
613 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
614 "WWW-Authenticate: Basic realm=\"%s\"\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
615 httpstate.needs_auth->auth_domainname);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
616 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
617 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
618 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
619 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
620 "WWW-Authenticate: Digest realm=\"%s\" ",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
621 httpstate.needs_auth->auth_domainname);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
622 cyg_httpd_format_time_string(cyg_httpd_md5_nonce, &time_val);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
623 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
624 "nonce=\"%s\" ", cyg_httpd_md5_nonce);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
625 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
626 "opaque=\"%s\", ",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
627 CYG_HTTPD_MD5_AUTH_OPAQUE);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
628 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
629 "stale=false, algorithm=%s, qop=\"%s\"\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
630 CYG_HTTPD_MD5_AUTH_NAME,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
631 CYG_HTTPD_MD5_AUTH_QOP );
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
632 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
633 strcat(httpstate.outbuffer, "Cache-Control: no-cache\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
634 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
635 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
636 case CYG_HTTPD_STATUS_NOT_MODIFIED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
637 strcat(httpstate.outbuffer, " Not Modified\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
638 strcat(httpstate.outbuffer, "Cache-Control: no-cache\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
639 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
640 case CYG_HTTPD_STATUS_NOT_FOUND:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
641 strcat(httpstate.outbuffer, " Not Found\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
642 strcat(httpstate.outbuffer, "Cache-Control: no-cache\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
643 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
644 "Content-Length: %d\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
645 httpstate.payload_len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
646 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
647 case CYG_HTTPD_STATUS_METHOD_NOT_ALLOWED:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
648 strcat(httpstate.outbuffer, " Method Not Allowed\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
649 strcat(httpstate.outbuffer, "Cache-Control: no-cache\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
650 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
651 default:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
652 strcat(httpstate.outbuffer, " OK\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
653 if ((httpstate.mode & CYG_HTTPD_MODE_TRANSFER_CHUNKED) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
654 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
655 "Content-Length: %d\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
656 httpstate.payload_len);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
657 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
658 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
659
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
660 cyg_httpd_format_time_string(date, &time_val);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
661 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
662 "Date: %s\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
663 date);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
664 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
665 "Server: %s\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
666 CYGDAT_NET_ATHTTPD_SERVEROPT_SERVERID);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
667
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
668 if (httpstate.mode & CYG_HTTPD_MODE_CLOSE_CONN)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
669 strcat(httpstate.outbuffer, "Connection: close\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
670 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
671 strcat(httpstate.outbuffer, "Connection: keep-alive\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
672
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
673 if (httpstate.mime_type != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
674 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
675 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
676 "Content-Type: %s\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
677 httpstate.mime_type);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
678 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
679 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
680 // When we cannot find the appropriate MIME type, we'll send a
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
681 // default type.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
682 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
683 "Content-Type: %s\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
684 CYGDAT_NET_ATHTTPD_DEFAULT_MIME_TYPE);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
685
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
686 if (httpstate.mode & CYG_HTTPD_MODE_TRANSFER_CHUNKED)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
687 strcat(httpstate.outbuffer, "Transfer-Encoding: chunked\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
688
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
689 if (httpstate.last_modified != -1)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
690 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
691 time_val = httpstate.last_modified;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
692 cyg_httpd_format_time_string(httpstate.inbuffer, &time_val);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
693 sprintf(httpstate.outbuffer + strlen(httpstate.outbuffer),
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
694 "Last-Modified: %s\r\n",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
695 httpstate.inbuffer);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
696 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
697
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
698 // There must be 2 carriage returns between the header and the body,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
699 // so if you modify this function make sure that there is another
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
700 // CRLF already terminating the buffer thus far.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
701 strcat(httpstate.outbuffer, "\r\n");
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
702 return strlen(httpstate.outbuffer);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
703 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
704
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
705 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
706 cyg_httpd_handle_method_GET(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
707 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
708 // Handlers are executed first.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
709 handler h = cyg_httpd_find_handler();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
710 if (h != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
711 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
712 // A handler was found. We'll call the function associated to it. If
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
713 // the return value is 0 we'll also try to see if the file by the same
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
714 // name is available in the file system or internal resources.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
715 #ifdef CYGOPT_NET_ATHTTPD_USE_FS
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
716 cyg_int32 rc = h(&httpstate);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
717 if (rc != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
718 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
719 #else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
720 h(&httpstate);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
721 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
722 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
723 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
724
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
725 #ifdef CYGOPT_NET_ATHTTPD_USE_CGIBIN_OBJLOADER
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
726 // If the URL is a CGI script, there is a different directory...
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
727 if (httpstate.url[0] == '/' &&
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
728 !strncmp(httpstate.url + 1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
729 CYGDAT_NET_ATHTTPD_SERVEROPT_CGIDIR,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
730 strlen(CYGDAT_NET_ATHTTPD_SERVEROPT_CGIDIR)))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
731 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
732 cyg_httpd_exec_cgi();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
733 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
734 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
735 // If the OBJLOADER package is not loaded, then the request for a library
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
736 // will likely generate a 404.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
737 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
738
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
739 #ifdef CYGOPT_NET_ATHTTPD_USE_FS
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
740 // No handler, we'll redirect to the file system.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
741 cyg_httpd_send_file(httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
742 #else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
743 // If we do not have a file system, we look for the file within the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
744 // internal resources of the server. The user can add his/her own files
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
745 // to the table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
746 if (strcmp(httpstate.url, "/") == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
747 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
748 int i;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
749 cyg_httpd_ires_table_entry *p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
750 for (i = 0; i < sizeof(home_pages)/sizeof(char*); i++)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
751 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
752 httpstate.url[1] = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
753 strcat(httpstate.url, home_pages[i]);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
754 p = cyg_httpd_find_ires(httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
755 if (p != NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
756 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
757 cyg_httpd_send_ires(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
758 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
759 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
760 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
761 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
762 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
763 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
764 cyg_httpd_ires_table_entry *p = cyg_httpd_find_ires(httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
765 if (p != NULL)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
766 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
767 cyg_httpd_send_ires(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
768 return;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
769 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
770 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
771 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_FOUND);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
772 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
773 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
774
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
775 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
776 cyg_httpd_get_URL(char* p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
777 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
778 char* dest = httpstate.url;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
779
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
780 // First get rid of multiple leading slashes.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
781 while ((p[0] == '/') && (p[1] == '/'))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
782 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
783
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
784 // Store the url, and check if there is a form result in it.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
785 while ((*p != ' ') && (*p != '?') &&
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
786 ((dest - httpstate.url) < CYG_HTTPD_MAXURL - 1))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
787 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
788 // Look for encoded characters in the URL.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
789 if (*p == '%')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
790 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
791 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
792 if (*p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
793 *dest = cyg_httpd_from_hex(*p++) * 16;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
794 if (*p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
795 *dest += cyg_httpd_from_hex(*p++);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
796 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
797 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
798 *dest++ = *p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
799 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
800
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
801 // Terminate the file name...
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
802 *dest = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
803
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
804 // The URL must start with a leadng slash.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
805 if (httpstate.url[0] != '/')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
806 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
807 cyg_httpd_send_error(CYG_HTTPD_STATUS_BAD_REQUEST);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
808 return (char*)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
809 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
810
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
811 // Run past white spaces.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
812 while ((*p == ' ') && (*p != '\0'))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
813 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
814 return p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
815 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
816
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
817 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
818 cyg_httpd_parse_POST(char* p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
819 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
820 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
821 diag_printf("POST Request URL: %s\n", httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
822 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
823 httpstate.method = CYG_HTTPD_METHOD_POST;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
824 httpstate.mode &= ~CYG_HTTPD_SEND_HEADER_ONLY;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
825 p = cyg_httpd_get_URL(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
826 if (p == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
827 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
828
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
829 while (*p++ != '\n');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
830 return p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
831 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
832
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
833 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
834 cyg_httpd_parse_GET(char* p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
835 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
836 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
837 diag_printf("GET Request URL: %s\n", httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
838 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
839 httpstate.method = CYG_HTTPD_METHOD_GET;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
840 httpstate.mode &= ~CYG_HTTPD_SEND_HEADER_ONLY;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
841 p = cyg_httpd_get_URL(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
842 if (p == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
843 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
844
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
845 if (*p == '?')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
846 // If we have a GET header with form variables we'll get the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
847 // variables out of it and store them in the variable table.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
848 p = cyg_httpd_store_form_data(++p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
849
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
850 // Run past white spaces.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
851 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
852 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
853 return p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
854 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
855
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
856 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
857 cyg_httpd_parse_HEAD(char* p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
858 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
859 #if CYGOPT_NET_ATHTTPD_DEBUG_LEVEL > 1
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
860 diag_printf("HEAD Request URL: %s\n", httpstate.url);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
861 #endif
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
862 httpstate.method = CYG_HTTPD_METHOD_HEAD;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
863 httpstate.mode |= CYG_HTTPD_SEND_HEADER_ONLY;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
864 p = cyg_httpd_get_URL(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
865 if (p == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
866 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
867
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
868 // Can we have variables in a HEAD request? I'll assume the answer is a yes
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
869 // for now.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
870 if (*p == '?')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
871 p = cyg_httpd_store_form_data(++p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
872
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
873 // Run past white spaces.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
874 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
875 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
876 return p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
877 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
878
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
879 cyg_int32
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
880 cyg_httpd_process_header(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
881 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
882 char *cp;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
883 char *p = httpstate.inbuffer;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
884
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
885 // The deafult for HTTP 1.1 is keep-alive connections, unless specifically
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
886 // closed by the far end.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
887 httpstate.mode &= ~CYG_HTTPD_MODE_CLOSE_CONN;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
888 httpstate.modified_since = -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
889 while (*p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
890 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
891 if (!strncasecmp("GET ", p, 4))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
892 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
893 p = cyg_httpd_parse_GET(httpstate.inbuffer + 4);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
894 if (p ==0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
895 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
896 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
897 else if (!strncasecmp("POST ", p, 5))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
898 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
899 p = cyg_httpd_parse_POST(httpstate.inbuffer + 5);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
900 if (p ==0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
901 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
902 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
903 else if (!strncasecmp("HEAD ", p, 5))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
904 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
905 p = cyg_httpd_parse_HEAD(httpstate.inbuffer + 5);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
906 if (p ==0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
907 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
908 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
909 else if (strncasecmp(p, "Content-Length: ", 16) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
910 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
911 cp = strchr(p, ':') + 2;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
912 if(cp)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
913 httpstate.inbuffer_len = atoi(cp);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
914 while(*p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
915 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
916 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
917 else if (strncasecmp("Host:", p, 5) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
918 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
919 p += 5;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
920 if ( *p == ' ' )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
921 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
922 sscanf(p,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
923 "%d.%d.%d.%d",
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
924 &httpstate.host[0],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
925 &httpstate.host[1],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
926 &httpstate.host[2],
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
927 &httpstate.host[3]);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
928 while ( *p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
929 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
930 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
931 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
932 else if (strncasecmp("If-Modified-Since:", p, 18) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
933 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
934 p += 18;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
935 if ( *p == ' ' )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
936 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
937 httpstate.modified_since = cyg_httpd_parse_date(p);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
938 while ( *p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
939 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
940 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
941 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
942 #ifdef CYGOPT_NET_ATHTTPD_USE_AUTH
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
943 else if (strncasecmp("Authorization:", p, 14) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
944 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
945 p += 14;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
946 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
947 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
948 if (!strncasecmp("Basic", p, 5))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
949 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
950 char *cr = cyg_httpd_md5_digest;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
951 p += 5;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
952 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
953 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
954 while ((*p != '\r') && (*p != '\n') && (*p != ' '))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
955 *cr++ = *p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
956 *cr = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
957 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
958 else if (strncasecmp(p, "Digest", 6) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
959 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
960 diag_printf(httpstate.inbuffer);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
961 p += 6;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
962 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
963 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
964 while ((*p != '\r') && (*p != '\n'))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
965 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
966 if (strncasecmp(p, "realm=", 6) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
967 p = cyg_httpd_digest_skip(p + 6);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
968 else if (strncasecmp(p, "username=", 9) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
969 p = cyg_httpd_digest_skip(p + 9);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
970 else if (strncasecmp(p, "nonce=", 6) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
971 p = cyg_httpd_digest_skip(p + 6);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
972 else if (strncasecmp(p, "response=", 9) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
973 p = cyg_httpd_digest_data(cyg_httpd_md5_response,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
974 p + 9);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
975 else if (strncasecmp(p, "cnonce=", 7) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
976 p = cyg_httpd_digest_data(cyg_httpd_md5_cnonce, p + 7);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
977 else if (strncasecmp(p, "qop=", 4) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
978 p = cyg_httpd_digest_skip(p + 4);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
979 else if (strncasecmp(p, "nc=", 3) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
980 p = cyg_httpd_digest_data(cyg_httpd_md5_noncecount,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
981 p + 3);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
982 else if (strncasecmp(p, "algorithm=", 10) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
983 p = cyg_httpd_digest_skip(p + 10);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
984 else if (strncasecmp(p, "opaque=", 7) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
985 p = cyg_httpd_digest_skip(p + 7);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
986 else if (strncasecmp(p, "uri=", 4) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
987 p = cyg_httpd_digest_skip(p + 4);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
988 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
989 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
990 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
991 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
992 while (*p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
993 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
994 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
995 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
996 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
997 #endif // CYGOPT_NET_ATHTTPD_USE_AUTH
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
998 else if (strncasecmp(p, "Connection:", 11) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
999 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1000 p += 11;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1001 while (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1002 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1003 if (strncasecmp(p, "close", 5) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1004 httpstate.mode |= CYG_HTTPD_MODE_CLOSE_CONN;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1005 while(*p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1006 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1007 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1008 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1009 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1010 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1011 // We'll just dump the rest of the line and move on to the next.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1012 while(*p != '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1013 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1014 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1015 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1016 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1017 return 1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1018 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1019
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1020 cyg_int32
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1021 cyg_httpd_process_method(void)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1022 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1023 cyg_int32 rc = cyg_httpd_process_header();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1024 if (rc == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1025 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1026
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1027 switch (httpstate.method)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1028 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1029 case CYG_HTTPD_METHOD_GET:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1030 case CYG_HTTPD_METHOD_HEAD:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1031 cyg_httpd_handle_method_GET();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1032 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1033 case CYG_HTTPD_METHOD_POST:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1034 cyg_httpd_handle_method_POST();
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1035 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1036 default:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1037 cyg_httpd_send_error(CYG_HTTPD_STATUS_NOT_IMPLEMENTED);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1038 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1039 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1040 return 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1041 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1042