HTTP server
[Applications]
This httpd supports for a rudimentary server-side-include facility which will replace tags of the form in any file whose extension is .shtml, .shtm or .ssi with strings provided by an include handler whose pointer is provided to the module via function http_set_ssi_handler(). More...
Modules | |
Options | |
Functions | |
static void | get_tag_insert (struct http_state *hs) |
Insert a tag (found in an shtml in the form of "<!--#tagname-->" into the file. |
Detailed Description
This httpd supports for a rudimentary server-side-include facility which will replace tags of the form in any file whose extension is .shtml, .shtm or .ssi with strings provided by an include handler whose pointer is provided to the module via function http_set_ssi_handler().
Additionally, a simple common gateway interface (CGI) handling mechanism has been added to allow clients to hook functions to particular request URIs.
To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h. To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h.
By default, the server assumes that HTTP headers are already present in each file stored in the file system. By defining LWIP_HTTPD_DYNAMIC_HEADERS in lwipopts.h, this behavior can be changed such that the server inserts the headers automatically based on the extension of the file being served. If this mode is used, be careful to ensure that the file system image used does not already contain the header information.
File system images without headers can be created using the makefsfile tool with the -h command line option.
Notes about valid SSI tags --------------------------
The following assumptions are made about tags used in SSI markers:
1. No tag may contain '-' or whitespace characters within the tag name. 2. Whitespace is allowed between the tag leadin "<!--#" and the start of the tag name and between the tag name and the leadout string "-->". 3. The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters.
Notes on CGI usage ------------------
The simple CGI support offered here works with GET method requests only and can handle up to 16 parameters encoded into the URI. The handler function may not write directly to the HTTP output but must return a filename that the HTTP server will send to the browser as a response to the incoming CGI request.
The list of supported file types is quite short, so if makefsdata complains about an unknown extension, make sure to add it (and its doctype) to the 'g_psHTTPHeaders' list.
Function Documentation
static void get_tag_insert | ( | struct http_state * | hs ) | [static] |
Insert a tag (found in an shtml in the form of "<!--#tagname-->" into the file.
The tag's name is stored in ssi->tag_name (NULL-terminated), the replacement should be written to hs->tag_insert (up to a length of LWIP_HTTPD_MAX_TAG_INSERT_LEN). The amount of data written is stored to ssi->tag_insert_len.
- Parameters:
-
hs http connection state
Generate the relevant HTTP headers for the given filename and write them into the supplied buffer.
Sub-function of http_send(): send dynamic headers
- Returns:
- : - HTTP_NO_DATA_TO_SEND: no new data has been enqueued
- HTTP_DATA_TO_SEND_CONTINUE: continue with sending HTTP body
- HTTP_DATA_TO_SEND_BREAK: data has been enqueued, headers pending, so don't send HTTP body yet
Sub-function of http_send(): end-of-file (or block) is reached, either close the file or read the next block (if supported).
- Returns:
- : 0 if the file is finished or no data has been read 1 if the file is not finished and data has been read
Sub-function of http_send(): This is the normal send-routine for non-ssi files
- Returns:
- : - 1: data has been written (so call tcp_ouput)
- 0: no data has been written (no need to call tcp_output)
Sub-function of http_send(): This is the send-routine for ssi files
- Returns:
- : - 1: data has been written (so call tcp_ouput)
- 0: no data has been written (no need to call tcp_output)
Try to send more data on this pcb.
- Parameters:
-
pcb the pcb to send data hs connection state
Initialize a http connection with a file to send for an error message
- Parameters:
-
hs http connection state error_nr HTTP error number
- Returns:
- ERR_OK if file was found and hs has been initialized correctly another err_t otherwise
Get the file struct for a 404 error page. Tries some file names and returns NULL if none found.
- Parameters:
-
uri pointer that receives the actual file name URI
- Returns:
- file struct for the error page or NULL no matching file was found
Pass received POST body data to the application and correctly handle returning a response document or closing the connection. ATTENTION: The application is responsible for the pbuf now, so don't free it!
- Parameters:
-
hs http connection state p pbuf to pass to the application
- Returns:
- ERR_OK if passed successfully, another err_t if the response file hasn't been found (after POST finished)
Handle a post request. Called from http_parse_request when method 'POST' is found.
- Parameters:
-
p The input pbuf (containing the POST header and body). hs The http connection state. data HTTP request (header and part of body) from input pbuf(s). data_len Size of 'data'. uri The HTTP URI parsed from input pbuf(s). uri_end Pointer to the end of 'uri' (here, the rest of the HTTP header starts).
- Returns:
- ERR_OK: POST correctly parsed and accepted by the application. ERR_INPROGRESS: POST not completely parsed (no error yet) another err_t: Error parsing POST or denied by the application
A POST implementation can call this function to update the TCP window. This can be used to throttle data reception (e.g. when received data is programmed to flash and data is received faster than programmed).
- Parameters:
-
connection A connection handle passed to httpd_post_begin for which httpd_post_finished has *NOT* been called yet! recved_len Length of data received (for window update)
Try to send more data if file has been blocked before This is a callback function passed to fs_read_async().
When data has been received in the correct state, try to parse it as a HTTP request.
- Parameters:
-
inp the received pbuf hs the connection state pcb the tcp_pcb which received this packet
- Returns:
- ERR_OK if request was OK and hs has been initialized correctly ERR_INPROGRESS if request was OK so far but not fully received another err_t otherwise
Try to find the file specified by uri and, if found, initialize hs accordingly.
- Parameters:
-
hs the connection state uri the HTTP header URI is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)
- Returns:
- ERR_OK if file was found and hs has been initialized correctly another err_t otherwise
Initialize a http connection with a file to send (if found). Called by http_find_file and http_find_error_file.
- Parameters:
-
hs http connection state file file structure to send (or NULL if not found) is_09 1 if the request is HTTP/0.9 (no HTTP headers in response) uri the HTTP header URI tag_check enable SSI tag checking params != NULL if URI has parameters (separated by '?')
- Returns:
- ERR_OK if file was found and hs has been initialized correctly another err_t otherwise
The pcb had an error and is already deallocated. The argument might still be valid (if != NULL).
Data has been sent and acknowledged by the remote host. This means that more data can be sent.
The poll function is called every 2nd second. If there has been no data sent (which resets the retries) in 8 seconds, close. If the last portion of a file has not been sent in 2 seconds, close.
This could be increased, but we don't want to waste resources for bad connections.
Data has been received on this pcb. For HTTP 1.0, this should normally only happen once (if the request fits in one packet).
A new incoming connection has been accepted.
Initialize the httpd: set up a listening PCB and bind it to the defined port
Set the SSI handler function.
- Parameters:
-
ssi_handler the SSI handler function tags an array of SSI tag strings to search for in SSI-enabled files num_tags number of tags in the 'tags' array
Set an array of CGI filenames/handler functions
- Parameters:
-
cgis an array of CGI filenames/handler functions num_handlers number of elements in the 'cgis' array
Definition at line 745 of file lwip_httpd.c.
Generated on Tue Jul 12 2022 12:22:34 by
