Add URL/CGI function mapping option to uIP web server
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5096 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
18a9d5dc92
commit
991f372a47
@ -308,3 +308,5 @@
|
|||||||
* apps/netutils/webserver: Several inenhancements from Kate including the
|
* apps/netutils/webserver: Several inenhancements from Kate including the
|
||||||
ability to elide scripting and SERVER headers and the ability to map
|
ability to elide scripting and SERVER headers and the ability to map
|
||||||
files into memory before transferring them.
|
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---
|
---help---
|
||||||
This option, if selected, will elide the %! scripting
|
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
|
config NETUTILS_HTTPD_SERVERHEADER_DISABLE
|
||||||
bool "Disabled the SERVER header"
|
bool "Disabled the SERVER header"
|
||||||
default n
|
default n
|
||||||
|
@ -214,7 +214,13 @@ static int handle_script(struct httpd_state *pstate)
|
|||||||
}
|
}
|
||||||
else
|
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);
|
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);
|
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)
|
if (httpd_open(pstate->ht_filename, &pstate->ht_file) != OK)
|
||||||
{
|
{
|
||||||
ndbg("[%d] '%s' not found\n", pstate->ht_sockfd, pstate->ht_filename);
|
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);
|
(void)httpd_close(&pstate->ht_file);
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
/* Send anything remaining in the buffer */
|
/* Send anything remaining in the buffer */
|
||||||
|
|
||||||
if (ret == OK && pstate->ht_sndlen > 0)
|
if (ret == OK && pstate->ht_sndlen > 0)
|
||||||
|
@ -58,14 +58,6 @@ struct httpd_cgi_call *cgi_calls = NULL;
|
|||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: nullfunction
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void nullfunction(struct httpd_state *pstate, char *ptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void httpd_cgi_register(struct httpd_cgi_call *cgi_call)
|
void httpd_cgi_register(struct httpd_cgi_call *cgi_call)
|
||||||
{
|
{
|
||||||
if (cgi_calls == NULL)
|
if (cgi_calls == NULL)
|
||||||
@ -92,5 +84,5 @@ httpd_cgifunction httpd_cgi(char *name)
|
|||||||
cgi_call = cgi_call->next;
|
cgi_call = cgi_call->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullfunction;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user