14 changed files with 4567 additions and 0 deletions
@ -0,0 +1,175 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "lwip/apps/httpd_opts.h" |
||||
#include "lwip/def.h" |
||||
#include "lwip/apps/fs.h" |
||||
#include "fsdata.h" |
||||
#include <string.h> |
||||
|
||||
#if HTTPD_USE_CUSTOM_FSDATA |
||||
#include "fsdata_custom.c" |
||||
#else /* HTTPD_USE_CUSTOM_FSDATA */ |
||||
#include "fsdata.c" |
||||
#endif /* HTTPD_USE_CUSTOM_FSDATA */ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
int fs_open_custom(struct fs_file *file, const char *name); |
||||
void fs_close_custom(struct fs_file *file); |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
u8_t fs_canread_custom(struct fs_file *file); |
||||
u8_t fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg); |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
fs_open(struct fs_file *file, const char *name) |
||||
{ |
||||
const struct fsdata_file *f; |
||||
|
||||
if ((file == NULL) || (name == NULL)) { |
||||
return ERR_ARG; |
||||
} |
||||
|
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
if (fs_open_custom(file, name)) { |
||||
file->is_custom_file = 1; |
||||
return ERR_OK; |
||||
} |
||||
file->is_custom_file = 0; |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
|
||||
for (f = FS_ROOT; f != NULL; f = f->next) { |
||||
if (!strcmp(name, (const char *)f->name)) { |
||||
file->data = (const char *)f->data; |
||||
file->len = f->len; |
||||
file->index = f->len; |
||||
file->pextension = NULL; |
||||
file->http_header_included = f->http_header_included; |
||||
#if HTTPD_PRECALCULATED_CHECKSUM |
||||
file->chksum_count = f->chksum_count; |
||||
file->chksum = f->chksum; |
||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */ |
||||
#if LWIP_HTTPD_FILE_STATE |
||||
file->state = fs_state_init(file, name); |
||||
#endif /* #if LWIP_HTTPD_FILE_STATE */ |
||||
return ERR_OK; |
||||
} |
||||
} |
||||
/* file not found */ |
||||
return ERR_VAL; |
||||
} |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
void |
||||
fs_close(struct fs_file *file) |
||||
{ |
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
if (file->is_custom_file) { |
||||
fs_close_custom(file); |
||||
} |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
#if LWIP_HTTPD_FILE_STATE |
||||
fs_state_free(file, file->state); |
||||
#endif /* #if LWIP_HTTPD_FILE_STATE */ |
||||
LWIP_UNUSED_ARG(file); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
#if LWIP_HTTPD_DYNAMIC_FILE_READ |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
int |
||||
fs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg) |
||||
#else /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
int |
||||
fs_read(struct fs_file *file, char *buffer, int count) |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
{ |
||||
int read; |
||||
|
||||
if(file->index == file->len) { |
||||
return FS_READ_EOF; |
||||
} |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
if (!fs_canread_custom(file)) { |
||||
if (fs_wait_read_custom(file, callback_fn, callback_arg)) { |
||||
return FS_READ_DELAYED; |
||||
} |
||||
} |
||||
#else /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
LWIP_UNUSED_ARG(callback_fn); |
||||
LWIP_UNUSED_ARG(callback_arg); |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
|
||||
read = file->len - file->index; |
||||
if(read > count) { |
||||
read = count; |
||||
} |
||||
|
||||
MEMCPY(buffer, (file->data + file->index), read); |
||||
file->index += read; |
||||
|
||||
return(read); |
||||
} |
||||
#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
int |
||||
fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg) |
||||
{ |
||||
if (file != NULL) { |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
if (!fs_canread_custom(file)) { |
||||
if (fs_wait_read_custom(file, callback_fn, callback_arg)) { |
||||
return 0; |
||||
} |
||||
} |
||||
#else /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
LWIP_UNUSED_ARG(callback_fn); |
||||
LWIP_UNUSED_ARG(callback_arg); |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
} |
||||
return 1; |
||||
} |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
int |
||||
fs_bytes_left(struct fs_file *file) |
||||
{ |
||||
return file->len - file->index; |
||||
} |
||||
@ -0,0 +1,21 @@
|
||||
<html> |
||||
<head><title>lwIP - A Lightweight TCP/IP Stack</title></head> |
||||
<body bgcolor="white" text="black"> |
||||
|
||||
<table width="100%"> |
||||
<tr valign="top"><td width="80"> |
||||
<a href="http://www.sics.se/"><img src="/img/sics.gif" |
||||
border="0" alt="SICS logo" title="SICS logo"></a> |
||||
</td><td width="500"> |
||||
<h1>lwIP - A Lightweight TCP/IP Stack</h1> |
||||
<h2>404 - Page not found</h2> |
||||
<p> |
||||
Sorry, the page you are requesting was not found on this |
||||
server. |
||||
</p> |
||||
</td><td> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</body> |
||||
</html> |
||||
|
After Width: | Height: | Size: 724 B |
@ -0,0 +1,47 @@
|
||||
<html> |
||||
<head><title>lwIP - A Lightweight TCP/IP Stack</title></head> |
||||
<body bgcolor="white" text="black"> |
||||
|
||||
<table width="100%"> |
||||
<tr valign="top"><td width="80"> |
||||
<a href="http://www.sics.se/"><img src="/img/sics.gif" |
||||
border="0" alt="SICS logo" title="SICS logo"></a> |
||||
</td><td width="500"> |
||||
<h1>lwIP - A Lightweight TCP/IP Stack</h1> |
||||
<p> |
||||
The web page you are watching was served by a simple web |
||||
server running on top of the lightweight TCP/IP stack <a |
||||
href="http://www.sics.se/~adam/lwip/">lwIP</a>. |
||||
</p> |
||||
<p> |
||||
lwIP is an open source implementation of the TCP/IP |
||||
protocol suite that was originally written by <a |
||||
href="http://www.sics.se/~adam/lwip/">Adam Dunkels |
||||
of the Swedish Institute of Computer Science</a> but now is |
||||
being actively developed by a team of developers |
||||
distributed world-wide. Since it's release, lwIP has |
||||
spurred a lot of interest and has been ported to several |
||||
platforms and operating systems. lwIP can be used either |
||||
with or without an underlying OS. |
||||
</p> |
||||
<p> |
||||
The focus of the lwIP TCP/IP implementation is to reduce |
||||
the RAM usage while still having a full scale TCP. This |
||||
makes lwIP suitable for use in embedded systems with tens |
||||
of kilobytes of free RAM and room for around 40 kilobytes |
||||
of code ROM. |
||||
</p> |
||||
<p> |
||||
More information about lwIP can be found at the lwIP |
||||
homepage at <a |
||||
href="http://savannah.nongnu.org/projects/lwip/">http://savannah.nongnu.org/projects/lwip/</a> |
||||
or at the lwIP wiki at <a |
||||
href="http://lwip.wikia.com/">http://lwip.wikia.com/</a>. |
||||
</p> |
||||
</td><td> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</body> |
||||
</html> |
||||
|
||||
@ -0,0 +1,298 @@
|
||||
#include "lwip/apps/fs.h" |
||||
#include "lwip/def.h" |
||||
#include "fsdata.h" |
||||
|
||||
|
||||
#define file_NULL (struct fsdata_file *) NULL |
||||
|
||||
|
||||
static const unsigned int dummy_align__img_sics_gif = 0; |
||||
static const unsigned char data__img_sics_gif[] = { |
||||
/* /img/sics.gif (14 chars) */ |
||||
0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x00,0x00,0x00, |
||||
|
||||
/* HTTP header */ |
||||
/* "HTTP/1.0 200 OK
|
||||
" (17 bytes) */ |
||||
0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, |
||||
0x0a, |
||||
/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
|
||||
" (63 bytes) */ |
||||
0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, |
||||
0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, |
||||
0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, |
||||
0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, |
||||
/* "Content-type: image/gif
|
||||
|
||||
" (27 bytes) */ |
||||
0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d, |
||||
0x61,0x67,0x65,0x2f,0x67,0x69,0x66,0x0d,0x0a,0x0d,0x0a, |
||||
/* raw file data (724 bytes) */ |
||||
0x47,0x49,0x46,0x38,0x39,0x61,0x46,0x00,0x22,0x00,0xa5,0x00,0x00,0xd9,0x2b,0x39, |
||||
0x6a,0x6a,0x6a,0xbf,0xbf,0xbf,0x93,0x93,0x93,0x0f,0x0f,0x0f,0xb0,0xb0,0xb0,0xa6, |
||||
0xa6,0xa6,0x80,0x80,0x80,0x76,0x76,0x76,0x1e,0x1e,0x1e,0x9d,0x9d,0x9d,0x2e,0x2e, |
||||
0x2e,0x49,0x49,0x49,0x54,0x54,0x54,0x8a,0x8a,0x8a,0x60,0x60,0x60,0xc6,0xa6,0x99, |
||||
0xbd,0xb5,0xb2,0xc2,0xab,0xa1,0xd9,0x41,0x40,0xd5,0x67,0x55,0xc0,0xb0,0xaa,0xd5, |
||||
0x5e,0x4e,0xd6,0x50,0x45,0xcc,0x93,0x7d,0xc8,0xa1,0x90,0xce,0x8b,0x76,0xd2,0x7b, |
||||
0x65,0xd1,0x84,0x6d,0xc9,0x99,0x86,0x3a,0x3a,0x3a,0x00,0x00,0x00,0xb8,0xb8,0xb8, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, |
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2c,0x00,0x00, |
||||
0x00,0x00,0x46,0x00,0x22,0x00,0x00,0x06,0xfe,0x40,0x90,0x70,0x48,0x2c,0x1a,0x8f, |
||||
0xc8,0xa4,0x72,0xc9,0x6c,0x3a,0x9f,0xd0,0xa8,0x74,0x4a,0xad,0x5a,0xaf,0xd8,0xac, |
||||
0x76,0xa9,0x40,0x04,0xbe,0x83,0xe2,0x60,0x3c,0x50,0x20,0x0d,0x8e,0x6f,0x00,0x31, |
||||
0x28,0x1c,0x0d,0x07,0xb5,0xc3,0x60,0x75,0x24,0x3e,0xf8,0xfc,0x87,0x11,0x06,0xe9, |
||||
0x3d,0x46,0x07,0x0b,0x7a,0x7a,0x7c,0x43,0x06,0x1e,0x84,0x78,0x0b,0x07,0x6e,0x51, |
||||
0x01,0x8a,0x84,0x08,0x7e,0x79,0x80,0x87,0x89,0x91,0x7a,0x93,0x0a,0x04,0x99,0x78, |
||||
0x96,0x4f,0x03,0x9e,0x79,0x01,0x94,0x9f,0x43,0x9c,0xa3,0xa4,0x05,0x77,0xa3,0xa0, |
||||
0x4e,0x98,0x79,0x0b,0x1e,0x83,0xa4,0xa6,0x1f,0x96,0x05,0x9d,0xaa,0x78,0x01,0x07, |
||||
0x84,0x04,0x1e,0x1e,0xbb,0xb8,0x51,0x84,0x0e,0x43,0x05,0x07,0x77,0xa5,0x7f,0x42, |
||||
0xb1,0xb2,0x01,0x63,0x08,0x0d,0xbb,0x01,0x0c,0x7a,0x0d,0x44,0x0e,0xd8,0xaf,0x4c, |
||||
0x05,0x7a,0x04,0x47,0x07,0x07,0xb7,0x80,0xa2,0xe1,0x7d,0x44,0x05,0x01,0x04,0x01, |
||||
0xd0,0xea,0x87,0x93,0x4f,0xe0,0x9a,0x49,0xce,0xd8,0x79,0x04,0x66,0x20,0x15,0x10, |
||||
0x10,0x11,0x92,0x29,0x80,0xb6,0xc0,0x91,0x15,0x45,0x1e,0x90,0x19,0x71,0x46,0xa8, |
||||
0x5c,0x04,0x0e,0x00,0x22,0x4e,0xe8,0x40,0x24,0x9f,0x3e,0x04,0x06,0xa7,0x58,0xd4, |
||||
0x93,0xa0,0x1c,0x91,0x3f,0xe8,0xf0,0x88,0x03,0xb1,0x21,0xa2,0x49,0x00,0x19,0x86, |
||||
0xfc,0x52,0x44,0xe0,0x01,0x9d,0x29,0x21,0x15,0x25,0x50,0xf7,0x67,0x25,0x1e,0x06, |
||||
0xfd,0x4e,0x9a,0xb4,0x90,0xac,0x15,0xfa,0xcb,0x52,0x53,0x1e,0x8c,0xf2,0xf8,0x07, |
||||
0x92,0x2d,0x08,0x3a,0x4d,0x12,0x49,0x95,0x49,0xdb,0x14,0x04,0xc4,0x14,0x85,0x29, |
||||
0xaa,0xe7,0x01,0x08,0xa4,0x49,0x01,0x14,0x51,0xe0,0x53,0x91,0xd5,0x29,0x06,0x1a, |
||||
0x64,0x02,0xf4,0xc7,0x81,0x9e,0x05,0x20,0x22,0x64,0xa5,0x30,0xae,0xab,0x9e,0x97, |
||||
0x53,0xd8,0xb9,0xfd,0x50,0xef,0x93,0x02,0x42,0x74,0x34,0xe8,0x9c,0x20,0x21,0xc9, |
||||
0x01,0x68,0x78,0xe6,0x55,0x29,0x20,0x56,0x4f,0x4c,0x40,0x51,0x71,0x82,0xc0,0x70, |
||||
0x21,0x22,0x85,0xbe,0x4b,0x1c,0x44,0x05,0xea,0xa4,0x01,0xbf,0x22,0xb5,0xf0,0x1c, |
||||
0x06,0x51,0x38,0x8f,0xe0,0x22,0xec,0x18,0xac,0x39,0x22,0xd4,0xd6,0x93,0x44,0x01, |
||||
0x32,0x82,0xc8,0xfc,0x61,0xb3,0x01,0x45,0x0c,0x2e,0x83,0x30,0xd0,0x0e,0x17,0x24, |
||||
0x0f,0x70,0x85,0x94,0xee,0x05,0x05,0x53,0x4b,0x32,0x1b,0x3f,0x98,0xd3,0x1d,0x29, |
||||
0x81,0xb0,0xae,0x1e,0x8c,0x7e,0x68,0xe0,0x60,0x5a,0x54,0x8f,0xb0,0x78,0x69,0x73, |
||||
0x06,0xa2,0x00,0x6b,0x57,0xca,0x3d,0x11,0x50,0xbd,0x04,0x30,0x4b,0x3a,0xd4,0xab, |
||||
0x5f,0x1f,0x9b,0x3d,0x13,0x74,0x27,0x88,0x3c,0x25,0xe0,0x17,0xbe,0x7a,0x79,0x45, |
||||
0x0d,0x0c,0xb0,0x8b,0xda,0x90,0xca,0x80,0x06,0x5d,0x17,0x60,0x1c,0x22,0x4c,0xd8, |
||||
0x57,0x22,0x06,0x20,0x00,0x98,0x07,0x08,0xe4,0x56,0x80,0x80,0x1c,0xc5,0xb7,0xc5, |
||||
0x82,0x0c,0x36,0xe8,0xe0,0x83,0x10,0x46,0x28,0xe1,0x84,0x14,0x56,0x68,0xa1,0x10, |
||||
0x41,0x00,0x00,0x3b,}; |
||||
|
||||
static const unsigned int dummy_align__404_html = 1; |
||||
static const unsigned char data__404_html[] = { |
||||
/* /404.html (10 chars) */ |
||||
0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00, |
||||
|
||||
/* HTTP header */ |
||||
/* "HTTP/1.0 404 File not found
|
||||
" (29 bytes) */ |
||||
0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c, |
||||
0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a, |
||||
/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
|
||||
" (63 bytes) */ |
||||
0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, |
||||
0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, |
||||
0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, |
||||
0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, |
||||
/* "Content-type: text/html
|
||||
|
||||
" (27 bytes) */ |
||||
0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, |
||||
0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, |
||||
/* raw file data (565 bytes) */ |
||||
0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, |
||||
0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69, |
||||
0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50, |
||||
0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f, |
||||
0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63, |
||||
0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78, |
||||
0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20, |
||||
0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22, |
||||
0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, |
||||
0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c, |
||||
0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20, |
||||
0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, |
||||
0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, |
||||
0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69, |
||||
0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20, |
||||
0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d, |
||||
0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c, |
||||
0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f, |
||||
0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69, |
||||
0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09, |
||||
0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c, |
||||
0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49, |
||||
0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20, |
||||
0x20,0x3c,0x68,0x32,0x3e,0x34,0x30,0x34,0x20,0x2d,0x20,0x50,0x61,0x67,0x65,0x20, |
||||
0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x3c,0x2f,0x68,0x32,0x3e,0x0d,0x0a, |
||||
0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x53,0x6f,0x72, |
||||
0x72,0x79,0x2c,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75, |
||||
0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x20, |
||||
0x77,0x61,0x73,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x6f,0x6e, |
||||
0x20,0x74,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76, |
||||
0x65,0x72,0x2e,0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09, |
||||
0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e, |
||||
0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72, |
||||
0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65, |
||||
0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74, |
||||
0x6d,0x6c,0x3e,0x0d,0x0a,}; |
||||
|
||||
static const unsigned int dummy_align__index_html = 2; |
||||
static const unsigned char data__index_html[] = { |
||||
/* /index.html (12 chars) */ |
||||
0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00, |
||||
|
||||
/* HTTP header */ |
||||
/* "HTTP/1.0 200 OK
|
||||
" (17 bytes) */ |
||||
0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, |
||||
0x0a, |
||||
/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
|
||||
" (63 bytes) */ |
||||
0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, |
||||
0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, |
||||
0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, |
||||
0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, |
||||
/* "Content-type: text/html
|
||||
|
||||
" (27 bytes) */ |
||||
0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, |
||||
0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, |
||||
/* raw file data (1751 bytes) */ |
||||
0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, |
||||
0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69, |
||||
0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50, |
||||
0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f, |
||||
0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63, |
||||
0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78, |
||||
0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20, |
||||
0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22, |
||||
0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, |
||||
0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c, |
||||
0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20, |
||||
0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, |
||||
0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, |
||||
0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69, |
||||
0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20, |
||||
0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d, |
||||
0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c, |
||||
0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f, |
||||
0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69, |
||||
0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09, |
||||
0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c, |
||||
0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49, |
||||
0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20, |
||||
0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x77, |
||||
0x65,0x62,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,0x20,0x61,0x72,0x65,0x20, |
||||
0x77,0x61,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x77,0x61,0x73,0x20,0x73,0x65,0x72, |
||||
0x76,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x73,0x69,0x6d,0x70,0x6c,0x65,0x20, |
||||
0x77,0x65,0x62,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72, |
||||
0x20,0x72,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x20,0x74,0x6f,0x70,0x20, |
||||
0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67, |
||||
0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x73,0x74,0x61,0x63,0x6b,0x20, |
||||
0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, |
||||
0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, |
||||
0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x6c, |
||||
0x77,0x49,0x50,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70, |
||||
0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20, |
||||
0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20, |
||||
0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74, |
||||
0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50, |
||||
0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63, |
||||
0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61, |
||||
0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69, |
||||
0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20, |
||||
0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77, |
||||
0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f, |
||||
0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b, |
||||
0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65, |
||||
0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75, |
||||
0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53, |
||||
0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e, |
||||
0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e, |
||||
0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c, |
||||
0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f, |
||||
0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20, |
||||
0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77, |
||||
0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65, |
||||
0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c, |
||||
0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70, |
||||
0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69, |
||||
0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20, |
||||
0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73, |
||||
0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61, |
||||
0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61, |
||||
0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77, |
||||
0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65, |
||||
0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68, |
||||
0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75, |
||||
0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09, |
||||
0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a, |
||||
0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x66,0x6f,0x63,0x75,0x73,0x20,0x6f, |
||||
0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x54,0x43,0x50,0x2f,0x49, |
||||
0x50,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e, |
||||
0x20,0x69,0x73,0x20,0x74,0x6f,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x0d,0x0a,0x09, |
||||
0x20,0x20,0x20,0x20,0x74,0x68,0x65,0x20,0x52,0x41,0x4d,0x20,0x75,0x73,0x61,0x67, |
||||
0x65,0x20,0x77,0x68,0x69,0x6c,0x65,0x20,0x73,0x74,0x69,0x6c,0x6c,0x20,0x68,0x61, |
||||
0x76,0x69,0x6e,0x67,0x20,0x61,0x20,0x66,0x75,0x6c,0x6c,0x20,0x73,0x63,0x61,0x6c, |
||||
0x65,0x20,0x54,0x43,0x50,0x2e,0x20,0x54,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20, |
||||
0x20,0x20,0x6d,0x61,0x6b,0x65,0x73,0x20,0x6c,0x77,0x49,0x50,0x20,0x73,0x75,0x69, |
||||
0x74,0x61,0x62,0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,0x75,0x73,0x65,0x20,0x69,0x6e, |
||||
0x20,0x65,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x73,0x79,0x73,0x74,0x65,0x6d, |
||||
0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x65,0x6e,0x73,0x0d,0x0a,0x09,0x20,0x20, |
||||
0x20,0x20,0x6f,0x66,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x20,0x6f, |
||||
0x66,0x20,0x66,0x72,0x65,0x65,0x20,0x52,0x41,0x4d,0x20,0x61,0x6e,0x64,0x20,0x72, |
||||
0x6f,0x6f,0x6d,0x20,0x66,0x6f,0x72,0x20,0x61,0x72,0x6f,0x75,0x6e,0x64,0x20,0x34, |
||||
0x30,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x0d,0x0a,0x09,0x20,0x20, |
||||
0x20,0x20,0x6f,0x66,0x20,0x63,0x6f,0x64,0x65,0x20,0x52,0x4f,0x4d,0x2e,0x0d,0x0a, |
||||
0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d, |
||||
0x0a,0x09,0x20,0x20,0x20,0x20,0x4d,0x6f,0x72,0x65,0x20,0x69,0x6e,0x66,0x6f,0x72, |
||||
0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x62,0x6f,0x75,0x74,0x20,0x6c,0x77,0x49, |
||||
0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61, |
||||
0x74,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20, |
||||
0x20,0x68,0x6f,0x6d,0x65,0x70,0x61,0x67,0x65,0x20,0x61,0x74,0x20,0x3c,0x61,0x0d, |
||||
0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70, |
||||
0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67, |
||||
0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f, |
||||
0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61, |
||||
0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72, |
||||
0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x2f, |
||||
0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x72,0x20,0x61,0x74, |
||||
0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x77,0x69,0x6b,0x69,0x20,0x61, |
||||
0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d, |
||||
0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b, |
||||
0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f, |
||||
0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x3c, |
||||
0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09, |
||||
0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e, |
||||
0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72, |
||||
0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65, |
||||
0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74, |
||||
0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,}; |
||||
|
||||
|
||||
|
||||
const struct fsdata_file file__img_sics_gif[] = { { |
||||
file_NULL, |
||||
data__img_sics_gif, |
||||
data__img_sics_gif + 16, |
||||
sizeof(data__img_sics_gif) - 16, |
||||
1, |
||||
}}; |
||||
|
||||
const struct fsdata_file file__404_html[] = { { |
||||
file__img_sics_gif, |
||||
data__404_html, |
||||
data__404_html + 12, |
||||
sizeof(data__404_html) - 12, |
||||
1, |
||||
}}; |
||||
|
||||
const struct fsdata_file file__index_html[] = { { |
||||
file__404_html, |
||||
data__index_html, |
||||
data__index_html + 12, |
||||
sizeof(data__index_html) - 12, |
||||
1, |
||||
}}; |
||||
|
||||
#define FS_ROOT file__index_html |
||||
#define FS_NUMFILES 3 |
||||
|
||||
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_FSDATA_H |
||||
#define LWIP_FSDATA_H |
||||
|
||||
#include "lwip/apps/httpd_opts.h" |
||||
#include "lwip/apps/fs.h" |
||||
|
||||
struct fsdata_file { |
||||
const struct fsdata_file *next; |
||||
const unsigned char *name; |
||||
const unsigned char *data; |
||||
int len; |
||||
u8_t http_header_included; |
||||
#if HTTPD_PRECALCULATED_CHECKSUM |
||||
u16_t chksum_count; |
||||
const struct fsdata_chksum *chksum; |
||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */ |
||||
}; |
||||
|
||||
#endif /* LWIP_FSDATA_H */ |
||||
@ -0,0 +1,104 @@
|
||||
#ifndef LWIP_HTTPD_STRUCTS_H |
||||
#define LWIP_HTTPD_STRUCTS_H |
||||
|
||||
#include "lwip/apps/httpd.h" |
||||
|
||||
#if LWIP_HTTPD_DYNAMIC_HEADERS |
||||
/** This struct is used for a list of HTTP header strings for various
|
||||
* filename extensions. */ |
||||
typedef struct |
||||
{ |
||||
const char *extension; |
||||
const char *content_type; |
||||
} tHTTPHeader; |
||||
|
||||
/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and
|
||||
* RFC 2616 HTTP/1.1 for header field definitions) */ |
||||
static const char * const g_psHTTPHeaderStrings[] = |
||||
{ |
||||
"HTTP/1.0 200 OK\r\n", |
||||
"HTTP/1.0 404 File not found\r\n", |
||||
"HTTP/1.0 400 Bad Request\r\n", |
||||
"HTTP/1.0 501 Not Implemented\r\n", |
||||
"HTTP/1.1 200 OK\r\n", |
||||
"HTTP/1.1 404 File not found\r\n", |
||||
"HTTP/1.1 400 Bad Request\r\n", |
||||
"HTTP/1.1 501 Not Implemented\r\n", |
||||
"Content-Length: ", |
||||
"Connection: Close\r\n", |
||||
"Connection: keep-alive\r\n", |
||||
"Server: "HTTPD_SERVER_AGENT"\r\n", |
||||
"\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n" |
||||
}; |
||||
|
||||
/* Indexes into the g_psHTTPHeaderStrings array */ |
||||
#define HTTP_HDR_OK 0 /* 200 OK */ |
||||
#define HTTP_HDR_NOT_FOUND 1 /* 404 File not found */ |
||||
#define HTTP_HDR_BAD_REQUEST 2 /* 400 Bad request */ |
||||
#define HTTP_HDR_NOT_IMPL 3 /* 501 Not Implemented */ |
||||
#define HTTP_HDR_OK_11 4 /* 200 OK */ |
||||
#define HTTP_HDR_NOT_FOUND_11 5 /* 404 File not found */ |
||||
#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */ |
||||
#define HTTP_HDR_NOT_IMPL_11 7 /* 501 Not Implemented */ |
||||
#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.1)*/ |
||||
#define HTTP_HDR_CONN_CLOSE 9 /* Connection: Close (HTTP 1.1) */ |
||||
#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */ |
||||
#define HTTP_HDR_SERVER 11 /* Server: HTTPD_SERVER_AGENT */ |
||||
#define DEFAULT_404_HTML 12 /* default 404 body */ |
||||
|
||||
|
||||
#define HTTP_HDR_HTML "Content-type: text/html\r\n\r\n" |
||||
#define HTTP_HDR_SSI "Content-type: text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache\r\n\r\n" |
||||
#define HTTP_HDR_GIF "Content-type: image/gif\r\n\r\n" |
||||
#define HTTP_HDR_PNG "Content-type: image/png\r\n\r\n" |
||||
#define HTTP_HDR_JPG "Content-type: image/jpeg\r\n\r\n" |
||||
#define HTTP_HDR_BMP "Content-type: image/bmp\r\n\r\n" |
||||
#define HTTP_HDR_ICO "Content-type: image/x-icon\r\n\r\n" |
||||
#define HTTP_HDR_APP "Content-type: application/octet-stream\r\n\r\n" |
||||
#define HTTP_HDR_JS "Content-type: application/javascript\r\n\r\n" |
||||
#define HTTP_HDR_RA "Content-type: application/javascript\r\n\r\n" |
||||
#define HTTP_HDR_CSS "Content-type: text/css\r\n\r\n" |
||||
#define HTTP_HDR_SWF "Content-type: application/x-shockwave-flash\r\n\r\n" |
||||
#define HTTP_HDR_XML "Content-type: text/xml\r\n\r\n" |
||||
#define HTTP_HDR_PDF "Content-type: application/pdf\r\n\r\n" |
||||
|
||||
#define HTTP_HDR_DEFAULT_TYPE "Content-type: text/plain\r\n\r\n" |
||||
|
||||
/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES
|
||||
* and http://www.iana.org/assignments/media-types for registered content types
|
||||
* and subtypes) */ |
||||
static const tHTTPHeader g_psHTTPHeaders[] = |
||||
{ |
||||
{ "html", HTTP_HDR_HTML}, |
||||
{ "htm", HTTP_HDR_HTML}, |
||||
{ "shtml",HTTP_HDR_SSI}, |
||||
{ "shtm", HTTP_HDR_SSI}, |
||||
{ "ssi", HTTP_HDR_SSI}, |
||||
{ "gif", HTTP_HDR_GIF}, |
||||
{ "png", HTTP_HDR_PNG}, |
||||
{ "jpg", HTTP_HDR_JPG}, |
||||
{ "bmp", HTTP_HDR_BMP}, |
||||
{ "ico", HTTP_HDR_ICO}, |
||||
{ "class",HTTP_HDR_APP}, |
||||
{ "cls", HTTP_HDR_APP}, |
||||
{ "js", HTTP_HDR_JS}, |
||||
{ "ram", HTTP_HDR_RA}, |
||||
{ "css", HTTP_HDR_CSS}, |
||||
{ "swf", HTTP_HDR_SWF}, |
||||
{ "xml", HTTP_HDR_XML}, |
||||
{ "xsl", HTTP_HDR_XML}, |
||||
{ "pdf", HTTP_HDR_PDF} |
||||
}; |
||||
|
||||
#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader)) |
||||
|
||||
#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ |
||||
|
||||
#if LWIP_HTTPD_SSI |
||||
static const char * const g_pcSSIExtensions[] = { |
||||
".shtml", ".shtm", ".ssi", ".xml" |
||||
}; |
||||
#define NUM_SHTML_EXTENSIONS (sizeof(g_pcSSIExtensions) / sizeof(const char *)) |
||||
#endif /* LWIP_HTTPD_SSI */ |
||||
|
||||
#endif /* LWIP_HTTPD_STRUCTS_H */ |
||||
@ -0,0 +1,97 @@
|
||||
#!/usr/bin/perl |
||||
|
||||
open(OUTPUT, "> fsdata.c"); |
||||
|
||||
chdir("fs"); |
||||
open(FILES, "find . -type f |"); |
||||
|
||||
while($file = <FILES>) { |
||||
|
||||
# Do not include files in CVS directories nor backup files. |
||||
if($file =~ /(CVS|~)/) { |
||||
next; |
||||
} |
||||
|
||||
chop($file); |
||||
|
||||
open(HEADER, "> /tmp/header") || die $!; |
||||
if($file =~ /404/) { |
||||
print(HEADER "HTTP/1.0 404 File not found\r\n"); |
||||
} else { |
||||
print(HEADER "HTTP/1.0 200 OK\r\n"); |
||||
} |
||||
print(HEADER "Server: lwIP/pre-0.6 (http://www.sics.se/~adam/lwip/)\r\n"); |
||||
if($file =~ /\.html$/) { |
||||
print(HEADER "Content-type: text/html\r\n"); |
||||
} elsif($file =~ /\.gif$/) { |
||||
print(HEADER "Content-type: image/gif\r\n"); |
||||
} elsif($file =~ /\.png$/) { |
||||
print(HEADER "Content-type: image/png\r\n"); |
||||
} elsif($file =~ /\.jpg$/) { |
||||
print(HEADER "Content-type: image/jpeg\r\n"); |
||||
} elsif($file =~ /\.class$/) { |
||||
print(HEADER "Content-type: application/octet-stream\r\n"); |
||||
} elsif($file =~ /\.ram$/) { |
||||
print(HEADER "Content-type: audio/x-pn-realaudio\r\n"); |
||||
} else { |
||||
print(HEADER "Content-type: text/plain\r\n"); |
||||
} |
||||
print(HEADER "\r\n"); |
||||
close(HEADER); |
||||
|
||||
unless($file =~ /\.plain$/ || $file =~ /cgi/) { |
||||
system("cat /tmp/header $file > /tmp/file"); |
||||
} else { |
||||
system("cp $file /tmp/file"); |
||||
} |
||||
|
||||
open(FILE, "/tmp/file"); |
||||
unlink("/tmp/file"); |
||||
unlink("/tmp/header"); |
||||
|
||||
$file =~ s/\.//; |
||||
$fvar = $file; |
||||
$fvar =~ s-/-_-g; |
||||
$fvar =~ s-\.-_-g; |
||||
print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); |
||||
print(OUTPUT "\t/* $file */\n\t"); |
||||
for($j = 0; $j < length($file); $j++) { |
||||
printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); |
||||
} |
||||
printf(OUTPUT "0,\n"); |
||||
|
||||
|
||||
$i = 0; |
||||
while(read(FILE, $data, 1)) { |
||||
if($i == 0) { |
||||
print(OUTPUT "\t"); |
||||
} |
||||
printf(OUTPUT "%#02x, ", unpack("C", $data)); |
||||
$i++; |
||||
if($i == 10) { |
||||
print(OUTPUT "\n"); |
||||
$i = 0; |
||||
} |
||||
} |
||||
print(OUTPUT "};\n\n"); |
||||
close(FILE); |
||||
push(@fvars, $fvar); |
||||
push(@files, $file); |
||||
} |
||||
|
||||
for($i = 0; $i < @fvars; $i++) { |
||||
$file = $files[$i]; |
||||
$fvar = $fvars[$i]; |
||||
|
||||
if($i == 0) { |
||||
$prevfile = "NULL"; |
||||
} else { |
||||
$prevfile = "file" . $fvars[$i - 1]; |
||||
} |
||||
print(OUTPUT "const struct fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); |
||||
print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); |
||||
print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); |
||||
} |
||||
|
||||
print(OUTPUT "#define FS_ROOT file$fvars[$i - 1]\n\n"); |
||||
print(OUTPUT "#define FS_NUMFILES $i\n"); |
||||
@ -0,0 +1,778 @@
|
||||
/**
|
||||
* makefsdata: Converts a directory structure for use with the lwIP httpd. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Jim Pettinato |
||||
* Simon Goldschmidt |
||||
* |
||||
* @todo: |
||||
* - take TCP_MSS, LWIP_TCP_TIMESTAMPS and |
||||
* PAYLOAD_ALIGN_TYPE/PAYLOAD_ALIGNMENT as arguments |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#ifdef WIN32 |
||||
#define WIN32_LEAN_AND_MEAN |
||||
#include "windows.h" |
||||
#else |
||||
#include <dir.h> |
||||
#endif |
||||
#include <dos.h> |
||||
#include <string.h> |
||||
|
||||
/* Compatibility defines Win32 vs. DOS */ |
||||
#ifdef WIN32 |
||||
|
||||
#define FIND_T WIN32_FIND_DATAA |
||||
#define FIND_T_FILENAME(fInfo) (fInfo.cFileName) |
||||
#define FIND_T_IS_DIR(fInfo) ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) |
||||
#define FIND_T_IS_FILE(fInfo) ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) |
||||
#define FIND_RET_T HANDLE |
||||
#define FINDFIRST_FILE(path, result) FindFirstFileA(path, result) |
||||
#define FINDFIRST_DIR(path, result) FindFirstFileA(path, result) |
||||
#define FINDNEXT(ff_res, result) FindNextFileA(ff_res, result) |
||||
#define FINDFIRST_SUCCEEDED(ret) (ret != INVALID_HANDLE_VALUE) |
||||
#define FINDNEXT_SUCCEEDED(ret) (ret == TRUE) |
||||
|
||||
#define GETCWD(path, len) GetCurrentDirectoryA(len, path) |
||||
#define CHDIR(path) SetCurrentDirectoryA(path) |
||||
#define CHDIR_SUCCEEDED(ret) (ret == TRUE) |
||||
|
||||
#else |
||||
|
||||
#define FIND_T struct ffblk |
||||
#define FIND_T_FILENAME(fInfo) (fInfo.ff_name) |
||||
#define FIND_T_IS_DIR(fInfo) ((fInfo.ff_attrib & FA_DIREC) == FA_DIREC) |
||||
#define FIND_T_IS_FILE(fInfo) (1) |
||||
#define FIND_RET_T int |
||||
#define FINDFIRST_FILE(path, result) findfirst(path, result, FA_ARCH) |
||||
#define FINDFIRST_DIR(path, result) findfirst(path, result, FA_DIREC) |
||||
#define FINDNEXT(ff_res, result) FindNextFileA(ff_res, result) |
||||
#define FINDFIRST_SUCCEEDED(ret) (ret == 0) |
||||
#define FINDNEXT_SUCCEEDED(ret) (ret == 0) |
||||
|
||||
#define GETCWD(path, len) getcwd(path, len) |
||||
#define CHDIR(path) chdir(path) |
||||
#define CHDIR_SUCCEEDED(ret) (ret == 0) |
||||
|
||||
#endif |
||||
|
||||
#define NEWLINE "\r\n" |
||||
#define NEWLINE_LEN 2 |
||||
|
||||
/* define this to get the header variables we use to build HTTP headers */ |
||||
#define LWIP_HTTPD_DYNAMIC_HEADERS 1 |
||||
#define LWIP_HTTPD_SSI 1 |
||||
#include "../httpd_structs.h" |
||||
|
||||
#include "../core/inet_chksum.c" |
||||
#include "../core/def.c" |
||||
|
||||
/** (Your server name here) */ |
||||
const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n"; |
||||
|
||||
/* change this to suit your MEM_ALIGNMENT */ |
||||
#define PAYLOAD_ALIGNMENT 4 |
||||
/* set this to 0 to prevent aligning payload */ |
||||
#define ALIGN_PAYLOAD 1 |
||||
/* define this to a type that has the required alignment */ |
||||
#define PAYLOAD_ALIGN_TYPE "unsigned int" |
||||
static int payload_alingment_dummy_counter = 0; |
||||
|
||||
#define HEX_BYTES_PER_LINE 16 |
||||
|
||||
#define MAX_PATH_LEN 256 |
||||
|
||||
#define COPY_BUFSIZE 10240 |
||||
|
||||
struct file_entry |
||||
{ |
||||
struct file_entry* next; |
||||
const char* filename_c; |
||||
}; |
||||
|
||||
int process_sub(FILE *data_file, FILE *struct_file); |
||||
int process_file(FILE *data_file, FILE *struct_file, const char *filename); |
||||
int file_write_http_header(FILE *data_file, const char *filename, int file_size, |
||||
u16_t *http_hdr_len, u16_t *http_hdr_chksum); |
||||
int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i); |
||||
int s_put_ascii(char *buf, const char *ascii_string, int len, int *i); |
||||
void concat_files(const char *file1, const char *file2, const char *targetfile); |
||||
int check_path(char* path, size_t size); |
||||
|
||||
static unsigned char file_buffer_raw[COPY_BUFSIZE]; |
||||
/* 5 bytes per char + 3 bytes per line */ |
||||
static char file_buffer_c[COPY_BUFSIZE * 5 + ((COPY_BUFSIZE / HEX_BYTES_PER_LINE) * 3)]; |
||||
|
||||
char curSubdir[MAX_PATH_LEN]; |
||||
char lastFileVar[MAX_PATH_LEN]; |
||||
char hdr_buf[4096]; |
||||
|
||||
unsigned char processSubs = 1; |
||||
unsigned char includeHttpHeader = 1; |
||||
unsigned char useHttp11 = 0; |
||||
unsigned char supportSsi = 1; |
||||
unsigned char precalcChksum = 0; |
||||
|
||||
struct file_entry* first_file = NULL; |
||||
struct file_entry* last_file = NULL; |
||||
|
||||
static void print_usage(void) |
||||
{ |
||||
printf(" Usage: htmlgen [targetdir] [-s] [-i] [-f:<filename>]" NEWLINE NEWLINE); |
||||
printf(" targetdir: relative or absolute path to files to convert" NEWLINE); |
||||
printf(" switch -s: toggle processing of subdirectories (default is on)" NEWLINE); |
||||
printf(" switch -e: exclude HTTP header from file (header is created at runtime, default is off)" NEWLINE); |
||||
printf(" switch -11: include HTTP 1.1 header (1.0 is default)" NEWLINE); |
||||
printf(" switch -nossi: no support for SSI (cannot calculate Content-Length for SSI)" NEWLINE); |
||||
printf(" switch -c: precalculate checksums for all pages (default is off)" NEWLINE); |
||||
printf(" switch -f: target filename (default is \"fsdata.c\")" NEWLINE); |
||||
printf(" if targetdir not specified, htmlgen will attempt to" NEWLINE); |
||||
printf(" process files in subdirectory 'fs'" NEWLINE); |
||||
} |
||||
|
||||
int main(int argc, char *argv[]) |
||||
{ |
||||
char path[MAX_PATH_LEN]; |
||||
char appPath[MAX_PATH_LEN]; |
||||
FILE *data_file; |
||||
FILE *struct_file; |
||||
int filesProcessed; |
||||
int i; |
||||
char targetfile[MAX_PATH_LEN]; |
||||
strcpy(targetfile, "fsdata.c"); |
||||
|
||||
memset(path, 0, sizeof(path)); |
||||
memset(appPath, 0, sizeof(appPath)); |
||||
|
||||
printf(NEWLINE " makefsdata - HTML to C source converter" NEWLINE); |
||||
printf(" by Jim Pettinato - circa 2003 " NEWLINE); |
||||
printf(" extended by Simon Goldschmidt - 2009 " NEWLINE NEWLINE); |
||||
|
||||
strcpy(path, "fs"); |
||||
for(i = 1; i < argc; i++) { |
||||
if (argv[i] == NULL) { |
||||
continue; |
||||
} |
||||
if (argv[i][0] == '-') { |
||||
if (strstr(argv[i], "-s")) { |
||||
processSubs = 0; |
||||
} else if (strstr(argv[i], "-e")) { |
||||
includeHttpHeader = 0; |
||||
} else if (strstr(argv[i], "-11")) { |
||||
useHttp11 = 1; |
||||
} else if (strstr(argv[i], "-nossi")) { |
||||
supportSsi = 0; |
||||
} else if (strstr(argv[i], "-c")) { |
||||
precalcChksum = 1; |
||||
} else if((argv[i][1] == 'f') && (argv[i][2] == ':')) { |
||||
strncpy(targetfile, &argv[i][3], sizeof(targetfile) - 1); |
||||
targetfile[sizeof(targetfile) - 1] = 0; |
||||
printf("Writing to file \"%s\"\n", targetfile); |
||||
} else if ((strstr(argv[i], "-?")) || (strstr(argv[i], "-h"))) { |
||||
print_usage(); |
||||
exit(0); |
||||
} |
||||
} else if ((argv[i][0] == '/') && (argv[i][1] == '?') && (argv[i][2] == 0)) { |
||||
print_usage(); |
||||
exit(0); |
||||
} else { |
||||
strncpy(path, argv[i], sizeof(path)-1); |
||||
path[sizeof(path)-1] = 0; |
||||
} |
||||
} |
||||
|
||||
if(!check_path(path, sizeof(path))) { |
||||
printf("Invalid path: \"%s\"." NEWLINE, path); |
||||
exit(-1); |
||||
} |
||||
|
||||
GETCWD(appPath, MAX_PATH_LEN); |
||||
/* if command line param or subdir named 'fs' not found spout usage verbiage */ |
||||
if (!CHDIR_SUCCEEDED(CHDIR(path))) { |
||||
/* if no subdir named 'fs' (or the one which was given) exists, spout usage verbiage */ |
||||
printf(" Failed to open directory \"%s\"." NEWLINE NEWLINE, path); |
||||
print_usage(); |
||||
exit(-1); |
||||
} |
||||
CHDIR(appPath); |
||||
|
||||
printf("HTTP %sheader will %s statically included." NEWLINE, |
||||
(includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""), |
||||
(includeHttpHeader ? "be" : "not be")); |
||||
|
||||
sprintf(curSubdir, ""); /* start off in web page's root directory - relative paths */ |
||||
printf(" Processing all files in directory %s", path); |
||||
if (processSubs) { |
||||
printf(" and subdirectories..." NEWLINE NEWLINE); |
||||
} else { |
||||
printf("..." NEWLINE NEWLINE); |
||||
} |
||||
|
||||
data_file = fopen("fsdata.tmp", "wb"); |
||||
if (data_file == NULL) { |
||||
printf("Failed to create file \"fsdata.tmp\"\n"); |
||||
exit(-1); |
||||
} |
||||
struct_file = fopen("fshdr.tmp", "wb"); |
||||
if (struct_file == NULL) { |
||||
printf("Failed to create file \"fshdr.tmp\"\n"); |
||||
fclose(data_file); |
||||
exit(-1); |
||||
} |
||||
|
||||
CHDIR(path); |
||||
|
||||
fprintf(data_file, "#include \"fs.h\"" NEWLINE); |
||||
fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE); |
||||
fprintf(data_file, "#include \"fsdata.h\"" NEWLINE NEWLINE NEWLINE); |
||||
|
||||
fprintf(data_file, "#define file_NULL (struct fsdata_file *) NULL" NEWLINE NEWLINE NEWLINE); |
||||
|
||||
sprintf(lastFileVar, "NULL"); |
||||
|
||||
filesProcessed = process_sub(data_file, struct_file); |
||||
|
||||
/* data_file now contains all of the raw data.. now append linked list of
|
||||
* file header structs to allow embedded app to search for a file name */ |
||||
fprintf(data_file, NEWLINE NEWLINE); |
||||
fprintf(struct_file, "#define FS_ROOT file_%s" NEWLINE, lastFileVar); |
||||
fprintf(struct_file, "#define FS_NUMFILES %d" NEWLINE NEWLINE, filesProcessed); |
||||
|
||||
fclose(data_file); |
||||
fclose(struct_file); |
||||
|
||||
CHDIR(appPath); |
||||
/* append struct_file to data_file */ |
||||
printf(NEWLINE "Creating target file..." NEWLINE NEWLINE); |
||||
concat_files("fsdata.tmp", "fshdr.tmp", targetfile); |
||||
|
||||
/* if succeeded, delete the temporary files */ |
||||
if (remove("fsdata.tmp") != 0) { |
||||
printf("Warning: failed to delete fsdata.tmp\n"); |
||||
} |
||||
if (remove("fshdr.tmp") != 0) { |
||||
printf("Warning: failed to delete fshdr.tmp\n"); |
||||
} |
||||
|
||||
printf(NEWLINE "Processed %d files - done." NEWLINE NEWLINE, filesProcessed); |
||||
|
||||
while (first_file != NULL) { |
||||
struct file_entry* fe = first_file; |
||||
first_file = fe->next; |
||||
free(fe); |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int check_path(char* path, size_t size) |
||||
{ |
||||
size_t slen; |
||||
if (path[0] == 0) { |
||||
/* empty */ |
||||
return 0; |
||||
} |
||||
slen = strlen(path); |
||||
if (slen >= size) { |
||||
/* not NULL-terminated */ |
||||
return 0; |
||||
} |
||||
while ((slen > 0) && ((path[slen] == '\\') || (path[slen] == '/'))) { |
||||
/* path should not end with trailing backslash */ |
||||
path[slen] = 0; |
||||
slen--; |
||||
} |
||||
if (slen == 0) { |
||||
return 0; |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
static void copy_file(const char *filename_in, FILE *fout) |
||||
{ |
||||
FILE *fin; |
||||
size_t len; |
||||
fin = fopen(filename_in, "rb"); |
||||
if (fin == NULL) { |
||||
printf("Failed to open file \"%s\"\n", filename_in); |
||||
exit(-1); |
||||
} |
||||
|
||||
while((len = fread(file_buffer_raw, 1, COPY_BUFSIZE, fin)) > 0) |
||||
{ |
||||
fwrite(file_buffer_raw, 1, len, fout); |
||||
} |
||||
fclose(fin); |
||||
} |
||||
|
||||
void concat_files(const char *file1, const char *file2, const char *targetfile) |
||||
{ |
||||
FILE *fout; |
||||
fout = fopen(targetfile, "wb"); |
||||
if (fout == NULL) { |
||||
printf("Failed to open file \"%s\"\n", targetfile); |
||||
exit(-1); |
||||
} |
||||
copy_file(file1, fout); |
||||
copy_file(file2, fout); |
||||
fclose(fout); |
||||
} |
||||
|
||||
int process_sub(FILE *data_file, FILE *struct_file) |
||||
{ |
||||
FIND_T fInfo; |
||||
FIND_RET_T fret; |
||||
int filesProcessed = 0; |
||||
|
||||
if (processSubs) { |
||||
/* process subs recursively */ |
||||
size_t sublen = strlen(curSubdir); |
||||
size_t freelen = sizeof(curSubdir) - sublen - 1; |
||||
LWIP_ASSERT("sublen < sizeof(curSubdir)", sublen < sizeof(curSubdir)); |
||||
fret = FINDFIRST_DIR("*", &fInfo); |
||||
if (FINDFIRST_SUCCEEDED(fret)) { |
||||
do { |
||||
const char *curName = FIND_T_FILENAME(fInfo); |
||||
if ((curName[0] == '.') || (strcmp(curName, "CVS") == 0)) { |
||||
continue; |
||||
} |
||||
if (!FIND_T_IS_DIR(fInfo)) { |
||||
continue; |
||||
} |
||||
if (freelen > 0) { |
||||
CHDIR(curName); |
||||
strncat(curSubdir, "/", freelen); |
||||
strncat(curSubdir, curName, freelen - 1); |
||||
curSubdir[sizeof(curSubdir) - 1] = 0; |
||||
printf(NEWLINE "processing subdirectory %s/..." NEWLINE, curSubdir); |
||||
filesProcessed += process_sub(data_file, struct_file); |
||||
CHDIR(".."); |
||||
curSubdir[sublen] = 0; |
||||
} else { |
||||
printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, curName); |
||||
} |
||||
} while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo))); |
||||
} |
||||
} |
||||
|
||||
fret = FINDFIRST_FILE("*.*", &fInfo); |
||||
if (FINDFIRST_SUCCEEDED(fret)) { |
||||
/* at least one file in directory */ |
||||
do { |
||||
if (FIND_T_IS_FILE(fInfo)) { |
||||
const char *curName = FIND_T_FILENAME(fInfo); |
||||
printf("processing %s/%s..." NEWLINE, curSubdir, curName); |
||||
if (process_file(data_file, struct_file, curName) < 0) { |
||||
printf(NEWLINE "Error... aborting" NEWLINE); |
||||
return -1; |
||||
} |
||||
filesProcessed++; |
||||
} |
||||
} while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo))); |
||||
} |
||||
return filesProcessed; |
||||
} |
||||
|
||||
int get_file_size(const char* filename) |
||||
{ |
||||
FILE *inFile; |
||||
int file_size = -1; |
||||
inFile = fopen(filename, "rb"); |
||||
if (inFile == NULL) { |
||||
printf("Failed to open file \"%s\"\n", filename); |
||||
exit(-1); |
||||
} |
||||
fseek(inFile, 0, SEEK_END); |
||||
file_size = ftell(inFile); |
||||
fclose(inFile); |
||||
return file_size; |
||||
} |
||||
|
||||
void process_file_data(const char *filename, FILE *data_file) |
||||
{ |
||||
FILE *source_file; |
||||
size_t len, written, i, src_off=0; |
||||
|
||||
source_file = fopen(filename, "rb"); |
||||
if (source_file == NULL) { |
||||
printf("Failed to open file \"%s\"\n", filename); |
||||
exit(-1); |
||||
} |
||||
|
||||
do { |
||||
size_t off = 0; |
||||
len = fread(file_buffer_raw, 1, COPY_BUFSIZE, source_file); |
||||
if (len > 0) { |
||||
for (i = 0; i < len; i++) { |
||||
sprintf(&file_buffer_c[off], "0x%02.2x,", file_buffer_raw[i]); |
||||
off += 5; |
||||
if ((++src_off % HEX_BYTES_PER_LINE) == 0) { |
||||
memcpy(&file_buffer_c[off], NEWLINE, NEWLINE_LEN); |
||||
off += NEWLINE_LEN; |
||||
} |
||||
} |
||||
written = fwrite(file_buffer_c, 1, off, data_file); |
||||
} |
||||
} while(len > 0); |
||||
fclose(source_file); |
||||
} |
||||
|
||||
int write_checksums(FILE *struct_file, const char *filename, const char *varname, |
||||
u16_t hdr_len, u16_t hdr_chksum) |
||||
{ |
||||
int chunk_size = TCP_MSS; |
||||
int offset; |
||||
size_t len; |
||||
int i = 0; |
||||
FILE *f; |
||||
#if LWIP_TCP_TIMESTAMPS |
||||
/* when timestamps are used, usable space is 12 bytes less per segment */ |
||||
chunk_size -= 12; |
||||
#endif |
||||
|
||||
fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE); |
||||
fprintf(struct_file, "const struct fsdata_chksum chksums_%s[] = {" NEWLINE, varname); |
||||
|
||||
memset(file_buffer_raw, 0xab, sizeof(file_buffer_raw)); |
||||
f = fopen(filename, "rb"); |
||||
if (f == NULL) { |
||||
printf("Failed to open file \"%s\"\n", filename); |
||||
exit(-1); |
||||
} |
||||
if (hdr_len > 0) { |
||||
/* add checksum for HTTP header */ |
||||
fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, 0, hdr_chksum, hdr_len); |
||||
i++; |
||||
} |
||||
for (offset = hdr_len; ; offset += len) { |
||||
unsigned short chksum; |
||||
len = fread(file_buffer_raw, 1, chunk_size, f); |
||||
if (len == 0) { |
||||
break; |
||||
} |
||||
chksum = ~inet_chksum(file_buffer_raw, (u16_t)len); |
||||
/* add checksum for data */ |
||||
fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, offset, chksum, len); |
||||
i++; |
||||
} |
||||
fclose(f); |
||||
fprintf(struct_file, "};" NEWLINE); |
||||
fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE); |
||||
return i; |
||||
} |
||||
|
||||
static int is_valid_char_for_c_var(char x) |
||||
{ |
||||
if (((x >= 'A') && (x <= 'Z')) || |
||||
((x >= 'a') && (x <= 'z')) || |
||||
((x >= '0') && (x <= '9')) || |
||||
(x == '_')) |
||||
{ |
||||
return 1; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
static void fix_filename_for_c(char* qualifiedName, size_t max_len) |
||||
{ |
||||
struct file_entry* f; |
||||
size_t len = strlen(qualifiedName); |
||||
char *new_name = malloc(len + 2); |
||||
int filename_ok; |
||||
int cnt = 0; |
||||
size_t i; |
||||
if (len + 3 == max_len) { |
||||
printf("File name too long: \"%s\"\n", qualifiedName); |
||||
exit(-1); |
||||
} |
||||
strcpy(new_name, qualifiedName); |
||||
for (i = 0; i < len; i++) { |
||||
if (!is_valid_char_for_c_var(new_name[i])) { |
||||
new_name[i] = '_'; |
||||
} |
||||
} |
||||
do { |
||||
filename_ok = 1; |
||||
for (f = first_file; f != NULL; f = f->next) { |
||||
if (!strcmp(f->filename_c, new_name)) { |
||||
filename_ok = 0; |
||||
cnt++; |
||||
// try next unique file name
|
||||
sprintf(&new_name[len], "%d", cnt); |
||||
break; |
||||
} |
||||
} |
||||
} while (!filename_ok && (cnt < 999)); |
||||
if (!filename_ok) { |
||||
printf("Failed to get unique file name: \"%s\"\n", qualifiedName); |
||||
exit(-1); |
||||
} |
||||
strcpy(qualifiedName, new_name); |
||||
free(new_name); |
||||
} |
||||
|
||||
static void register_filename(const char* qualifiedName) |
||||
{ |
||||
struct file_entry* fe = malloc(sizeof(struct file_entry)); |
||||
fe->filename_c = strdup(qualifiedName); |
||||
fe->next = NULL; |
||||
if (first_file == NULL) { |
||||
first_file = last_file = fe; |
||||
} else { |
||||
last_file->next = fe; |
||||
last_file = fe; |
||||
} |
||||
} |
||||
|
||||
int process_file(FILE *data_file, FILE *struct_file, const char *filename) |
||||
{ |
||||
char varname[MAX_PATH_LEN]; |
||||
int i = 0; |
||||
char qualifiedName[MAX_PATH_LEN]; |
||||
int file_size; |
||||
u16_t http_hdr_chksum = 0; |
||||
u16_t http_hdr_len = 0; |
||||
int chksum_count = 0; |
||||
|
||||
/* create qualified name (TODO: prepend slash or not?) */ |
||||
sprintf(qualifiedName,"%s/%s", curSubdir, filename); |
||||
/* create C variable name */ |
||||
strcpy(varname, qualifiedName); |
||||
/* convert slashes & dots to underscores */ |
||||
fix_filename_for_c(varname, MAX_PATH_LEN); |
||||
register_filename(varname); |
||||
#if ALIGN_PAYLOAD |
||||
/* to force even alignment of array */ |
||||
fprintf(data_file, "static const " PAYLOAD_ALIGN_TYPE " dummy_align_%s = %d;" NEWLINE, varname, payload_alingment_dummy_counter++); |
||||
#endif /* ALIGN_PAYLOAD */ |
||||
fprintf(data_file, "static const unsigned char data_%s[] = {" NEWLINE, varname); |
||||
/* encode source file name (used by file system, not returned to browser) */ |
||||
fprintf(data_file, "/* %s (%d chars) */" NEWLINE, qualifiedName, strlen(qualifiedName)+1); |
||||
file_put_ascii(data_file, qualifiedName, strlen(qualifiedName)+1, &i); |
||||
#if ALIGN_PAYLOAD |
||||
/* pad to even number of bytes to assure payload is on aligned boundary */ |
||||
while(i % PAYLOAD_ALIGNMENT != 0) { |
||||
fprintf(data_file, "0x%02.2x,", 0); |
||||
i++; |
||||
} |
||||
#endif /* ALIGN_PAYLOAD */ |
||||
fprintf(data_file, NEWLINE); |
||||
|
||||
file_size = get_file_size(filename); |
||||
if (includeHttpHeader) { |
||||
file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum); |
||||
} |
||||
if (precalcChksum) { |
||||
chksum_count = write_checksums(struct_file, filename, varname, http_hdr_len, http_hdr_chksum); |
||||
} |
||||
|
||||
/* build declaration of struct fsdata_file in temp file */ |
||||
fprintf(struct_file, "const struct fsdata_file file_%s[] = { {" NEWLINE, varname); |
||||
fprintf(struct_file, "file_%s," NEWLINE, lastFileVar); |
||||
fprintf(struct_file, "data_%s," NEWLINE, varname); |
||||
fprintf(struct_file, "data_%s + %d," NEWLINE, varname, i); |
||||
fprintf(struct_file, "sizeof(data_%s) - %d," NEWLINE, varname, i); |
||||
fprintf(struct_file, "%d," NEWLINE, includeHttpHeader); |
||||
if (precalcChksum) { |
||||
fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE); |
||||
fprintf(struct_file, "%d, chksums_%s," NEWLINE, chksum_count, varname); |
||||
fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE); |
||||
} |
||||
fprintf(struct_file, "}};" NEWLINE NEWLINE); |
||||
strcpy(lastFileVar, varname); |
||||
|
||||
/* write actual file contents */ |
||||
i = 0; |
||||
fprintf(data_file, NEWLINE "/* raw file data (%d bytes) */" NEWLINE, file_size); |
||||
process_file_data(filename, data_file); |
||||
fprintf(data_file, "};" NEWLINE NEWLINE); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int file_write_http_header(FILE *data_file, const char *filename, int file_size, |
||||
u16_t *http_hdr_len, u16_t *http_hdr_chksum) |
||||
{ |
||||
int i = 0; |
||||
int response_type = HTTP_HDR_OK; |
||||
const char* file_type; |
||||
const char *cur_string; |
||||
size_t cur_len; |
||||
int written = 0; |
||||
size_t hdr_len = 0; |
||||
u16_t acc; |
||||
const char *file_ext; |
||||
int j; |
||||
u8_t keepalive = useHttp11; |
||||
|
||||
if (keepalive) { |
||||
size_t loop; |
||||
for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { |
||||
if (strstr(filename, g_pcSSIExtensions[loop])) { |
||||
/* no keepalive connection for SSI files */ |
||||
keepalive = 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
memset(hdr_buf, 0, sizeof(hdr_buf)); |
||||
|
||||
if (useHttp11) { |
||||
response_type = HTTP_HDR_OK_11; |
||||
} |
||||
|
||||
fprintf(data_file, NEWLINE "/* HTTP header */"); |
||||
if (strstr(filename, "404") == filename) { |
||||
response_type = HTTP_HDR_NOT_FOUND; |
||||
if (useHttp11) { |
||||
response_type = HTTP_HDR_NOT_FOUND_11; |
||||
} |
||||
} else if (strstr(filename, "400") == filename) { |
||||
response_type = HTTP_HDR_BAD_REQUEST; |
||||
if (useHttp11) { |
||||
response_type = HTTP_HDR_BAD_REQUEST_11; |
||||
} |
||||
} else if (strstr(filename, "501") == filename) { |
||||
response_type = HTTP_HDR_NOT_IMPL; |
||||
if (useHttp11) { |
||||
response_type = HTTP_HDR_NOT_IMPL_11; |
||||
} |
||||
} |
||||
cur_string = g_psHTTPHeaderStrings[response_type]; |
||||
cur_len = strlen(cur_string); |
||||
fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); |
||||
written += file_put_ascii(data_file, cur_string, cur_len, &i); |
||||
i = 0; |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], cur_string, cur_len); |
||||
hdr_len += cur_len; |
||||
} |
||||
|
||||
cur_string = serverID; |
||||
cur_len = strlen(cur_string); |
||||
fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); |
||||
written += file_put_ascii(data_file, cur_string, cur_len, &i); |
||||
i = 0; |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], cur_string, cur_len); |
||||
hdr_len += cur_len; |
||||
} |
||||
|
||||
file_ext = filename; |
||||
if (file_ext != NULL) { |
||||
while(strstr(file_ext, ".") != NULL) { |
||||
file_ext = strstr(file_ext, "."); |
||||
file_ext++; |
||||
} |
||||
} |
||||
if((file_ext == NULL) || (*file_ext == 0)) { |
||||
printf("failed to get extension for file \"%s\", using default.\n", filename); |
||||
file_type = HTTP_HDR_DEFAULT_TYPE; |
||||
} else { |
||||
file_type = NULL; |
||||
for(j = 0; j < NUM_HTTP_HEADERS; j++) { |
||||
if(!strcmp(file_ext, g_psHTTPHeaders[j].extension)) { |
||||
file_type = g_psHTTPHeaders[j].content_type; |
||||
break; |
||||
} |
||||
} |
||||
if (file_type == NULL) { |
||||
printf("failed to get file type for extension \"%s\", using default.\n", file_ext); |
||||
file_type = HTTP_HDR_DEFAULT_TYPE; |
||||
} |
||||
} |
||||
|
||||
if (useHttp11) { |
||||
char intbuf[MAX_PATH_LEN]; |
||||
int content_len = file_size; |
||||
memset(intbuf, 0, sizeof(intbuf)); |
||||
|
||||
if (!keepalive) { |
||||
content_len *= 2; |
||||
} |
||||
{ |
||||
cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH]; |
||||
cur_len = strlen(cur_string); |
||||
fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%d+ bytes) */" NEWLINE, cur_string, content_len, cur_len+2); |
||||
written += file_put_ascii(data_file, cur_string, cur_len, &i); |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], cur_string, cur_len); |
||||
hdr_len += cur_len; |
||||
} |
||||
|
||||
_itoa(content_len, intbuf, 10); |
||||
strcat(intbuf, "\r\n"); |
||||
cur_len = strlen(intbuf); |
||||
written += file_put_ascii(data_file, intbuf, cur_len, &i); |
||||
i = 0; |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], intbuf, cur_len); |
||||
hdr_len += cur_len; |
||||
} |
||||
} |
||||
|
||||
if (keepalive) { |
||||
cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_KEEPALIVE]; |
||||
} else { |
||||
cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE]; |
||||
} |
||||
cur_len = strlen(cur_string); |
||||
fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); |
||||
written += file_put_ascii(data_file, cur_string, cur_len, &i); |
||||
i = 0; |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], cur_string, cur_len); |
||||
hdr_len += cur_len; |
||||
} |
||||
} |
||||
|
||||
cur_string = file_type; |
||||
cur_len = strlen(cur_string); |
||||
fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); |
||||
written += file_put_ascii(data_file, cur_string, cur_len, &i); |
||||
i = 0; |
||||
if (precalcChksum) { |
||||
memcpy(&hdr_buf[hdr_len], cur_string, cur_len); |
||||
hdr_len += cur_len; |
||||
|
||||
LWIP_ASSERT("hdr_len <= 0xffff", hdr_len <= 0xffff); |
||||
LWIP_ASSERT("strlen(hdr_buf) == hdr_len", strlen(hdr_buf) == hdr_len); |
||||
acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len); |
||||
*http_hdr_len = (u16_t)hdr_len; |
||||
*http_hdr_chksum = acc; |
||||
} |
||||
|
||||
return written; |
||||
} |
||||
|
||||
int file_put_ascii(FILE *file, const char* ascii_string, int len, int *i) |
||||
{ |
||||
int x; |
||||
for(x = 0; x < len; x++) { |
||||
unsigned char cur = ascii_string[x]; |
||||
fprintf(file, "0x%02.2x,", cur); |
||||
if ((++(*i) % HEX_BYTES_PER_LINE) == 0) { |
||||
fprintf(file, NEWLINE); |
||||
} |
||||
} |
||||
return len; |
||||
} |
||||
|
||||
int s_put_ascii(char *buf, const char *ascii_string, int len, int *i) |
||||
{ |
||||
int x; |
||||
int idx = 0; |
||||
for(x = 0; x < len; x++) { |
||||
unsigned char cur = ascii_string[x]; |
||||
sprintf(&buf[idx], "0x%02.2x,", cur); |
||||
idx += 5; |
||||
if ((++(*i) % HEX_BYTES_PER_LINE) == 0) { |
||||
sprintf(&buf[idx], NEWLINE); |
||||
idx += NEWLINE_LEN; |
||||
} |
||||
} |
||||
return len; |
||||
} |
||||
@ -0,0 +1,13 @@
|
||||
This directory contains a script ('makefsdata') to create C code suitable for |
||||
httpd for given html pages (or other files) in a directory. |
||||
|
||||
There is also a plain C console application doing the same and extended a bit. |
||||
|
||||
Usage: htmlgen [targetdir] [-s] [-i]s |
||||
targetdir: relative or absolute path to files to convert |
||||
switch -s: toggle processing of subdirectories (default is on) |
||||
switch -e: exclude HTTP header from file (header is created at runtime, default is on) |
||||
switch -11: include HTTP 1.1 header (1.0 is default) |
||||
|
||||
if targetdir not specified, makefsdata will attempt to |
||||
process files in subdirectory 'fs'. |
||||
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_FS_H |
||||
#define LWIP_FS_H |
||||
|
||||
#include "httpd_opts.h" |
||||
#include "lwip/err.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#define FS_READ_EOF -1 |
||||
#define FS_READ_DELAYED -2 |
||||
|
||||
#if HTTPD_PRECALCULATED_CHECKSUM |
||||
struct fsdata_chksum { |
||||
u32_t offset; |
||||
u16_t chksum; |
||||
u16_t len; |
||||
}; |
||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */ |
||||
|
||||
struct fs_file { |
||||
const char *data; |
||||
int len; |
||||
int index; |
||||
void *pextension; |
||||
#if HTTPD_PRECALCULATED_CHECKSUM |
||||
const struct fsdata_chksum *chksum; |
||||
u16_t chksum_count; |
||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */ |
||||
u8_t http_header_included; |
||||
#if LWIP_HTTPD_CUSTOM_FILES |
||||
u8_t is_custom_file; |
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */ |
||||
#if LWIP_HTTPD_FILE_STATE |
||||
void *state; |
||||
#endif /* LWIP_HTTPD_FILE_STATE */ |
||||
}; |
||||
|
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
typedef void (*fs_wait_cb)(void *arg); |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
|
||||
err_t fs_open(struct fs_file *file, const char *name); |
||||
void fs_close(struct fs_file *file); |
||||
#if LWIP_HTTPD_DYNAMIC_FILE_READ |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
int fs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg); |
||||
#else /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
int fs_read(struct fs_file *file, char *buffer, int count); |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */ |
||||
#if LWIP_HTTPD_FS_ASYNC_READ |
||||
int fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg); |
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */ |
||||
int fs_bytes_left(struct fs_file *file); |
||||
|
||||
#if LWIP_HTTPD_FILE_STATE |
||||
/** This user-defined function is called when a file is opened. */ |
||||
void *fs_state_init(struct fs_file *file, const char *name); |
||||
/** This user-defined function is called when a file is closed. */ |
||||
void fs_state_free(struct fs_file *file, void *state); |
||||
#endif /* #if LWIP_HTTPD_FILE_STATE */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* LWIP_FS_H */ |
||||
@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without modification, |
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT |
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY |
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
* |
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
* This version of the file has been modified by Texas Instruments to offer |
||||
* simple server-side-include (SSI) and Common Gateway Interface (CGI) |
||||
* capability. |
||||
*/ |
||||
|
||||
#ifndef LWIP_HTTPD_H |
||||
#define LWIP_HTTPD_H |
||||
|
||||
#include "httpd_opts.h" |
||||
#include "lwip/err.h" |
||||
#include "lwip/pbuf.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#if LWIP_HTTPD_CGI |
||||
|
||||
/*
|
||||
* Function pointer for a CGI script handler. |
||||
* |
||||
* This function is called each time the HTTPD server is asked for a file |
||||
* whose name was previously registered as a CGI function using a call to |
||||
* http_set_cgi_handler. The iIndex parameter provides the index of the |
||||
* CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters |
||||
* pcParam and pcValue provide access to the parameters provided along with |
||||
* the URI. iNumParams provides a count of the entries in the pcParam and |
||||
* pcValue arrays. Each entry in the pcParam array contains the name of a |
||||
* parameter with the corresponding entry in the pcValue array containing the |
||||
* value for that parameter. Note that pcParam may contain multiple elements |
||||
* with the same name if, for example, a multi-selection list control is used |
||||
* in the form generating the data. |
||||
* |
||||
* The function should return a pointer to a character string which is the |
||||
* path and filename of the response that is to be sent to the connected |
||||
* browser, for example "/thanks.htm" or "/response/error.ssi". |
||||
* |
||||
* The maximum number of parameters that will be passed to this function via |
||||
* iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming |
||||
* HTTP request above this number will be discarded. |
||||
* |
||||
* Requests intended for use by this CGI mechanism must be sent using the GET |
||||
* method (which encodes all parameters within the URI rather than in a block |
||||
* later in the request). Attempts to use the POST method will result in the |
||||
* request being ignored. |
||||
* |
||||
*/ |
||||
typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[], |
||||
char *pcValue[]); |
||||
|
||||
/*
|
||||
* Structure defining the base filename (URL) of a CGI and the associated |
||||
* function which is to be called when that URL is requested. |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
const char *pcCGIName; |
||||
tCGIHandler pfnCGIHandler; |
||||
} tCGI; |
||||
|
||||
void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers); |
||||
|
||||
#endif /* LWIP_HTTPD_CGI */ |
||||
|
||||
#if LWIP_HTTPD_SSI |
||||
|
||||
/*
|
||||
* Function pointer for the SSI tag handler callback. |
||||
* |
||||
* This function will be called each time the HTTPD server detects a tag of the |
||||
* form <!--#name--> in a .shtml, .ssi or .shtm file where "name" appears as |
||||
* one of the tags supplied to http_set_ssi_handler in the ppcTags array. The |
||||
* returned insert string, which will be appended after the the string |
||||
* "<!--#name-->" in file sent back to the client,should be written to pointer |
||||
* pcInsert. iInsertLen contains the size of the buffer pointed to by |
||||
* pcInsert. The iIndex parameter provides the zero-based index of the tag as |
||||
* found in the ppcTags array and identifies the tag that is to be processed. |
||||
* |
||||
* The handler returns the number of characters written to pcInsert excluding |
||||
* any terminating NULL or a negative number to indicate a failure (tag not |
||||
* recognized, for example). |
||||
* |
||||
* Note that the behavior of this SSI mechanism is somewhat different from the |
||||
* "normal" SSI processing as found in, for example, the Apache web server. In |
||||
* this case, the inserted text is appended following the SSI tag rather than |
||||
* replacing the tag entirely. This allows for an implementation that does not |
||||
* require significant additional buffering of output data yet which will still |
||||
* offer usable SSI functionality. One downside to this approach is when |
||||
* attempting to use SSI within JavaScript. The SSI tag is structured to |
||||
* resemble an HTML comment but this syntax does not constitute a comment |
||||
* within JavaScript and, hence, leaving the tag in place will result in |
||||
* problems in these cases. To work around this, any SSI tag which needs to |
||||
* output JavaScript code must do so in an encapsulated way, sending the whole |
||||
* HTML <script>...</script> section as a single include. |
||||
*/ |
||||
typedef u16_t (*tSSIHandler)(int iIndex, char *pcInsert, int iInsertLen |
||||
#if LWIP_HTTPD_SSI_MULTIPART |
||||
, u16_t current_tag_part, u16_t *next_tag_part |
||||
#endif /* LWIP_HTTPD_SSI_MULTIPART */ |
||||
#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE |
||||
, void *connection_state |
||||
#endif /* LWIP_HTTPD_FILE_STATE */ |
||||
); |
||||
|
||||
void http_set_ssi_handler(tSSIHandler pfnSSIHandler, |
||||
const char **ppcTags, int iNumTags); |
||||
|
||||
#endif /* LWIP_HTTPD_SSI */ |
||||
|
||||
#if LWIP_HTTPD_SUPPORT_POST |
||||
|
||||
/* These functions must be implemented by the application */ |
||||
|
||||
/** Called when a POST request has been received. The application can decide
|
||||
* whether to accept it or not. |
||||
* |
||||
* @param connection Unique connection identifier, valid until httpd_post_end |
||||
* is called. |
||||
* @param uri The HTTP header URI receiving the POST request. |
||||
* @param http_request The raw HTTP request (the first packet, normally). |
||||
* @param http_request_len Size of 'http_request'. |
||||
* @param content_len Content-Length from HTTP header. |
||||
* @param response_uri Filename of response file, to be filled when denying the |
||||
* request |
||||
* @param response_uri_len Size of the 'response_uri' buffer. |
||||
* @param post_auto_wnd Set this to 0 to let the callback code handle window |
||||
* updates by calling 'httpd_post_data_recved' (to throttle rx speed) |
||||
* default is 1 (httpd handles window updates automatically) |
||||
* @return ERR_OK: Accept the POST request, data may be passed in |
||||
* another err_t: Deny the POST request, send back 'bad request'. |
||||
*/ |
||||
err_t httpd_post_begin(void *connection, const char *uri, const char *http_request, |
||||
u16_t http_request_len, int content_len, char *response_uri, |
||||
u16_t response_uri_len, u8_t *post_auto_wnd); |
||||
|
||||
/** Called for each pbuf of data that has been received for a POST.
|
||||
* ATTENTION: The application is responsible for freeing the pbufs passed in! |
||||
* |
||||
* @param connection Unique connection identifier. |
||||
* @param p Received data. |
||||
* @return ERR_OK: Data accepted. |
||||
* another err_t: Data denied, http_post_get_response_uri will be called. |
||||
*/ |
||||
err_t httpd_post_receive_data(void *connection, struct pbuf *p); |
||||
|
||||
/** Called when all data is received or when the connection is closed.
|
||||
* The application must return the filename/URI of a file to send in response |
||||
* to this POST request. If the response_uri buffer is untouched, a 404 |
||||
* response is returned. |
||||
* |
||||
* @param connection Unique connection identifier. |
||||
* @param response_uri Filename of response file, to be filled when denying the request |
||||
* @param response_uri_len Size of the 'response_uri' buffer. |
||||
*/ |
||||
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len); |
||||
|
||||
#if LWIP_HTTPD_POST_MANUAL_WND |
||||
void httpd_post_data_recved(void *connection, u16_t recved_len); |
||||
#endif /* LWIP_HTTPD_POST_MANUAL_WND */ |
||||
|
||||
#endif /* LWIP_HTTPD_SUPPORT_POST */ |
||||
|
||||
void httpd_init(void); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* LWIP_HTTPD_H */ |
||||
@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without modification, |
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT |
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY |
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
* |
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
* This version of the file has been modified by Texas Instruments to offer |
||||
* simple server-side-include (SSI) and Common Gateway Interface (CGI) |
||||
* capability. |
||||
*/ |
||||
|
||||
#ifndef LWIP_HTTPD_OPTS_H |
||||
#define LWIP_HTTPD_OPTS_H |
||||
|
||||
#include "lwip/opt.h" |
||||
|
||||
/** Set this to 1 to support CGI */ |
||||
#ifndef LWIP_HTTPD_CGI |
||||
#define LWIP_HTTPD_CGI 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to support SSI (Server-Side-Includes) */ |
||||
#ifndef LWIP_HTTPD_SSI |
||||
#define LWIP_HTTPD_SSI 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to support HTTP POST */ |
||||
#ifndef LWIP_HTTPD_SUPPORT_POST |
||||
#define LWIP_HTTPD_SUPPORT_POST 0 |
||||
#endif |
||||
|
||||
/* The maximum number of parameters that the CGI handler can be sent. */ |
||||
#ifndef LWIP_HTTPD_MAX_CGI_PARAMETERS |
||||
#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16 |
||||
#endif |
||||
|
||||
/** LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more
|
||||
* arguments indicating a counter for insert string that are too long to be |
||||
* inserted at once: the SSI handler function must then set 'next_tag_part' |
||||
* which will be passed back to it in the next call. */ |
||||
#ifndef LWIP_HTTPD_SSI_MULTIPART |
||||
#define LWIP_HTTPD_SSI_MULTIPART 0 |
||||
#endif |
||||
|
||||
/* The maximum length of the string comprising the tag name */ |
||||
#ifndef LWIP_HTTPD_MAX_TAG_NAME_LEN |
||||
#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8 |
||||
#endif |
||||
|
||||
/* The maximum length of string that can be returned to replace any given tag */ |
||||
#ifndef LWIP_HTTPD_MAX_TAG_INSERT_LEN |
||||
#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192 |
||||
#endif |
||||
|
||||
#ifndef LWIP_HTTPD_POST_MANUAL_WND |
||||
#define LWIP_HTTPD_POST_MANUAL_WND 0 |
||||
#endif |
||||
|
||||
/** This string is passed in the HTTP header as "Server: " */ |
||||
#ifndef HTTPD_SERVER_AGENT |
||||
#define HTTPD_SERVER_AGENT "lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)"
|
||||
#endif |
||||
|
||||
/** Set this to 1 if you want to include code that creates HTTP headers
|
||||
* at runtime. Default is off: HTTP headers are then created statically |
||||
* by the makefsdata tool. Static headers mean smaller code size, but |
||||
* the (readonly) fsdata will grow a bit as every file includes the HTTP |
||||
* header. */ |
||||
#ifndef LWIP_HTTPD_DYNAMIC_HEADERS |
||||
#define LWIP_HTTPD_DYNAMIC_HEADERS 0 |
||||
#endif |
||||
|
||||
#ifndef HTTPD_DEBUG |
||||
#define HTTPD_DEBUG LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
/** Set this to 1 to use a memp pool for allocating
|
||||
* struct http_state instead of the heap. |
||||
*/ |
||||
#ifndef HTTPD_USE_MEM_POOL |
||||
#define HTTPD_USE_MEM_POOL 0 |
||||
#endif |
||||
|
||||
/** The server port for HTTPD to use */ |
||||
#ifndef HTTPD_SERVER_PORT |
||||
#define HTTPD_SERVER_PORT 80 |
||||
#endif |
||||
|
||||
/** Maximum retries before the connection is aborted/closed.
|
||||
* - number of times pcb->poll is called -> default is 4*500ms = 2s; |
||||
* - reset when pcb->sent is called |
||||
*/ |
||||
#ifndef HTTPD_MAX_RETRIES |
||||
#define HTTPD_MAX_RETRIES 4 |
||||
#endif |
||||
|
||||
/** The poll delay is X*500ms */ |
||||
#ifndef HTTPD_POLL_INTERVAL |
||||
#define HTTPD_POLL_INTERVAL 4 |
||||
#endif |
||||
|
||||
/** Priority for tcp pcbs created by HTTPD (very low by default).
|
||||
* Lower priorities get killed first when running out of memory. |
||||
*/ |
||||
#ifndef HTTPD_TCP_PRIO |
||||
#define HTTPD_TCP_PRIO TCP_PRIO_MIN |
||||
#endif |
||||
|
||||
/** Set this to 1 to enable timing each file sent */ |
||||
#ifndef LWIP_HTTPD_TIMING |
||||
#define LWIP_HTTPD_TIMING 0 |
||||
#endif |
||||
#ifndef HTTPD_DEBUG_TIMING |
||||
#define HTTPD_DEBUG_TIMING LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
/** Set this to 1 on platforms where strnstr is not available */ |
||||
#ifndef LWIP_HTTPD_STRNSTR_PRIVATE |
||||
#define LWIP_HTTPD_STRNSTR_PRIVATE 1 |
||||
#endif |
||||
|
||||
/** Set this to one to show error pages when parsing a request fails instead
|
||||
of simply closing the connection. */ |
||||
#ifndef LWIP_HTTPD_SUPPORT_EXTSTATUS |
||||
#define LWIP_HTTPD_SUPPORT_EXTSTATUS 0 |
||||
#endif |
||||
|
||||
/** Set this to 0 to drop support for HTTP/0.9 clients (to save some bytes) */ |
||||
#ifndef LWIP_HTTPD_SUPPORT_V09 |
||||
#define LWIP_HTTPD_SUPPORT_V09 1 |
||||
#endif |
||||
|
||||
/** Set this to 1 to enable HTTP/1.1 persistent connections.
|
||||
* ATTENTION: If the generated file system includes HTTP headers, these must |
||||
* include the "Connection: keep-alive" header (pass argument "-11" to makefsdata). |
||||
*/ |
||||
#ifndef LWIP_HTTPD_SUPPORT_11_KEEPALIVE |
||||
#define LWIP_HTTPD_SUPPORT_11_KEEPALIVE 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to support HTTP request coming in in multiple packets/pbufs */ |
||||
#ifndef LWIP_HTTPD_SUPPORT_REQUESTLIST |
||||
#define LWIP_HTTPD_SUPPORT_REQUESTLIST 1 |
||||
#endif |
||||
|
||||
#if LWIP_HTTPD_SUPPORT_REQUESTLIST |
||||
/** Number of rx pbufs to enqueue to parse an incoming request (up to the first
|
||||
newline) */ |
||||
#ifndef LWIP_HTTPD_REQ_QUEUELEN |
||||
#define LWIP_HTTPD_REQ_QUEUELEN 5 |
||||
#endif |
||||
|
||||
/** Number of (TCP payload-) bytes (in pbufs) to enqueue to parse and incoming
|
||||
request (up to the first double-newline) */ |
||||
#ifndef LWIP_HTTPD_REQ_BUFSIZE |
||||
#define LWIP_HTTPD_REQ_BUFSIZE LWIP_HTTPD_MAX_REQ_LENGTH |
||||
#endif |
||||
|
||||
/** Defines the maximum length of a HTTP request line (up to the first CRLF,
|
||||
copied from pbuf into this a global buffer when pbuf- or packet-queues |
||||
are received - otherwise the input pbuf is used directly) */ |
||||
#ifndef LWIP_HTTPD_MAX_REQ_LENGTH |
||||
#define LWIP_HTTPD_MAX_REQ_LENGTH LWIP_MIN(1023, (LWIP_HTTPD_REQ_QUEUELEN * PBUF_POOL_BUFSIZE)) |
||||
#endif |
||||
#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ |
||||
|
||||
/** Maximum length of the filename to send as response to a POST request,
|
||||
* filled in by the application when a POST is finished. |
||||
*/ |
||||
#ifndef LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN |
||||
#define LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN 63 |
||||
#endif |
||||
|
||||
/** Set this to 0 to not send the SSI tag (default is on, so the tag will
|
||||
* be sent in the HTML page */ |
||||
#ifndef LWIP_HTTPD_SSI_INCLUDE_TAG |
||||
#define LWIP_HTTPD_SSI_INCLUDE_TAG 1 |
||||
#endif |
||||
|
||||
/** Set this to 1 to call tcp_abort when tcp_close fails with memory error.
|
||||
* This can be used to prevent consuming all memory in situations where the |
||||
* HTTP server has low priority compared to other communication. */ |
||||
#ifndef LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR |
||||
#define LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to kill the oldest connection when running out of
|
||||
* memory for 'struct http_state' or 'struct http_ssi_state'. |
||||
* ATTENTION: This puts all connections on a linked list, so may be kind of slow. |
||||
*/ |
||||
#ifndef LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED |
||||
#define LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED 0 |
||||
#endif |
||||
|
||||
/** Default: Tags are sent from struct http_state and are therefore volatile */ |
||||
#ifndef HTTP_IS_TAG_VOLATILE |
||||
#define HTTP_IS_TAG_VOLATILE(ptr) TCP_WRITE_FLAG_COPY |
||||
#endif |
||||
|
||||
/* By default, the httpd is limited to send 2*pcb->mss to keep resource usage low
|
||||
when http is not an important protocol in the device. */ |
||||
#ifndef HTTPD_LIMIT_SENDING_TO_2MSS |
||||
#define HTTPD_LIMIT_SENDING_TO_2MSS 1 |
||||
#endif |
||||
|
||||
/* Define this to a function that returns the maximum amount of data to enqueue.
|
||||
The function have this signature: u16_t fn(struct tcp_pcb* pcb); */ |
||||
#ifndef HTTPD_MAX_WRITE_LEN |
||||
#if HTTPD_LIMIT_SENDING_TO_2MSS |
||||
#define HTTPD_MAX_WRITE_LEN(pcb) (2 * tcp_mss(pcb)) |
||||
#endif |
||||
#endif |
||||
|
||||
/*------------------- FS OPTIONS -------------------*/ |
||||
|
||||
/** Set this to 1 and provide the functions:
|
||||
* - "int fs_open_custom(struct fs_file *file, const char *name)" |
||||
* Called first for every opened file to allow opening files |
||||
* that are not included in fsdata(_custom).c |
||||
* - "void fs_close_custom(struct fs_file *file)" |
||||
* Called to free resources allocated by fs_open_custom(). |
||||
*/ |
||||
#ifndef LWIP_HTTPD_CUSTOM_FILES |
||||
#define LWIP_HTTPD_CUSTOM_FILES 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to support fs_read() to dynamically read file data.
|
||||
* Without this (default=off), only one-block files are supported, |
||||
* and the contents must be ready after fs_open(). |
||||
*/ |
||||
#ifndef LWIP_HTTPD_DYNAMIC_FILE_READ |
||||
#define LWIP_HTTPD_DYNAMIC_FILE_READ 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to include an application state argument per file
|
||||
* that is opened. This allows to keep a state per connection/file. |
||||
*/ |
||||
#ifndef LWIP_HTTPD_FILE_STATE |
||||
#define LWIP_HTTPD_FILE_STATE 0 |
||||
#endif |
||||
|
||||
/** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for
|
||||
* predefined (MSS-sized) chunks of the files to prevent having to calculate |
||||
* the checksums at runtime. */ |
||||
#ifndef HTTPD_PRECALCULATED_CHECKSUM |
||||
#define HTTPD_PRECALCULATED_CHECKSUM 0 |
||||
#endif |
||||
|
||||
/** LWIP_HTTPD_FS_ASYNC_READ==1: support asynchronous read operations
|
||||
* (fs_read_async returns FS_READ_DELAYED and calls a callback when finished). |
||||
*/ |
||||
#ifndef LWIP_HTTPD_FS_ASYNC_READ |
||||
#define LWIP_HTTPD_FS_ASYNC_READ 0 |
||||
#endif |
||||
|
||||
/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the
|
||||
* file system (to prevent changing the file included in CVS) */ |
||||
#ifndef HTTPD_USE_CUSTOM_FSDATA |
||||
#define HTTPD_USE_CUSTOM_FSDATA 0 |
||||
#endif |
||||
|
||||
#endif /* LWIP_HTTPD_OPTS_H */ |
||||
Loading…
Reference in new issue