httpserver for Internet piano

Dependents:   Internet-Piano_WIZwiki-W7500 Internet-Piano_India_Academy

Fork of httpServer by IOP

Revision:
0:e59cc54df17c
Child:
1:8291b3e9c064
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Handler/FsHandler.cpp	Mon Jun 29 09:03:40 2015 +0000
@@ -0,0 +1,211 @@
+/* FsHandler.cpp */
+#include "mbed.h"
+#include "FsHandler.h"
+//#define DEBUG
+#include "hl_debug.h"
+
+DigitalOut led_red(LED1);
+DigitalOut led_green(LED2);
+DigitalOut led_blue(LED3);
+
+DigitalIn  din(PC_14);
+
+
+static int matchstrings(const char* one, const char* two)
+{
+    int m = 0;
+    
+    for (m = 0; m < min(strlen(one), strlen(two)) ; m++) {
+        if (one[m] != two[m])
+            return m;
+    }
+    return m;
+}
+
+std::map<const char*, const char*> HTTPFsRequestHandler::m_fsMap;
+ 
+HTTPFsRequestHandler::HTTPFsRequestHandler(const char* rootPath, const char* localPath, HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
+    : HTTPRequestHandler(Msg, Tcp)
+{
+    m_rootPath = rootPath;
+    m_localPath = localPath;
+    
+    string myPath = m_rootPath + m_localPath;
+    
+    //  Now replace the virtual root path with a mounted device path
+    std::map<const char*, const char*>::iterator it;
+    const char *bestMatch = NULL;
+    const char *bestMatchExchange = NULL;
+    int match_ind = -1;
+    for (it = m_fsMap.begin() ; it != m_fsMap.end() ; it++) {
+        //  find best match (if the given logical path is containted in the root
+        int s = matchstrings(myPath.c_str(), it->second);
+        INFO("Matching Root %s with handler %s results in %d identical characters\n", myPath.c_str(), it->second, s);
+        if ((s == strlen(it->second)) && (s > match_ind)) {
+            match_ind = s;
+            bestMatch = it->first;
+            bestMatchExchange = it->second;
+        }
+    }
+
+    if (bestMatch != NULL) {
+        m_rootPath = bestMatch;
+        m_localPath = string(myPath).substr(strlen(bestMatchExchange));
+    }
+            
+    handleRequest();
+}
+
+HTTPFsRequestHandler::~HTTPFsRequestHandler()
+{
+}
+
+int HTTPFsRequestHandler::handleGetRequest()
+{
+    HTTPHeaders headers;
+    int retval = 0;   //success
+    uint8_t pin_state;
+    
+    if( std::string::npos != msg.uri.find("get_dio14.cgi") )
+    {
+        if(din)
+            pin_state = 1;
+        else 
+            pin_state = 0;
+        
+        /*
+        *len = sprintf((char *)buf, "DioCallback({\"dio_p\":\"14\",\
+                                            \"dio_s\":\"%d\"\
+                                            });",
+                                            pin_state              // Digital io status
+                                            );
+        
+            
+        Tcp.
+        */
+    }
+    else //read html pages
+    {
+        if (m_localPath.length() > 4) 
+            getStandardHeaders(headers, m_localPath.substr(m_localPath.length()-4).c_str());
+        else
+            getStandardHeaders(headers);
+        
+        INFO("Handling Get Request (root = %s, local = %s).", m_rootPath.c_str(), m_localPath.c_str());
+        
+        std::string reqPath;
+    
+        //  Check if we received a directory with the local bath
+        if ((m_localPath.length() == 0) || (m_localPath.substr( m_localPath.length()-1, 1) == "/")) {
+            //  yes, we shall append the default page name
+            m_localPath += "index.html";
+        }
+        
+        reqPath = m_rootPath + m_localPath;
+        
+        INFO("Mapping \"%s\" to \"%s\"", msg.uri.c_str(), reqPath.c_str());
+            
+        FILE *fp = fopen(reqPath.c_str(), "r");
+        if (fp != NULL) {
+            char * pBuffer = NULL;
+            int sz = 8192;
+            while( pBuffer == NULL) {
+                sz /= 2;
+                pBuffer = (char*)malloc(sz);
+                if (sz < 128)
+                    error ("OutOfMemory");
+            }
+            
+            //  File was found and can be returned
+        
+            //  first determine the size
+            fseek(fp, 0, SEEK_END);
+            long size = ftell(fp);
+            fseek(fp, 0, SEEK_SET);
+        
+            startResponse(200, size);
+            while(!feof(fp) && !ferror(fp)) {
+                int cnt = fread(pBuffer, 1, sz , fp);
+                if (cnt < 0)
+                    cnt = 0;
+                processResponse(cnt, pBuffer);
+            }
+            delete pBuffer;
+            endResponse();
+            fclose(fp);
+        }
+        else {
+            retval = 404;
+            ERR("Requested file was not found !");
+        }
+    }
+    
+    return retval;
+}
+
+int HTTPFsRequestHandler::handlePostRequest()
+{
+    
+    int pin = 0;
+    
+    if( std::string::npos != msg.uri.find("set_dio.cgi") )
+    {
+        pin = get_http_param_value("pin");
+        if(pin == 8)
+        {
+            led_red = get_http_param_value("val");
+        }
+        else if(pin == 9)
+        {
+            led_green = get_http_param_value("val");
+        }
+        else if(pin == 5)
+        {
+            led_blue = get_http_param_value("val");
+        }
+        else
+        {
+            WARN("Wrong pin number");
+        }   
+        
+        return 0;
+    }    
+    else
+    {
+           return 404;
+    }
+}
+
+int HTTPFsRequestHandler::handlePutRequest()
+{
+    return 404;
+}
+
+uint32_t HTTPFsRequestHandler::get_http_param_value(char* param_name)
+{
+    uint8_t * name = 0;
+    uint8_t * pos2;
+    uint16_t len = 0;
+    char value[10];
+    uint32_t ret = 0;
+    
+    //msg.attri
+    if((name = (uint8_t *)strstr(msg.attri, param_name)))
+    {
+        name += strlen(param_name) + 1;
+        pos2 = (uint8_t*)strstr((char*)name, "&");
+        if(!pos2)
+        {
+            pos2 = name + strlen((char*)name);
+        }
+        len = pos2 - name;
+        
+        if(len)
+        {
+            strncpy(value, (char*)name, len);
+            ret = atoi(value);
+        }
+    }
+    return ret;
+}
+