My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Tue Nov 20 12:18:53 2012 +0000
Revision:
1:284f2df30cf9
Parent:
0:7a64fbb4069d
local changes

Who changed what in which revision?

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