Import lwIP contrib rep
... from http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git/ into contrib/ subdir, STABLE-2_1_0_RELEASE tag lwIP contrib is now officially frozen TODO: Fix build
This commit is contained in:
107
contrib/examples/httpd/cgi_example/cgi_example.c
Normal file
107
contrib/examples/httpd/cgi_example/cgi_example.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/**
|
||||
* @file
|
||||
* HTTPD simple CGI example
|
||||
*
|
||||
* This file demonstrates how to add support for basic CGI.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/opt.h"
|
||||
#include "cgi_example.h"
|
||||
|
||||
#include "lwip/apps/httpd.h"
|
||||
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_CGI_SIMPLE to 1 to enable this cgi example */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_CGI_SIMPLE
|
||||
#define LWIP_HTTPD_EXAMPLE_CGI_SIMPLE 0
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CGI_SIMPLE
|
||||
|
||||
#if !LWIP_HTTPD_CGI
|
||||
#error LWIP_HTTPD_EXAMPLE_CGI_SIMPLE needs LWIP_HTTPD_CGI
|
||||
#endif
|
||||
|
||||
static const char *cgi_handler_basic(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
|
||||
|
||||
static const tCGI cgi_handlers[] = {
|
||||
{
|
||||
"/basic_cgi",
|
||||
cgi_handler_basic
|
||||
},
|
||||
{
|
||||
"/basic_cgi_2",
|
||||
cgi_handler_basic
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
cgi_ex_init(void)
|
||||
{
|
||||
http_set_cgi_handlers(cgi_handlers, LWIP_ARRAYSIZE(cgi_handlers));
|
||||
}
|
||||
|
||||
/** This basic CGI function can parse param/value pairs and return an url that
|
||||
* is sent as a response by httpd.
|
||||
*
|
||||
* This example function just checks that the input url has two key value
|
||||
* parameter pairs: "foo=bar" and "test=123"
|
||||
* If not, it returns 404
|
||||
*/
|
||||
static const char *
|
||||
cgi_handler_basic(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
|
||||
{
|
||||
LWIP_ASSERT("check index", iIndex < LWIP_ARRAYSIZE(cgi_handlers));
|
||||
|
||||
if (iNumParams == 2) {
|
||||
if (!strcmp(pcParam[0], "foo")) {
|
||||
if (!strcmp(pcValue[0], "bar")) {
|
||||
if (!strcmp(pcParam[1], "test")) {
|
||||
if (!strcmp(pcValue[1], "123")) {
|
||||
return "/index.html";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return "/404.html";
|
||||
}
|
||||
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_CGI_SIMPLE */
|
||||
38
contrib/examples/httpd/cgi_example/cgi_example.h
Normal file
38
contrib/examples/httpd/cgi_example/cgi_example.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE
|
||||
#define LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE
|
||||
|
||||
void cgi_ex_init(void);
|
||||
|
||||
#endif /* LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE */
|
||||
21
contrib/examples/httpd/examples_fs/404.html
Normal file
21
contrib/examples/httpd/examples_fs/404.html
Normal file
@@ -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>
|
||||
BIN
contrib/examples/httpd/examples_fs/img/sics.gif
Normal file
BIN
contrib/examples/httpd/examples_fs/img/sics.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 724 B |
47
contrib/examples/httpd/examples_fs/index.html
Normal file
47
contrib/examples/httpd/examples_fs/index.html
Normal file
@@ -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>
|
||||
|
||||
28
contrib/examples/httpd/examples_fs/login.html
Normal file
28
contrib/examples/httpd/examples_fs/login.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<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>Login</h1>
|
||||
<form name="login" action="login.cgi" method="post">
|
||||
<div>
|
||||
<label><b>Username</b></label>
|
||||
<input type="text" placeholder="Enter Username" name="user" required>
|
||||
<label><b>Password</b></label>
|
||||
<input type="password" placeholder="Enter Password" name="pass" required>
|
||||
<button type="submit">Login</button>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
25
contrib/examples/httpd/examples_fs/loginfail.html
Normal file
25
contrib/examples/httpd/examples_fs/loginfail.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<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>
|
||||
Login failed.
|
||||
</p>
|
||||
<p>
|
||||
Click <a href="login.html">here</a> to retry login.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
25
contrib/examples/httpd/examples_fs/session.html
Normal file
25
contrib/examples/httpd/examples_fs/session.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<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>
|
||||
Login succeeded, session active.
|
||||
</p>
|
||||
<p>
|
||||
Click <a href="login.html">here</a> to retry login.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
315
contrib/examples/httpd/examples_fs/ssi.shtml
Normal file
315
contrib/examples/httpd/examples_fs/ssi.shtml
Normal file
@@ -0,0 +1,315 @@
|
||||
<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>
|
||||
<h1><!--#HellWorl--></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>
|
||||
This page is here to test SSI, so here is a counter as
|
||||
an example of content changing for every request:
|
||||
"<!--#counter-->"
|
||||
</p>
|
||||
<p>
|
||||
And here is an example of a tag result buffer return in
|
||||
multiple parts: "<!--#MultPart-->"
|
||||
</p>
|
||||
<p>
|
||||
To test LWIP_HTTPD_CGI_SSI, here are the CGI parameters:
|
||||
<!--#CgiParam-->
|
||||
</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>
|
||||
<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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
|
||||
1543
contrib/examples/httpd/examples_fsdata.c
Normal file
1543
contrib/examples/httpd/examples_fsdata.c
Normal file
File diff suppressed because it is too large
Load Diff
321
contrib/examples/httpd/fs_example/fs_example.c
Normal file
321
contrib/examples/httpd/fs_example/fs_example.c
Normal file
@@ -0,0 +1,321 @@
|
||||
/**
|
||||
* @file
|
||||
* HTTPD custom file system example
|
||||
*
|
||||
* This file demonstrates how to add support for an external file system to httpd.
|
||||
* It provides access to the specified root directory and uses stdio.h file functions
|
||||
* to read files.
|
||||
*
|
||||
* ATTENTION: This implementation is *not* secure: no checks are added to ensure
|
||||
* files are only read below the specified root directory!
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/opt.h"
|
||||
#include "fs_example.h"
|
||||
|
||||
#include "lwip/apps/fs.h"
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES to 1 to enable this file system */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES
|
||||
#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES 0
|
||||
#endif
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED to 1 to delay open and read
|
||||
* as if e.g. reading from external SPI flash */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED 1
|
||||
#endif
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ to the number of bytes
|
||||
* to read to emulate limited transfer buffers and don't read whole files in
|
||||
* one chunk.
|
||||
* WARNING: lowering this slows down the connection!
|
||||
*/
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
|
||||
#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ 0
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES
|
||||
|
||||
#if !LWIP_HTTPD_CUSTOM_FILES
|
||||
#error This needs LWIP_HTTPD_CUSTOM_FILES
|
||||
#endif
|
||||
#if !LWIP_HTTPD_DYNAMIC_HEADERS
|
||||
#error This needs LWIP_HTTPD_DYNAMIC_HEADERS
|
||||
#endif
|
||||
#if !LWIP_HTTPD_DYNAMIC_FILE_READ
|
||||
#error This wants to demonstrate read-after-open, so LWIP_HTTPD_DYNAMIC_FILE_READ is required!
|
||||
#endif
|
||||
#if !LWIP_HTTPD_FS_ASYNC_READ
|
||||
#error This needs LWIP_HTTPD_FS_ASYNC_READ
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
#include "lwip/tcpip.h"
|
||||
#endif
|
||||
|
||||
struct fs_custom_data {
|
||||
FILE *f;
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
int delay_read;
|
||||
fs_wait_cb callback_fn;
|
||||
void *callback_arg;
|
||||
#endif
|
||||
};
|
||||
|
||||
const char* fs_ex_root_dir;
|
||||
|
||||
void
|
||||
fs_ex_init(const char *httpd_root_dir)
|
||||
{
|
||||
fs_ex_root_dir = strdup(httpd_root_dir);
|
||||
}
|
||||
|
||||
#if LWIP_HTTPD_CUSTOM_FILES
|
||||
int
|
||||
fs_open_custom(struct fs_file *file, const char *name)
|
||||
{
|
||||
char full_filename[256];
|
||||
FILE *f;
|
||||
|
||||
snprintf(full_filename, 255, "%s%s", fs_ex_root_dir, name);
|
||||
full_filename[255] = 0;
|
||||
|
||||
f = fopen(full_filename, "rb");
|
||||
if (f != NULL) {
|
||||
if (!fseek(f, 0, SEEK_END)) {
|
||||
int len = (int)ftell(f);
|
||||
if(!fseek(f, 0, SEEK_SET)) {
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)mem_malloc(sizeof(struct fs_custom_data));
|
||||
LWIP_ASSERT("out of memory?", data != NULL);
|
||||
memset(file, 0, sizeof(struct fs_file));
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
file->len = 0; /* read size delayed */
|
||||
data->delay_read = 3;
|
||||
LWIP_UNUSED_ARG(len);
|
||||
#else
|
||||
file->len = len;
|
||||
#endif
|
||||
file->flags = FS_FILE_FLAGS_HEADER_PERSISTENT;
|
||||
data->f = f;
|
||||
file->pextension = data;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
fs_close_custom(struct fs_file *file)
|
||||
{
|
||||
if (file && file->pextension) {
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
|
||||
if (data->f != NULL) {
|
||||
fclose(data->f);
|
||||
data->f = NULL;
|
||||
}
|
||||
mem_free(data);
|
||||
}
|
||||
}
|
||||
|
||||
#if LWIP_HTTPD_FS_ASYNC_READ
|
||||
u8_t
|
||||
fs_canread_custom(struct fs_file *file)
|
||||
{
|
||||
/* This function is only necessary for asynchronous I/O:
|
||||
If reading would block, return 0 and implement fs_wait_read_custom() to call the
|
||||
supplied callback if reading works. */
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
struct fs_custom_data *data;
|
||||
LWIP_ASSERT("file != NULL", file != NULL);
|
||||
data = (struct fs_custom_data *)file->pextension;
|
||||
if (data == NULL) {
|
||||
/* file transfer has been completed already */
|
||||
LWIP_ASSERT("transfer complete", file->index == file->len);
|
||||
return 1;
|
||||
}
|
||||
LWIP_ASSERT("data != NULL", data != NULL);
|
||||
/* This just simulates a simple delay. This delay would normally come e.g. from SPI transfer */
|
||||
if (data->delay_read == 3) {
|
||||
/* delayed file size mode */
|
||||
data->delay_read = 1;
|
||||
LWIP_ASSERT("", file->len == 0);
|
||||
if (!fseek(data->f, 0, SEEK_END)) {
|
||||
int len = (int)ftell(data->f);
|
||||
if(!fseek(data->f, 0, SEEK_SET)) {
|
||||
file->len = len; /* read size delayed */
|
||||
data->delay_read = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* if we come here, something is wrong with the file */
|
||||
LWIP_ASSERT("file error", 0);
|
||||
}
|
||||
if (data->delay_read == 1) {
|
||||
/* tell read function to delay further */
|
||||
}
|
||||
#endif
|
||||
LWIP_UNUSED_ARG(file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
static void
|
||||
fs_example_read_cb(void *arg)
|
||||
{
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)arg;
|
||||
fs_wait_cb callback_fn = data->callback_fn;
|
||||
void *callback_arg = data->callback_arg;
|
||||
data->callback_fn = NULL;
|
||||
data->callback_arg = NULL;
|
||||
|
||||
LWIP_ASSERT("no callback_fn", callback_fn != NULL);
|
||||
|
||||
callback_fn(callback_arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
u8_t
|
||||
fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
|
||||
{
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
err_t err;
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
|
||||
LWIP_ASSERT("data not set", data != NULL);
|
||||
data->callback_fn = callback_fn;
|
||||
data->callback_arg = callback_arg;
|
||||
err = tcpip_try_callback(fs_example_read_cb, data);
|
||||
LWIP_ASSERT("out of queue elements?", err == ERR_OK);
|
||||
LWIP_UNUSED_ARG(err);
|
||||
#else
|
||||
LWIP_ASSERT("not implemented in this example configuration", 0);
|
||||
#endif
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(callback_fn);
|
||||
LWIP_UNUSED_ARG(callback_arg);
|
||||
/* Return
|
||||
- 1 if ready to read (at least one byte)
|
||||
- 0 if reading should be delayed (call 'tcpip_callback(callback_fn, callback_arg)' when ready) */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)
|
||||
{
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
|
||||
FILE *f;
|
||||
int len;
|
||||
int read_count = count;
|
||||
LWIP_ASSERT("data not set", data != NULL);
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
|
||||
/* This just simulates a delay. This delay would normally come e.g. from SPI transfer */
|
||||
LWIP_ASSERT("invalid state", data->delay_read >= 0 && data->delay_read <= 2);
|
||||
if (data->delay_read == 2) {
|
||||
/* no delay next time */
|
||||
data->delay_read = 0;
|
||||
return FS_READ_DELAYED;
|
||||
} else if (data->delay_read == 1) {
|
||||
err_t err;
|
||||
/* execute requested delay */
|
||||
data->delay_read = 2;
|
||||
LWIP_ASSERT("duplicate callback request", data->callback_fn == NULL);
|
||||
data->callback_fn = callback_fn;
|
||||
data->callback_arg = callback_arg;
|
||||
err = tcpip_try_callback(fs_example_read_cb, data);
|
||||
LWIP_ASSERT("out of queue elements?", err == ERR_OK);
|
||||
LWIP_UNUSED_ARG(err);
|
||||
return FS_READ_DELAYED;
|
||||
}
|
||||
/* execute this read but delay the next one */
|
||||
data->delay_read = 1;
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
|
||||
read_count = LWIP_MIN(read_count, LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ);
|
||||
#endif
|
||||
|
||||
f = data->f;
|
||||
len = (int)fread(buffer, 1, read_count, f);
|
||||
|
||||
LWIP_UNUSED_ARG(callback_fn);
|
||||
LWIP_UNUSED_ARG(callback_arg);
|
||||
|
||||
file->index += len;
|
||||
|
||||
/* Return
|
||||
- FS_READ_EOF if all bytes have been read
|
||||
- FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
|
||||
if (len == 0) {
|
||||
/* all bytes read already */
|
||||
return FS_READ_EOF;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
#else /* LWIP_HTTPD_FS_ASYNC_READ */
|
||||
int
|
||||
fs_read_custom(struct fs_file *file, char *buffer, int count)
|
||||
{
|
||||
struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
|
||||
FILE *f;
|
||||
int len;
|
||||
int read_count = count;
|
||||
LWIP_ASSERT("data not set", data != NULL);
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
|
||||
read_count = LWIP_MIN(read_count, LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ);
|
||||
#endif
|
||||
|
||||
f = data->f;
|
||||
len = (int)fread(buffer, 1, read_count, f);
|
||||
|
||||
file->index += len;
|
||||
|
||||
/* Return FS_READ_EOF if all bytes have been read */
|
||||
return len;
|
||||
}
|
||||
|
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
|
||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */
|
||||
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_CUSTOMFILES */
|
||||
38
contrib/examples/httpd/fs_example/fs_example.h
Normal file
38
contrib/examples/httpd/fs_example/fs_example.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE
|
||||
#define LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE
|
||||
|
||||
void fs_ex_init(const char *httpd_root_dir);
|
||||
|
||||
#endif /* LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE */
|
||||
183
contrib/examples/httpd/genfiles_example/genfiles_example.c
Normal file
183
contrib/examples/httpd/genfiles_example/genfiles_example.c
Normal file
@@ -0,0 +1,183 @@
|
||||
/**
|
||||
* @file
|
||||
* HTTPD custom file system example for runtime generated files
|
||||
*
|
||||
* This file demonstrates how to add support for generated files to httpd.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/opt.h"
|
||||
#include "genfiles_example.h"
|
||||
|
||||
#include "lwip/apps/fs.h"
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_GENERATEDFILES to 1 to enable this file system */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_GENERATEDFILES
|
||||
#define LWIP_HTTPD_EXAMPLE_GENERATEDFILES 0
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_GENERATEDFILES
|
||||
|
||||
#if !LWIP_HTTPD_CUSTOM_FILES
|
||||
#error This needs LWIP_HTTPD_CUSTOM_FILES
|
||||
#endif
|
||||
#if !LWIP_HTTPD_DYNAMIC_HEADERS
|
||||
#error This needs LWIP_HTTPD_DYNAMIC_HEADERS
|
||||
#endif
|
||||
|
||||
/* This is the page we send. It's not generated, as you see.
|
||||
* Generating custom things instead of memcpy is left to your imagination :-)
|
||||
*/
|
||||
const char generated_html[] =
|
||||
"<html>\n"
|
||||
"<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>\n"
|
||||
" <body bgcolor=\"white\" text=\"black\">\n"
|
||||
" <table width=\"100%\">\n"
|
||||
" <tr valign=\"top\">\n"
|
||||
" <td width=\"80\">\n"
|
||||
" <a href=\"http://www.sics.se/\"><img src=\"/img/sics.gif\"\n"
|
||||
" border=\"0\" alt=\"SICS logo\" title=\"SICS logo\"></a>\n"
|
||||
" </td>\n"
|
||||
" <td width=\"500\">\n"
|
||||
" <h1>lwIP - A Lightweight TCP/IP Stack</h1>\n"
|
||||
" <h2>Generated page</h2>\n"
|
||||
" <p>This page might be generated in-memory at runtime</p>\n"
|
||||
" </td>\n"
|
||||
" <td>\n"
|
||||
" \n"
|
||||
" </td>\n"
|
||||
" </tr>\n"
|
||||
" </table>\n"
|
||||
" </body>\n"
|
||||
"</html>";
|
||||
|
||||
|
||||
void
|
||||
genfiles_ex_init(void)
|
||||
{
|
||||
/* nothing to do here yet */
|
||||
}
|
||||
|
||||
int
|
||||
fs_open_custom(struct fs_file *file, const char *name)
|
||||
{
|
||||
/* this example only provides one file */
|
||||
if (!strcmp(name, "/generated.html")) {
|
||||
/* initialize fs_file correctly */
|
||||
memset(file, 0, sizeof(struct fs_file));
|
||||
file->pextension = mem_malloc(sizeof(generated_html));
|
||||
if (file->pextension != NULL) {
|
||||
/* instead of doing memcpy, you would generate e.g. a JSON here */
|
||||
memcpy(file->pextension, generated_html, sizeof(generated_html));
|
||||
file->data = (const char *)file->pextension;
|
||||
file->len = sizeof(generated_html) - 1; /* don't send the trailing 0 */
|
||||
file->index = file->len;
|
||||
/* allow persisteng connections */
|
||||
file->flags = FS_FILE_FLAGS_HEADER_PERSISTENT;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
fs_close_custom(struct fs_file *file)
|
||||
{
|
||||
if (file && file->pextension) {
|
||||
mem_free(file->pextension);
|
||||
file->pextension = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#if LWIP_HTTPD_FS_ASYNC_READ
|
||||
u8_t
|
||||
fs_canread_custom(struct fs_file *file)
|
||||
{
|
||||
LWIP_UNUSED_ARG(file);
|
||||
/* This example does not use delayed/async reading */
|
||||
return 1;
|
||||
}
|
||||
|
||||
u8_t
|
||||
fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
|
||||
{
|
||||
LWIP_ASSERT("not implemented in this example configuration", 0);
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(callback_fn);
|
||||
LWIP_UNUSED_ARG(callback_arg);
|
||||
/* Return
|
||||
- 1 if ready to read (at least one byte)
|
||||
- 0 if reading should be delayed (call 'tcpip_callback(callback_fn, callback_arg)' when ready) */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)
|
||||
{
|
||||
LWIP_ASSERT("not implemented in this example configuration", 0);
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(buffer);
|
||||
LWIP_UNUSED_ARG(count);
|
||||
LWIP_UNUSED_ARG(callback_fn);
|
||||
LWIP_UNUSED_ARG(callback_arg);
|
||||
/* Return
|
||||
- FS_READ_EOF if all bytes have been read
|
||||
- FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
|
||||
/* all bytes read already */
|
||||
return FS_READ_EOF;
|
||||
}
|
||||
|
||||
#else /* LWIP_HTTPD_FS_ASYNC_READ */
|
||||
int
|
||||
fs_read_custom(struct fs_file *file, char *buffer, int count)
|
||||
{
|
||||
LWIP_ASSERT("not implemented in this example configuration", 0);
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(buffer);
|
||||
LWIP_UNUSED_ARG(count);
|
||||
/* Return
|
||||
- FS_READ_EOF if all bytes have been read
|
||||
- FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
|
||||
/* all bytes read already */
|
||||
return FS_READ_EOF;
|
||||
}
|
||||
|
||||
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
|
||||
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_GENERATEDFILES */
|
||||
38
contrib/examples/httpd/genfiles_example/genfiles_example.h
Normal file
38
contrib/examples/httpd/genfiles_example/genfiles_example.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE
|
||||
#define LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE
|
||||
|
||||
void genfiles_ex_init(void);
|
||||
|
||||
#endif /* LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE */
|
||||
157
contrib/examples/httpd/post_example/post_example.c
Normal file
157
contrib/examples/httpd/post_example/post_example.c
Normal file
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* @file
|
||||
* HTTPD example for simple POST
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/opt.h"
|
||||
|
||||
#include "lwip/apps/httpd.h"
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_GENERATEDFILES to 1 to enable this file system */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_SIMPLEPOST
|
||||
#define LWIP_HTTPD_EXAMPLE_SIMPLEPOST 0
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_SIMPLEPOST
|
||||
|
||||
#if !LWIP_HTTPD_SUPPORT_POST
|
||||
#error This needs LWIP_HTTPD_SUPPORT_POST
|
||||
#endif
|
||||
|
||||
#define USER_PASS_BUFSIZE 16
|
||||
|
||||
static void *current_connection;
|
||||
static void *valid_connection;
|
||||
static char last_user[USER_PASS_BUFSIZE];
|
||||
|
||||
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)
|
||||
{
|
||||
LWIP_UNUSED_ARG(connection);
|
||||
LWIP_UNUSED_ARG(http_request);
|
||||
LWIP_UNUSED_ARG(http_request_len);
|
||||
LWIP_UNUSED_ARG(content_len);
|
||||
LWIP_UNUSED_ARG(post_auto_wnd);
|
||||
if (!memcmp(uri, "/login.cgi", 11)) {
|
||||
if (current_connection != connection) {
|
||||
current_connection = connection;
|
||||
valid_connection = NULL;
|
||||
/* default page is "login failed" */
|
||||
snprintf(response_uri, response_uri_len, "/loginfail.html");
|
||||
/* e.g. for large uploads to slow flash over a fast connection, you should
|
||||
manually update the rx window. That way, a sender can only send a full
|
||||
tcp window at a time. If this is required, set 'post_aut_wnd' to 0.
|
||||
We do not need to throttle upload speed here, so: */
|
||||
*post_auto_wnd = 1;
|
||||
return ERR_OK;
|
||||
}
|
||||
}
|
||||
return ERR_VAL;
|
||||
}
|
||||
|
||||
err_t
|
||||
httpd_post_receive_data(void *connection, struct pbuf *p)
|
||||
{
|
||||
if (current_connection == connection) {
|
||||
u16_t token_user = pbuf_memfind(p, "user=", 5, 0);
|
||||
u16_t token_pass = pbuf_memfind(p, "pass=", 5, 0);
|
||||
if ((token_user != 0xFFFF) && (token_pass != 0xFFFF)) {
|
||||
u16_t value_user = token_user + 5;
|
||||
u16_t value_pass = token_pass + 5;
|
||||
u16_t len_user = 0;
|
||||
u16_t len_pass = 0;
|
||||
u16_t tmp;
|
||||
/* find user len */
|
||||
tmp = pbuf_memfind(p, "&", 1, value_user);
|
||||
if (tmp != 0xFFFF) {
|
||||
len_user = tmp - value_user;
|
||||
} else {
|
||||
len_user = p->tot_len - value_user;
|
||||
}
|
||||
/* find pass len */
|
||||
tmp = pbuf_memfind(p, "&", 1, value_pass);
|
||||
if (tmp != 0xFFFF) {
|
||||
len_pass = tmp - value_pass;
|
||||
} else {
|
||||
len_pass = p->tot_len - value_pass;
|
||||
}
|
||||
if ((len_user > 0) && (len_user < USER_PASS_BUFSIZE) &&
|
||||
(len_pass > 0) && (len_pass < USER_PASS_BUFSIZE)) {
|
||||
/* provide contiguous storage if p is a chained pbuf */
|
||||
char buf_user[USER_PASS_BUFSIZE];
|
||||
char buf_pass[USER_PASS_BUFSIZE];
|
||||
char *user = (char *)pbuf_get_contiguous(p, buf_user, sizeof(buf_user), len_user, value_user);
|
||||
char *pass = (char *)pbuf_get_contiguous(p, buf_pass, sizeof(buf_pass), len_pass, value_pass);
|
||||
if (user && pass) {
|
||||
user[len_user] = 0;
|
||||
pass[len_pass] = 0;
|
||||
if (!strcmp(user, "lwip") && !strcmp(pass, "post")) {
|
||||
/* user and password are correct, create a "session" */
|
||||
valid_connection = connection;
|
||||
memcpy(last_user, user, sizeof(last_user));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* not returning ERR_OK aborts the connection, so return ERR_OK unless the
|
||||
conenction is unknown */
|
||||
return ERR_OK;
|
||||
}
|
||||
return ERR_VAL;
|
||||
}
|
||||
|
||||
void
|
||||
httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len)
|
||||
{
|
||||
/* default page is "login failed" */
|
||||
snprintf(response_uri, response_uri_len, "/loginfail.html");
|
||||
if (current_connection == connection) {
|
||||
if (valid_connection == connection) {
|
||||
/* login succeeded */
|
||||
snprintf(response_uri, response_uri_len, "/session.html");
|
||||
}
|
||||
current_connection = NULL;
|
||||
valid_connection = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_SIMPLEPOST*/
|
||||
264
contrib/examples/httpd/ssi_example/ssi_example.c
Normal file
264
contrib/examples/httpd/ssi_example/ssi_example.c
Normal file
@@ -0,0 +1,264 @@
|
||||
/**
|
||||
* @file
|
||||
* HTTPD simple SSI example
|
||||
*
|
||||
* This file demonstrates how to add support for SSI.
|
||||
* It does this in a very simple way by providing the three tags 'HelloWorld'
|
||||
* 'counter', and 'MultiPart'.
|
||||
*
|
||||
* This file also demonstrates how to integrate CGI with SSI.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/opt.h"
|
||||
#include "ssi_example.h"
|
||||
|
||||
#include "lwip/apps/httpd.h"
|
||||
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE to 1 to enable this ssi example*/
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_SSI_SIMPLE
|
||||
#define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE 0
|
||||
#endif
|
||||
|
||||
/** define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION to 1 to show how to
|
||||
* integrate CGI into SSI (LWIP_HTTPD_CGI_SSI) */
|
||||
#ifndef LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
|
||||
#define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION 0
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
|
||||
#if !LWIP_HTTPD_FILE_STATE
|
||||
#error LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION needs LWIP_HTTPD_FILE_STATE
|
||||
#endif
|
||||
#if !LWIP_HTTPD_CGI_SSI
|
||||
#error LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION needs LWIP_HTTPD_CGI_SSI
|
||||
#endif
|
||||
|
||||
#define MAX_CGI_LEN 16
|
||||
#endif
|
||||
|
||||
const char * ssi_example_tags[] = {
|
||||
"HellWorl",
|
||||
"counter",
|
||||
"MultPart"
|
||||
#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
|
||||
,"CgiParam"
|
||||
#endif
|
||||
};
|
||||
|
||||
u16_t ssi_example_ssi_handler(
|
||||
#if LWIP_HTTPD_SSI_RAW
|
||||
const char* ssi_tag_name,
|
||||
#else /* LWIP_HTTPD_SSI_RAW */
|
||||
int iIndex,
|
||||
#endif /* LWIP_HTTPD_SSI_RAW */
|
||||
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 */
|
||||
)
|
||||
{
|
||||
size_t printed;
|
||||
#if LWIP_HTTPD_SSI_RAW
|
||||
/* a real application could use if(!strcmp) blocks here, but we want to keep
|
||||
the differences between configurations small, so translate string to index here */
|
||||
int iIndex;
|
||||
for (iIndex = 0; iIndex < LWIP_ARRAYSIZE(ssi_example_tags); iIndex++) {
|
||||
if(!strcmp(ssi_tag_name, ssi_example_tags[iIndex])) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
|
||||
LWIP_UNUSED_ARG(connection_state);
|
||||
#endif
|
||||
|
||||
switch (iIndex) {
|
||||
case 0: /* "HelloWorld" */
|
||||
printed = snprintf(pcInsert, iInsertLen, "Hello World!");
|
||||
break;
|
||||
case 1: /* "counter" */
|
||||
{
|
||||
static int counter;
|
||||
counter++;
|
||||
printed = snprintf(pcInsert, iInsertLen, "%d", counter);
|
||||
}
|
||||
break;
|
||||
case 2: /* "MultPart" */
|
||||
#if LWIP_HTTPD_SSI_MULTIPART
|
||||
switch (current_tag_part) {
|
||||
case 0:
|
||||
printed = snprintf(pcInsert, iInsertLen, "part0");
|
||||
*next_tag_part = 1;
|
||||
break;
|
||||
case 1:
|
||||
printed = snprintf(pcInsert, iInsertLen, "part1");
|
||||
*next_tag_part = 2;
|
||||
break;
|
||||
case 2:
|
||||
printed = snprintf(pcInsert, iInsertLen, "part2");
|
||||
break;
|
||||
default:
|
||||
printed = snprintf(pcInsert, iInsertLen, "unhandled part: %d", (int)current_tag_part);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
printed = snprintf(pcInsert, iInsertLen, "LWIP_HTTPD_SSI_MULTIPART disabled");
|
||||
#endif
|
||||
break;
|
||||
#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
|
||||
case 3:
|
||||
if (connection_state) {
|
||||
char *params = (char *)connection_state;
|
||||
if (*params) {
|
||||
printed = snprintf(pcInsert, iInsertLen, "%s", (char *)params);
|
||||
} else {
|
||||
printed = snprintf(pcInsert, iInsertLen, "none");
|
||||
}
|
||||
} else {
|
||||
printed = snprintf(pcInsert, iInsertLen, "NULL");
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default: /* unknown tag */
|
||||
printed = 0;
|
||||
break;
|
||||
}
|
||||
LWIP_ASSERT("sane length", printed <= 0xFFFF);
|
||||
return (u16_t)printed;
|
||||
}
|
||||
|
||||
void
|
||||
ssi_ex_init(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < LWIP_ARRAYSIZE(ssi_example_tags); i++) {
|
||||
LWIP_ASSERT("tag too long for LWIP_HTTPD_MAX_TAG_NAME_LEN",
|
||||
strlen(ssi_example_tags[i]) <= LWIP_HTTPD_MAX_TAG_NAME_LEN);
|
||||
}
|
||||
|
||||
http_set_ssi_handler(ssi_example_ssi_handler,
|
||||
#if LWIP_HTTPD_SSI_RAW
|
||||
NULL, 0
|
||||
#else
|
||||
ssi_example_tags, LWIP_ARRAYSIZE(ssi_example_tags)
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
|
||||
void *
|
||||
fs_state_init(struct fs_file *file, const char *name)
|
||||
{
|
||||
char *ret;
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(name);
|
||||
ret = (char *)mem_malloc(MAX_CGI_LEN);
|
||||
if (ret) {
|
||||
*ret = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
fs_state_free(struct fs_file *file, void *state)
|
||||
{
|
||||
LWIP_UNUSED_ARG(file);
|
||||
if (state != NULL) {
|
||||
mem_free(state);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumParams,
|
||||
char **pcParam, char **pcValue
|
||||
#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
|
||||
, void *connection_state
|
||||
#endif /* LWIP_HTTPD_FILE_STATE */
|
||||
)
|
||||
{
|
||||
LWIP_UNUSED_ARG(file);
|
||||
LWIP_UNUSED_ARG(uri);
|
||||
if (connection_state != NULL) {
|
||||
char *start = (char *)connection_state;
|
||||
char *end = start + MAX_CGI_LEN;
|
||||
int i;
|
||||
memset(start, 0, MAX_CGI_LEN);
|
||||
/* print a string of the arguments: */
|
||||
for (i = 0; i < iNumParams; i++) {
|
||||
size_t len;
|
||||
len = end - start;
|
||||
if (len) {
|
||||
size_t inlen = strlen(pcParam[i]);
|
||||
size_t copylen = LWIP_MIN(inlen, len);
|
||||
memcpy(start, pcParam[i], copylen);
|
||||
start += copylen;
|
||||
len -= copylen;
|
||||
}
|
||||
if (len) {
|
||||
*start = '=';
|
||||
start++;
|
||||
len--;
|
||||
}
|
||||
if (len) {
|
||||
size_t inlen = strlen(pcValue[i]);
|
||||
size_t copylen = LWIP_MIN(inlen, len);
|
||||
memcpy(start, pcValue[i], copylen);
|
||||
start += copylen;
|
||||
len -= copylen;
|
||||
}
|
||||
if (len) {
|
||||
*start = ';';
|
||||
len--;
|
||||
}
|
||||
/* ensure NULL termination */
|
||||
end--;
|
||||
*end = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION */
|
||||
|
||||
#endif /* LWIP_HTTPD_EXAMPLE_SSI_SIMPLE */
|
||||
38
contrib/examples/httpd/ssi_example/ssi_example.h
Normal file
38
contrib/examples/httpd/ssi_example/ssi_example.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Simon Goldschmidt
|
||||
* 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: Simon Goldschmidt <goldsimon@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE
|
||||
#define LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE
|
||||
|
||||
void ssi_ex_init(void);
|
||||
|
||||
#endif /* LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE */
|
||||
Reference in New Issue
Block a user