annotate packages/net/athttpd/current/src/http.c @ 3292:7f8e529b4d82 default tip

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