Handle HTTP Post Method
Dependencies: EthernetNetIf HTTPServer mbed
PostHandler.cpp@0:5ec5448dc8c5, 2012-12-01 (annotated)
- Committer:
- nobuki
- Date:
- Sat Dec 01 15:10:39 2012 +0000
- Revision:
- 0:5ec5448dc8c5
Version 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nobuki | 0:5ec5448dc8c5 | 1 | #include "PostHandler.h" |
nobuki | 0:5ec5448dc8c5 | 2 | |
nobuki | 0:5ec5448dc8c5 | 3 | //#define __DEBUG |
nobuki | 0:5ec5448dc8c5 | 4 | #include <dbg.h> |
nobuki | 0:5ec5448dc8c5 | 5 | |
nobuki | 0:5ec5448dc8c5 | 6 | #define DELIMITER ("&") |
nobuki | 0:5ec5448dc8c5 | 7 | |
nobuki | 0:5ec5448dc8c5 | 8 | extern bool g_bLed1; |
nobuki | 0:5ec5448dc8c5 | 9 | extern bool g_bLed2; |
nobuki | 0:5ec5448dc8c5 | 10 | extern bool g_bLed3; |
nobuki | 0:5ec5448dc8c5 | 11 | extern int g_iSpeed; |
nobuki | 0:5ec5448dc8c5 | 12 | extern double g_dInterval; |
nobuki | 0:5ec5448dc8c5 | 13 | |
nobuki | 0:5ec5448dc8c5 | 14 | AnalogIn g_ain_brightness(p15); |
nobuki | 0:5ec5448dc8c5 | 15 | AnalogIn g_ain_temperature(p20); |
nobuki | 0:5ec5448dc8c5 | 16 | |
nobuki | 0:5ec5448dc8c5 | 17 | PostHandler::PostHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket) |
nobuki | 0:5ec5448dc8c5 | 18 | { |
nobuki | 0:5ec5448dc8c5 | 19 | DBG("PostHandler()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 20 | } |
nobuki | 0:5ec5448dc8c5 | 21 | |
nobuki | 0:5ec5448dc8c5 | 22 | PostHandler::~PostHandler() |
nobuki | 0:5ec5448dc8c5 | 23 | { |
nobuki | 0:5ec5448dc8c5 | 24 | DBG("~PostHandler()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 25 | } |
nobuki | 0:5ec5448dc8c5 | 26 | void PostHandler::printString( const char* pszString ) |
nobuki | 0:5ec5448dc8c5 | 27 | { |
nobuki | 0:5ec5448dc8c5 | 28 | writeData( pszString, strlen(pszString) ); |
nobuki | 0:5ec5448dc8c5 | 29 | } |
nobuki | 0:5ec5448dc8c5 | 30 | |
nobuki | 0:5ec5448dc8c5 | 31 | void PostHandler::printHtml() |
nobuki | 0:5ec5448dc8c5 | 32 | { |
nobuki | 0:5ec5448dc8c5 | 33 | respHeaders()["Connection"] = "close"; |
nobuki | 0:5ec5448dc8c5 | 34 | |
nobuki | 0:5ec5448dc8c5 | 35 | printString("<html>"); |
nobuki | 0:5ec5448dc8c5 | 36 | printString("<head>\n"); |
nobuki | 0:5ec5448dc8c5 | 37 | printString("<title></title>\n"); |
nobuki | 0:5ec5448dc8c5 | 38 | printString("</head>\n"); |
nobuki | 0:5ec5448dc8c5 | 39 | printString("<body>\n"); |
nobuki | 0:5ec5448dc8c5 | 40 | |
nobuki | 0:5ec5448dc8c5 | 41 | printString("<p>\n"); |
nobuki | 0:5ec5448dc8c5 | 42 | printString("LED1 : "); printString( g_bLed1 ? "ON" : "off" ); printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 43 | printString("LED2 : "); printString( g_bLed2 ? "ON" : "off" ); printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 44 | printString("LED3 : "); printString( g_bLed3 ? "ON" : "off" ); printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 45 | printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 46 | printString("Speed: \n"); |
nobuki | 0:5ec5448dc8c5 | 47 | char szSpeed[10]; |
nobuki | 0:5ec5448dc8c5 | 48 | sprintf( szSpeed, "%d", g_iSpeed ); |
nobuki | 0:5ec5448dc8c5 | 49 | printString( szSpeed ); |
nobuki | 0:5ec5448dc8c5 | 50 | printString("</p>\n"); |
nobuki | 0:5ec5448dc8c5 | 51 | |
nobuki | 0:5ec5448dc8c5 | 52 | printString("<hr>\n"); |
nobuki | 0:5ec5448dc8c5 | 53 | |
nobuki | 0:5ec5448dc8c5 | 54 | printString("<form method=\"post\" action=\"\">\n"); |
nobuki | 0:5ec5448dc8c5 | 55 | printString("<label><input type=\"checkbox\" name=\"led1\" value=\"1\""); if(g_bLed1){ printString(" checked"); } printString(">LED1</label><br><br>\n"); |
nobuki | 0:5ec5448dc8c5 | 56 | printString("<label><input type=\"checkbox\" name=\"led2\" value=\"1\""); if(g_bLed2){ printString(" checked"); } printString(">LED2</label><br><br>\n"); |
nobuki | 0:5ec5448dc8c5 | 57 | printString("<label><input type=\"checkbox\" name=\"led3\" value=\"1\""); if(g_bLed3){ printString(" checked"); } printString(">LED3</label><br><br>\n"); |
nobuki | 0:5ec5448dc8c5 | 58 | printString("Speed<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 59 | printString("<label><input type=\"radio\" name=\"speed\" value=\"1\""); if(1==g_iSpeed){ printString(" checked"); } printString("> 1 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 60 | printString("<label><input type=\"radio\" name=\"speed\" value=\"2\""); if(2==g_iSpeed){ printString(" checked"); } printString("> 2 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 61 | printString("<label><input type=\"radio\" name=\"speed\" value=\"3\""); if(3==g_iSpeed){ printString(" checked"); } printString("> 3 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 62 | printString("<label><input type=\"radio\" name=\"speed\" value=\"4\""); if(4==g_iSpeed){ printString(" checked"); } printString("> 4 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 63 | printString("<label><input type=\"radio\" name=\"speed\" value=\"5\""); if(5==g_iSpeed){ printString(" checked"); } printString("> 5 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 64 | printString("<label><input type=\"radio\" name=\"speed\" value=\"6\""); if(6==g_iSpeed){ printString(" checked"); } printString("> 6 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 65 | printString("<label><input type=\"radio\" name=\"speed\" value=\"7\""); if(7==g_iSpeed){ printString(" checked"); } printString("> 7 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 66 | printString("<label><input type=\"radio\" name=\"speed\" value=\"8\""); if(8==g_iSpeed){ printString(" checked"); } printString("> 8 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 67 | printString("<label><input type=\"radio\" name=\"speed\" value=\"9\""); if(9==g_iSpeed){ printString(" checked"); } printString("> 9 </label> \n"); |
nobuki | 0:5ec5448dc8c5 | 68 | printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 69 | printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 70 | printString("<br>\n"); |
nobuki | 0:5ec5448dc8c5 | 71 | printString("<input type=\"submit\" value=\"Send\">\n"); |
nobuki | 0:5ec5448dc8c5 | 72 | printString("</form>\n"); |
nobuki | 0:5ec5448dc8c5 | 73 | |
nobuki | 0:5ec5448dc8c5 | 74 | printString("</body>\n"); |
nobuki | 0:5ec5448dc8c5 | 75 | printString("</html>"); |
nobuki | 0:5ec5448dc8c5 | 76 | } |
nobuki | 0:5ec5448dc8c5 | 77 | |
nobuki | 0:5ec5448dc8c5 | 78 | void PostHandler::doGet() |
nobuki | 0:5ec5448dc8c5 | 79 | { |
nobuki | 0:5ec5448dc8c5 | 80 | DBG("doGet()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 81 | |
nobuki | 0:5ec5448dc8c5 | 82 | printHtml(); |
nobuki | 0:5ec5448dc8c5 | 83 | } |
nobuki | 0:5ec5448dc8c5 | 84 | |
nobuki | 0:5ec5448dc8c5 | 85 | static void analyzePostData( char* pszLine, bool& rbLed1, bool& rbLed2, bool& rbLed3, int& riSpeed ) |
nobuki | 0:5ec5448dc8c5 | 86 | { |
nobuki | 0:5ec5448dc8c5 | 87 | rbLed1 = false; |
nobuki | 0:5ec5448dc8c5 | 88 | rbLed2 = false; |
nobuki | 0:5ec5448dc8c5 | 89 | rbLed3 = false; |
nobuki | 0:5ec5448dc8c5 | 90 | riSpeed = 5; |
nobuki | 0:5ec5448dc8c5 | 91 | char* pszToken = strtok(pszLine, DELIMITER); |
nobuki | 0:5ec5448dc8c5 | 92 | while(pszToken) |
nobuki | 0:5ec5448dc8c5 | 93 | { |
nobuki | 0:5ec5448dc8c5 | 94 | if( 6 == strlen(pszToken) |
nobuki | 0:5ec5448dc8c5 | 95 | && 0 == strncmp(pszToken, "led", 3) ) |
nobuki | 0:5ec5448dc8c5 | 96 | { // led?=1 |
nobuki | 0:5ec5448dc8c5 | 97 | if( '1' == pszToken[3] ){ rbLed1 = true; } |
nobuki | 0:5ec5448dc8c5 | 98 | else if( '2' == pszToken[3] ){ rbLed2 = true; } |
nobuki | 0:5ec5448dc8c5 | 99 | else if( '3' == pszToken[3] ){ rbLed3 = true; } |
nobuki | 0:5ec5448dc8c5 | 100 | } |
nobuki | 0:5ec5448dc8c5 | 101 | else if( 7 == strlen(pszToken) |
nobuki | 0:5ec5448dc8c5 | 102 | && 0 == strncmp(pszToken, "speed", 5) ) |
nobuki | 0:5ec5448dc8c5 | 103 | { // speed=? |
nobuki | 0:5ec5448dc8c5 | 104 | riSpeed = pszToken[6] - '0'; |
nobuki | 0:5ec5448dc8c5 | 105 | } |
nobuki | 0:5ec5448dc8c5 | 106 | pszToken = strtok(NULL, DELIMITER); |
nobuki | 0:5ec5448dc8c5 | 107 | } |
nobuki | 0:5ec5448dc8c5 | 108 | } |
nobuki | 0:5ec5448dc8c5 | 109 | |
nobuki | 0:5ec5448dc8c5 | 110 | void PostHandler::doPost() |
nobuki | 0:5ec5448dc8c5 | 111 | { |
nobuki | 0:5ec5448dc8c5 | 112 | DBG("doPost()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 113 | |
nobuki | 0:5ec5448dc8c5 | 114 | int iCountData = dataLen(); |
nobuki | 0:5ec5448dc8c5 | 115 | if( 0 == iCountData ) |
nobuki | 0:5ec5448dc8c5 | 116 | { |
nobuki | 0:5ec5448dc8c5 | 117 | printHtml(); |
nobuki | 0:5ec5448dc8c5 | 118 | return; |
nobuki | 0:5ec5448dc8c5 | 119 | } |
nobuki | 0:5ec5448dc8c5 | 120 | |
nobuki | 0:5ec5448dc8c5 | 121 | char* pszData = (char*) malloc( sizeof(char) * (iCountData + 1) ); |
nobuki | 0:5ec5448dc8c5 | 122 | readData( pszData, iCountData ); |
nobuki | 0:5ec5448dc8c5 | 123 | pszData[iCountData] = '\0'; |
nobuki | 0:5ec5448dc8c5 | 124 | |
nobuki | 0:5ec5448dc8c5 | 125 | DBG( pszData ); |
nobuki | 0:5ec5448dc8c5 | 126 | |
nobuki | 0:5ec5448dc8c5 | 127 | bool bLed1, bLed2, bLed3; |
nobuki | 0:5ec5448dc8c5 | 128 | int iSpeed; |
nobuki | 0:5ec5448dc8c5 | 129 | analyzePostData( pszData, bLed1, bLed2, bLed3, iSpeed ); |
nobuki | 0:5ec5448dc8c5 | 130 | g_bLed1 = bLed1; |
nobuki | 0:5ec5448dc8c5 | 131 | g_bLed2 = bLed2; |
nobuki | 0:5ec5448dc8c5 | 132 | g_bLed3 = bLed3; |
nobuki | 0:5ec5448dc8c5 | 133 | g_iSpeed = iSpeed; |
nobuki | 0:5ec5448dc8c5 | 134 | g_dInterval = 0.5 + (g_iSpeed - 1) * (0.01 - 0.5) / (9 - 1); |
nobuki | 0:5ec5448dc8c5 | 135 | |
nobuki | 0:5ec5448dc8c5 | 136 | printHtml(); |
nobuki | 0:5ec5448dc8c5 | 137 | } |
nobuki | 0:5ec5448dc8c5 | 138 | |
nobuki | 0:5ec5448dc8c5 | 139 | void PostHandler::doHead() |
nobuki | 0:5ec5448dc8c5 | 140 | { |
nobuki | 0:5ec5448dc8c5 | 141 | DBG("doHead()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 142 | } |
nobuki | 0:5ec5448dc8c5 | 143 | |
nobuki | 0:5ec5448dc8c5 | 144 | void PostHandler::onReadable() //Data has been read |
nobuki | 0:5ec5448dc8c5 | 145 | { |
nobuki | 0:5ec5448dc8c5 | 146 | DBG("onReadable()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 147 | } |
nobuki | 0:5ec5448dc8c5 | 148 | |
nobuki | 0:5ec5448dc8c5 | 149 | void PostHandler::onWriteable() //Data has been written & buf is free |
nobuki | 0:5ec5448dc8c5 | 150 | { |
nobuki | 0:5ec5448dc8c5 | 151 | DBG("onWriteable()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 152 | close(); //Data written, we can close the connection |
nobuki | 0:5ec5448dc8c5 | 153 | } |
nobuki | 0:5ec5448dc8c5 | 154 | |
nobuki | 0:5ec5448dc8c5 | 155 | void PostHandler::onClose() //Connection is closing |
nobuki | 0:5ec5448dc8c5 | 156 | { |
nobuki | 0:5ec5448dc8c5 | 157 | DBG("onClose()\r\n"); |
nobuki | 0:5ec5448dc8c5 | 158 | } |