Embedded WebSockets Experiment

Dependencies:   mbed MD5

Committer:
nandgate
Date:
Tue Jul 26 05:30:53 2011 +0000
Revision:
0:6dee052a3fa4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nandgate 0:6dee052a3fa4 1 #ifndef HTTPSTATICPAGE_H
nandgate 0:6dee052a3fa4 2 #define HTTPSTATICPAGE_H
nandgate 0:6dee052a3fa4 3
nandgate 0:6dee052a3fa4 4 #include "HTTPServer.h"
nandgate 0:6dee052a3fa4 5
nandgate 0:6dee052a3fa4 6 /**
nandgate 0:6dee052a3fa4 7 * A datastorage helper for the HTTPStaticPage class.
nandgate 0:6dee052a3fa4 8 * Stores only the left upload size.
nandgate 0:6dee052a3fa4 9 */
nandgate 0:6dee052a3fa4 10 class HTTPStaticPageData : public HTTPData {
nandgate 0:6dee052a3fa4 11 public: int left;
nandgate 0:6dee052a3fa4 12 };
nandgate 0:6dee052a3fa4 13
nandgate 0:6dee052a3fa4 14 /**
nandgate 0:6dee052a3fa4 15 * This class Provide a Handler to send Static HTTP Pages from the bin file.
nandgate 0:6dee052a3fa4 16 */
nandgate 0:6dee052a3fa4 17 class HTTPStaticPage : public HTTPHandler {
nandgate 0:6dee052a3fa4 18 public:
nandgate 0:6dee052a3fa4 19 /**
nandgate 0:6dee052a3fa4 20 * Constructer takes the pagename and the pagedata.
nandgate 0:6dee052a3fa4 21 * As long as the pagedata is NULL terminated you have not to tell the data length.
nandgate 0:6dee052a3fa4 22 * But if you want to send binary data you should tell us the size.
nandgate 0:6dee052a3fa4 23 */
nandgate 0:6dee052a3fa4 24 HTTPStaticPage(const char *path, const char *page, int length = 0)
nandgate 0:6dee052a3fa4 25 : HTTPHandler(path), _page(page) {
nandgate 0:6dee052a3fa4 26 _size = (length)?length:strlen(_page);
nandgate 0:6dee052a3fa4 27 }
nandgate 0:6dee052a3fa4 28
nandgate 0:6dee052a3fa4 29 HTTPStaticPage(HTTPServer *server, const char *path, const char *page, int length = 0)
nandgate 0:6dee052a3fa4 30 : HTTPHandler(path), _page(page) {
nandgate 0:6dee052a3fa4 31 _size = (length)?length:strlen(_page);
nandgate 0:6dee052a3fa4 32 server->addHandler(this);
nandgate 0:6dee052a3fa4 33 }
nandgate 0:6dee052a3fa4 34
nandgate 0:6dee052a3fa4 35 private:
nandgate 0:6dee052a3fa4 36 /**
nandgate 0:6dee052a3fa4 37 * A this Static Page is requested!
nandgate 0:6dee052a3fa4 38 * Prepare a datastorage helper "HTTPStaticPageHelper" to store the left data size.
nandgate 0:6dee052a3fa4 39 * And return HTTP_OK
nandgate 0:6dee052a3fa4 40 */
nandgate 0:6dee052a3fa4 41 virtual HTTPStatus init(HTTPConnection *con) const {
nandgate 0:6dee052a3fa4 42 HTTPStaticPageData *data = new HTTPStaticPageData();
nandgate 0:6dee052a3fa4 43 con->data = data;
nandgate 0:6dee052a3fa4 44 data->left = _size;
nandgate 0:6dee052a3fa4 45 con->setLength(_size);
nandgate 0:6dee052a3fa4 46 return HTTP_OK;
nandgate 0:6dee052a3fa4 47 }
nandgate 0:6dee052a3fa4 48
nandgate 0:6dee052a3fa4 49 /**
nandgate 0:6dee052a3fa4 50 * Send the maximum data out to the client.
nandgate 0:6dee052a3fa4 51 * If the file is complete transmitted close connection by returning HTTP_SuccessEnded
nandgate 0:6dee052a3fa4 52 */
nandgate 0:6dee052a3fa4 53 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
nandgate 0:6dee052a3fa4 54 HTTPStaticPageData *data = static_cast<HTTPStaticPageData *>(con->data);
nandgate 0:6dee052a3fa4 55 int len = min(maximum, data->left);
nandgate 0:6dee052a3fa4 56 err_t err;
nandgate 0:6dee052a3fa4 57
nandgate 0:6dee052a3fa4 58 do {
nandgate 0:6dee052a3fa4 59 err = con->write((void*)&_page[_size - data->left], len, 1);
nandgate 0:6dee052a3fa4 60 if(err == ERR_MEM) {
nandgate 0:6dee052a3fa4 61 len >>= 1;
nandgate 0:6dee052a3fa4 62 }
nandgate 0:6dee052a3fa4 63 } while(err == ERR_MEM && len > 1);
nandgate 0:6dee052a3fa4 64 if(err == ERR_OK) {
nandgate 0:6dee052a3fa4 65 data->left -= len;
nandgate 0:6dee052a3fa4 66 }
nandgate 0:6dee052a3fa4 67
nandgate 0:6dee052a3fa4 68 return (data->left)? HTTP_Success : HTTP_SuccessEnded;
nandgate 0:6dee052a3fa4 69 }
nandgate 0:6dee052a3fa4 70
nandgate 0:6dee052a3fa4 71 /** Pointer to the page data */
nandgate 0:6dee052a3fa4 72 const char *_page;
nandgate 0:6dee052a3fa4 73
nandgate 0:6dee052a3fa4 74 /** page data size*/
nandgate 0:6dee052a3fa4 75 int _size;
nandgate 0:6dee052a3fa4 76 };
nandgate 0:6dee052a3fa4 77
nandgate 0:6dee052a3fa4 78 #endif