Changes made for RPC

Committer:
leihen
Date:
Wed Jun 05 23:39:24 2013 +0000
Revision:
12:ba81cc117fb6
Parent:
9:c2a1462b9b71
Child:
13:aa5338a5e452
Improved throughput of data.
; fixed incorrect Header handling.
; Fixed Support for other FileSystem Handler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leihen 5:dc88012caef1 1 /* FsHandler.cpp */
leihen 5:dc88012caef1 2 #include "mbed.h"
leihen 5:dc88012caef1 3 #include "FsHandler.h"
leihen 5:dc88012caef1 4
leihen 5:dc88012caef1 5
leihen 9:c2a1462b9b71 6 #define _DEBUG 0
leihen 5:dc88012caef1 7
leihen 5:dc88012caef1 8 #if (_DEBUG && !defined(TARGET_LPC11U24))
leihen 5:dc88012caef1 9 #define INFO(x, ...) std::printf("[HTTPFsRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 5:dc88012caef1 10 #define WARN(x, ...) std::printf("[HTTPFsRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 5:dc88012caef1 11 #define ERR(x, ...) std::printf("[HTTPFsRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 5:dc88012caef1 12 #else
leihen 5:dc88012caef1 13 #define INFO(x, ...)
leihen 5:dc88012caef1 14 #define WARN(x, ...)
leihen 5:dc88012caef1 15 #define ERR(x, ...)
leihen 5:dc88012caef1 16 #endif
leihen 5:dc88012caef1 17
leihen 5:dc88012caef1 18
leihen 5:dc88012caef1 19
leihen 12:ba81cc117fb6 20 static int matchstrings(const char* one, const char* two)
leihen 12:ba81cc117fb6 21 {
leihen 12:ba81cc117fb6 22 int m = 0;
leihen 12:ba81cc117fb6 23
leihen 12:ba81cc117fb6 24 for (m = 0; m < min(strlen(one), strlen(two)) ; m++) {
leihen 12:ba81cc117fb6 25 if (one[m] != two[m])
leihen 12:ba81cc117fb6 26 return m;
leihen 12:ba81cc117fb6 27 }
leihen 12:ba81cc117fb6 28 return m;
leihen 12:ba81cc117fb6 29 }
leihen 5:dc88012caef1 30
leihen 5:dc88012caef1 31 std::map<const char*, const char*> HTTPFsRequestHandler::m_fsMap;
leihen 5:dc88012caef1 32
leihen 5:dc88012caef1 33 HTTPFsRequestHandler::HTTPFsRequestHandler(const char* rootPath, const char* localPath, HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
leihen 5:dc88012caef1 34 : HTTPRequestHandler(Msg, Tcp)
leihen 5:dc88012caef1 35 {
leihen 5:dc88012caef1 36 m_rootPath = rootPath;
leihen 5:dc88012caef1 37 m_localPath = localPath;
leihen 5:dc88012caef1 38
leihen 12:ba81cc117fb6 39 string myPath = m_rootPath + m_localPath;
leihen 12:ba81cc117fb6 40
leihen 5:dc88012caef1 41 // Now replace the virtual root path with a mounted device path
leihen 5:dc88012caef1 42 std::map<const char*, const char*>::iterator it;
leihen 12:ba81cc117fb6 43 const char *bestMatch = NULL;
leihen 12:ba81cc117fb6 44 const char *bestMatchExchange = NULL;
leihen 12:ba81cc117fb6 45 int match_ind = -1;
leihen 5:dc88012caef1 46 for (it = m_fsMap.begin() ; it != m_fsMap.end() ; it++) {
leihen 5:dc88012caef1 47 // find best match (if the given logical path is containted in the root
leihen 12:ba81cc117fb6 48 int s = matchstrings(myPath.c_str(), it->second);
leihen 12:ba81cc117fb6 49 INFO("Matching Root %s with handler %s results in %d identical characters\n", myPath.c_str(), it->second, s);
leihen 12:ba81cc117fb6 50 if ((s == strlen(it->second)) && (s > match_ind)) {
leihen 12:ba81cc117fb6 51 match_ind = s;
leihen 12:ba81cc117fb6 52 bestMatch = it->first;
leihen 12:ba81cc117fb6 53 bestMatchExchange = it->second;
leihen 5:dc88012caef1 54 }
leihen 5:dc88012caef1 55 }
leihen 12:ba81cc117fb6 56
leihen 12:ba81cc117fb6 57 if (bestMatch != NULL) {
leihen 12:ba81cc117fb6 58 m_rootPath = bestMatch;
leihen 12:ba81cc117fb6 59 m_localPath = string(myPath).substr(strlen(bestMatchExchange));
leihen 12:ba81cc117fb6 60 }
leihen 12:ba81cc117fb6 61
leihen 5:dc88012caef1 62 handleRequest();
leihen 5:dc88012caef1 63 }
leihen 5:dc88012caef1 64
leihen 5:dc88012caef1 65 HTTPFsRequestHandler::~HTTPFsRequestHandler()
leihen 5:dc88012caef1 66 {
leihen 5:dc88012caef1 67 }
leihen 5:dc88012caef1 68
leihen 5:dc88012caef1 69 int HTTPFsRequestHandler::handleGetRequest()
leihen 5:dc88012caef1 70 {
leihen 12:ba81cc117fb6 71 HTTPHeaders headers;
leihen 12:ba81cc117fb6 72
leihen 12:ba81cc117fb6 73 if (m_localPath.length() > 4)
leihen 12:ba81cc117fb6 74 getStandardHeaders(headers, m_localPath.substr(m_localPath.length()-4).c_str());
leihen 12:ba81cc117fb6 75 else
leihen 12:ba81cc117fb6 76 getStandardHeaders(headers);
leihen 12:ba81cc117fb6 77
leihen 12:ba81cc117fb6 78 INFO("Handling Get Request (root = %s, local = %s).", m_rootPath.c_str(), m_localPath.c_str());
leihen 5:dc88012caef1 79 int retval = 0; //success
leihen 5:dc88012caef1 80 std::string reqPath;
leihen 5:dc88012caef1 81
leihen 5:dc88012caef1 82 // Check if we received a directory with the local bath
leihen 5:dc88012caef1 83 if ((m_localPath.length() == 0) || (m_localPath.substr( m_localPath.length()-1, 1) == "/")) {
leihen 5:dc88012caef1 84 // yes, we shall append the default page name
leihen 5:dc88012caef1 85 m_localPath += "index.html";
leihen 5:dc88012caef1 86 }
leihen 5:dc88012caef1 87
leihen 5:dc88012caef1 88 reqPath = m_rootPath + m_localPath;
leihen 5:dc88012caef1 89
leihen 5:dc88012caef1 90 INFO("Mapping \"%s\" to \"%s\"", msg.uri.c_str(), reqPath.c_str());
leihen 5:dc88012caef1 91
leihen 5:dc88012caef1 92 FILE *fp = fopen(reqPath.c_str(), "r");
leihen 5:dc88012caef1 93 if (fp != NULL) {
leihen 12:ba81cc117fb6 94 char * pBuffer = NULL;
leihen 12:ba81cc117fb6 95 int sz = 8192;
leihen 12:ba81cc117fb6 96 while( pBuffer == NULL) {
leihen 12:ba81cc117fb6 97 sz /= 2;
leihen 12:ba81cc117fb6 98 pBuffer = (char*)malloc(sz);
leihen 12:ba81cc117fb6 99 if (sz < 128)
leihen 12:ba81cc117fb6 100 error ("OutOfMemory");
leihen 12:ba81cc117fb6 101 }
leihen 12:ba81cc117fb6 102
leihen 5:dc88012caef1 103 // File was found and can be returned
leihen 5:dc88012caef1 104
leihen 5:dc88012caef1 105 // first determine the size
leihen 5:dc88012caef1 106 fseek(fp, 0, SEEK_END);
leihen 5:dc88012caef1 107 long size = ftell(fp);
leihen 5:dc88012caef1 108 fseek(fp, 0, SEEK_SET);
leihen 5:dc88012caef1 109
leihen 5:dc88012caef1 110 startResponse(200, size);
leihen 5:dc88012caef1 111 while(!feof(fp) && !ferror(fp)) {
leihen 12:ba81cc117fb6 112 int cnt = fread(pBuffer, 1, sz , fp);
leihen 7:cb7fec1265b5 113 if (cnt < 0)
leihen 7:cb7fec1265b5 114 cnt = 0;
leihen 12:ba81cc117fb6 115 processResponse(cnt, pBuffer);
leihen 5:dc88012caef1 116 }
leihen 12:ba81cc117fb6 117 delete pBuffer;
leihen 5:dc88012caef1 118 endResponse();
leihen 5:dc88012caef1 119 fclose(fp);
leihen 5:dc88012caef1 120 }
leihen 5:dc88012caef1 121 else {
leihen 5:dc88012caef1 122 retval = 404;
leihen 5:dc88012caef1 123 ERR("Requested file was not found !");
leihen 5:dc88012caef1 124 }
leihen 5:dc88012caef1 125
leihen 5:dc88012caef1 126 return retval;
leihen 5:dc88012caef1 127 }
leihen 5:dc88012caef1 128
leihen 5:dc88012caef1 129 int HTTPFsRequestHandler::handlePostRequest()
leihen 5:dc88012caef1 130 {
leihen 5:dc88012caef1 131 return 404;
leihen 5:dc88012caef1 132 }
leihen 5:dc88012caef1 133
leihen 5:dc88012caef1 134 int HTTPFsRequestHandler::handlePutRequest()
leihen 5:dc88012caef1 135 {
leihen 5:dc88012caef1 136 return 404;
leihen 5:dc88012caef1 137 }