Handle HTTP Post Method

Dependencies:   EthernetNetIf HTTPServer mbed

Committer:
nobuki
Date:
Sat Dec 01 15:10:39 2012 +0000
Revision:
0:5ec5448dc8c5
Version 1

Who changed what in which revision?

UserRevisionLine numberNew 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 }