forked from Archive/PX4-Autopilot
Add URL/CGI function mapping option to uIP web server
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5096 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
parent
ae148ef09e
commit
9c0b4cd45f
|
@ -308,3 +308,5 @@
|
|||
* apps/netutils/webserver: Several inenhancements from Kate including the
|
||||
ability to elide scripting and SERVER headers and the ability to map
|
||||
files into memory before transferring them.
|
||||
* apps/netutils/webserver: Add ability to map a URL to CGI function.
|
||||
Contributed by Kate.
|
||||
|
|
|
@ -19,6 +19,33 @@ config NETUTILS_HTTPD_SCRIPT_DISABLE
|
|||
---help---
|
||||
This option, if selected, will elide the %! scripting
|
||||
|
||||
config NETUTILS_HTTPD_CGIPATH
|
||||
bool "URL/CGI function mapping"
|
||||
default n
|
||||
---help---
|
||||
This option enables mappings from URLs to call CGI functions. The
|
||||
effect is that the existing httpd_cgi_register() interface can be
|
||||
used thus:
|
||||
|
||||
const static struct httpd_cgi_call a[] = {
|
||||
{ NULL, "/abc", cgi_abc },
|
||||
{ NULL, "/xyz", cgi_xyz }
|
||||
};
|
||||
|
||||
for (i = 0; i < sizeof a / sizeof *a; i++) {
|
||||
httpd_cgi_register(&a[i]);
|
||||
}
|
||||
|
||||
Where (under CONFIG_NETUTILS_HTTPD_CGIPATH) the "/xyz" is a URL path,
|
||||
rather than a %! xyz style call in the existing manner.
|
||||
|
||||
This is useful when CONFIG_NETUTILS_HTTPD_SCRIPT_DISABLE is defined.
|
||||
|
||||
In other words, this provides a way to get your CGI functions called
|
||||
without needing the scripting language. I'm using this to provide a
|
||||
REST style interface over HTTP, where my CGI handlers just return a
|
||||
HTTP status code with a content length of 0.
|
||||
|
||||
config NETUTILS_HTTPD_SERVERHEADER_DISABLE
|
||||
bool "Disabled the SERVER header"
|
||||
default n
|
||||
|
|
|
@ -214,7 +214,13 @@ static int handle_script(struct httpd_state *pstate)
|
|||
}
|
||||
else
|
||||
{
|
||||
httpd_cgi(pstate->ht_scriptptr)(pstate, pstate->ht_scriptptr);
|
||||
httpd_cgifunction f;
|
||||
|
||||
f = httpd_cgi(pstate->ht_scriptptr);
|
||||
if (f != NULL)
|
||||
{
|
||||
f(pstate, pstate->ht_scriptptr);
|
||||
}
|
||||
}
|
||||
next_scriptstate(pstate);
|
||||
|
||||
|
@ -392,6 +398,21 @@ static int httpd_sendfile(struct httpd_state *pstate)
|
|||
|
||||
nvdbg("[%d] sending file '%s'\n", pstate->ht_sockfd, pstate->ht_filename);
|
||||
|
||||
#ifdef CONFIG_NETUTILS_HTTPD_CGIPATH
|
||||
{
|
||||
httpd_cgifunction f;
|
||||
|
||||
f = httpd_cgi(pstate->ht_filename);
|
||||
if (f != NULL)
|
||||
{
|
||||
f(pstate, pstate->ht_filename);
|
||||
|
||||
ret = OK;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (httpd_open(pstate->ht_filename, &pstate->ht_file) != OK)
|
||||
{
|
||||
ndbg("[%d] '%s' not found\n", pstate->ht_sockfd, pstate->ht_filename);
|
||||
|
@ -434,6 +455,8 @@ static int httpd_sendfile(struct httpd_state *pstate)
|
|||
|
||||
(void)httpd_close(&pstate->ht_file);
|
||||
|
||||
done:
|
||||
|
||||
/* Send anything remaining in the buffer */
|
||||
|
||||
if (ret == OK && pstate->ht_sndlen > 0)
|
||||
|
|
|
@ -58,14 +58,6 @@ struct httpd_cgi_call *cgi_calls = NULL;
|
|||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nullfunction
|
||||
****************************************************************************/
|
||||
|
||||
static void nullfunction(struct httpd_state *pstate, char *ptr)
|
||||
{
|
||||
}
|
||||
|
||||
void httpd_cgi_register(struct httpd_cgi_call *cgi_call)
|
||||
{
|
||||
if (cgi_calls == NULL)
|
||||
|
@ -92,5 +84,5 @@ httpd_cgifunction httpd_cgi(char *name)
|
|||
cgi_call = cgi_call->next;
|
||||
}
|
||||
|
||||
return nullfunction;
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue