Embed: (wiki syntax)

« Back to documentation index

HTTP server

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:
hshttp 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:
pcbthe pcb to send data
hsconnection state

Initialize a http connection with a file to send for an error message

Parameters:
hshttp connection state
error_nrHTTP 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:
uripointer 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:
hshttp connection state
ppbuf 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:
pThe input pbuf (containing the POST header and body).
hsThe http connection state.
dataHTTP request (header and part of body) from input pbuf(s).
data_lenSize of 'data'.
uriThe HTTP URI parsed from input pbuf(s).
uri_endPointer 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:
connectionA connection handle passed to httpd_post_begin for which httpd_post_finished has *NOT* been called yet!
recved_lenLength 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:
inpthe received pbuf
hsthe connection state
pcbthe 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:
hsthe connection state
urithe HTTP header URI
is_091 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:
hshttp connection state
filefile structure to send (or NULL if not found)
is_091 if the request is HTTP/0.9 (no HTTP headers in response)
urithe HTTP header URI
tag_checkenable 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_handlerthe SSI handler function
tagsan array of SSI tag strings to search for in SSI-enabled files
num_tagsnumber of tags in the 'tags' array

Set an array of CGI filenames/handler functions

Parameters:
cgisan array of CGI filenames/handler functions
num_handlersnumber of elements in the 'cgis' array

Definition at line 745 of file lwip_httpd.c.