9
0
Fork 0

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:
patacongo 2012-09-05 18:03:37 +00:00
parent f330280f76
commit cbb3953ab8
4 changed files with 54 additions and 10 deletions

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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;
} }