Example of HTTPServer with additional features: * SNTPClient, DST rules * Link status indication * Local or SDCard-based WebServer * RPC-able class * Static and Dynamic HTML page

Dependencies:   mbed

Committer:
iva2k
Date:
Tue Jan 12 07:41:55 2010 +0000
Revision:
2:360fda42fefd
Parent:
0:886e4b3119ad

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:886e4b3119ad 1 #ifndef HTTPDYNAMICPAGE_H
iva2k 0:886e4b3119ad 2 #define HTTPDYNAMICPAGE_H
iva2k 0:886e4b3119ad 3
iva2k 0:886e4b3119ad 4 #include "HTTPServer.h"
iva2k 0:886e4b3119ad 5
iva2k 0:886e4b3119ad 6 /**
iva2k 0:886e4b3119ad 7 * A datastorage helper for the HTTPDynamicPage class.
iva2k 0:886e4b3119ad 8 * Stores dynamically created page data and the size left to upload.
iva2k 0:886e4b3119ad 9 */
iva2k 0:886e4b3119ad 10 class HTTPDynamicPageData : public HTTPData {
iva2k 0:886e4b3119ad 11 public:
iva2k 0:886e4b3119ad 12 HTTPDynamicPageData()
iva2k 0:886e4b3119ad 13 : page_free(NULL), page(NULL), size(0), _left(0) {}
iva2k 0:886e4b3119ad 14 virtual ~HTTPDynamicPageData() {
iva2k 0:886e4b3119ad 15 if (page_free && page) {
iva2k 0:886e4b3119ad 16 page_free(page);
iva2k 0:886e4b3119ad 17 }
iva2k 0:886e4b3119ad 18 }
iva2k 0:886e4b3119ad 19
iva2k 0:886e4b3119ad 20 /** Pointer to garbage collection function (for freeing page data)
iva2k 0:886e4b3119ad 21 * Should be set by callback function to a suitable free() if page is dynamically allocated
iva2k 0:886e4b3119ad 22 */
iva2k 0:886e4b3119ad 23 void (*page_free)(void *page);
iva2k 0:886e4b3119ad 24
iva2k 0:886e4b3119ad 25 /** Pointer to the page data */
iva2k 0:886e4b3119ad 26 char *page;
iva2k 0:886e4b3119ad 27
iva2k 0:886e4b3119ad 28 /** Page data size
iva2k 0:886e4b3119ad 29 * As long as the page is NULL terminated you don't have to tell the data length.
iva2k 0:886e4b3119ad 30 * But if you want to send binary data you should tell us the size.
iva2k 0:886e4b3119ad 31 */
iva2k 0:886e4b3119ad 32 int size;
iva2k 0:886e4b3119ad 33
iva2k 0:886e4b3119ad 34 /** Page data size left for the upload */
iva2k 0:886e4b3119ad 35 int _left;
iva2k 0:886e4b3119ad 36 };
iva2k 0:886e4b3119ad 37
iva2k 0:886e4b3119ad 38 /**
iva2k 0:886e4b3119ad 39 * This class Provide a Handler to send Static HTTP Pages from the bin file.
iva2k 0:886e4b3119ad 40 */
iva2k 0:886e4b3119ad 41 class HTTPDynamicPage : public HTTPHandler {
iva2k 0:886e4b3119ad 42 public:
iva2k 0:886e4b3119ad 43 /**
iva2k 0:886e4b3119ad 44 * Constructor takes the page path and the page callback function.
iva2k 0:886e4b3119ad 45 */
iva2k 0:886e4b3119ad 46 HTTPDynamicPage(const char *path, HTTPStatus page_fnc(HTTPConnection *con, HTTPDynamicPageData *pd))
iva2k 0:886e4b3119ad 47 : HTTPHandler(path), _page_fnc(page_fnc) {
iva2k 0:886e4b3119ad 48 }
iva2k 0:886e4b3119ad 49
iva2k 0:886e4b3119ad 50 HTTPDynamicPage(HTTPServer *server, const char *path, HTTPStatus page_fnc(HTTPConnection *con, HTTPDynamicPageData *pd))
iva2k 0:886e4b3119ad 51 : HTTPHandler(path), _page_fnc(page_fnc) {
iva2k 0:886e4b3119ad 52 server->addHandler(this);
iva2k 0:886e4b3119ad 53 }
iva2k 0:886e4b3119ad 54
iva2k 0:886e4b3119ad 55 private:
iva2k 0:886e4b3119ad 56 /**
iva2k 0:886e4b3119ad 57 * This Dynamic Page is requested!
iva2k 0:886e4b3119ad 58 * Prepare a datastorage helper "HTTPDynamicPageData", create the page and store in helper, then initialize remaining data size.
iva2k 0:886e4b3119ad 59 * And return HTTP_OK if all ok.
iva2k 0:886e4b3119ad 60 */
iva2k 0:886e4b3119ad 61 virtual HTTPStatus init(HTTPConnection *con) const {
iva2k 0:886e4b3119ad 62 HTTPDynamicPageData *data = new HTTPDynamicPageData();
iva2k 0:886e4b3119ad 63 con->data = data;
iva2k 0:886e4b3119ad 64 HTTPStatus status = _page_fnc(con, data); // assigns data->page, data->size and optionally data->page_free
iva2k 0:886e4b3119ad 65 if (!data->size && data->page)
iva2k 0:886e4b3119ad 66 data->size = strlen(data->page);
iva2k 0:886e4b3119ad 67 data->_left = data->size;
iva2k 0:886e4b3119ad 68 con->setLength(data->size);
iva2k 0:886e4b3119ad 69 return status;
iva2k 0:886e4b3119ad 70 }
iva2k 0:886e4b3119ad 71
iva2k 0:886e4b3119ad 72 /**
iva2k 0:886e4b3119ad 73 * Send the maximum data out to the client.
iva2k 0:886e4b3119ad 74 * If the file is complete transmitted close connection by returning HTTP_SuccessEnded
iva2k 0:886e4b3119ad 75 */
iva2k 0:886e4b3119ad 76 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
iva2k 0:886e4b3119ad 77 HTTPDynamicPageData *data = static_cast<HTTPDynamicPageData *>(con->data);
iva2k 0:886e4b3119ad 78 int len = min(maximum, data->_left);
iva2k 0:886e4b3119ad 79 err_t err;
iva2k 0:886e4b3119ad 80
iva2k 0:886e4b3119ad 81 do {
iva2k 0:886e4b3119ad 82 err = con->write((void*)&data->page[data->size - data->_left], len, 1);
iva2k 0:886e4b3119ad 83 if (err == ERR_MEM) {
iva2k 0:886e4b3119ad 84 len >>= 1;
iva2k 0:886e4b3119ad 85 }
iva2k 0:886e4b3119ad 86 } while(err == ERR_MEM && len > 1);
iva2k 0:886e4b3119ad 87 if (err == ERR_OK) {
iva2k 0:886e4b3119ad 88 data->_left -= len;
iva2k 0:886e4b3119ad 89 }
iva2k 0:886e4b3119ad 90 return (data->_left) ? HTTP_Success : HTTP_SuccessEnded;
iva2k 0:886e4b3119ad 91 }
iva2k 0:886e4b3119ad 92
iva2k 0:886e4b3119ad 93 HTTPStatus (*_page_fnc)(HTTPConnection *con, HTTPDynamicPageData *pd);
iva2k 0:886e4b3119ad 94 };
iva2k 0:886e4b3119ad 95
iva2k 0:886e4b3119ad 96 #endif