Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: httpServer-WIZwiki-W7500
This library is for HTTP server.
Refer to Example program(https://developer.mbed.org/teams/WIZnet/code/httpServer-WIZwiki-W7500/)
Diff: Handler/FsHandler.cpp
- Revision:
- 0:e59cc54df17c
--- /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;
+}
+