Single instance HTTP Server using new Ethernet Interface. Blocking mode only; this improved stability, but the HTTP server must be started from a separate thread.

Dependents:   SmartLight

Fork of HTTPServer by Henry Leinen

Committer:
leihen
Date:
Sat Jun 01 17:47:45 2013 +0000
Revision:
7:cb7fec1265b5
Parent:
5:dc88012caef1
Child:
9:c2a1462b9b71
Fixed a Problem with incorrect HttpBody size when returning GET Request data.
; Fixed incorrect variable size for returned data, which led to a Problem when returned data length exceeds 65535 Bytes.

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 5:dc88012caef1 6 #define _DEBUG 1
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 7:cb7fec1265b5 19 #define MAX_BUFFERSIZE 512
leihen 5:dc88012caef1 20 static char buffer[MAX_BUFFERSIZE];
leihen 5:dc88012caef1 21
leihen 5:dc88012caef1 22
leihen 5:dc88012caef1 23 std::map<const char*, const char*> HTTPFsRequestHandler::m_fsMap;
leihen 5:dc88012caef1 24
leihen 5:dc88012caef1 25 HTTPFsRequestHandler::HTTPFsRequestHandler(const char* rootPath, const char* localPath, HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
leihen 5:dc88012caef1 26 : HTTPRequestHandler(Msg, Tcp)
leihen 5:dc88012caef1 27 {
leihen 5:dc88012caef1 28 m_rootPath = rootPath;
leihen 5:dc88012caef1 29 m_localPath = localPath;
leihen 5:dc88012caef1 30
leihen 5:dc88012caef1 31 // Now replace the virtual root path with a mounted device path
leihen 5:dc88012caef1 32 std::map<const char*, const char*>::iterator it;
leihen 5:dc88012caef1 33 for (it = m_fsMap.begin() ; it != m_fsMap.end() ; it++) {
leihen 5:dc88012caef1 34 // find best match (if the given logical path is containted in the root
leihen 5:dc88012caef1 35 if (m_rootPath.find( it->second ) == 0) {
leihen 5:dc88012caef1 36 m_rootPath = it->first;
leihen 5:dc88012caef1 37 break;
leihen 5:dc88012caef1 38 }
leihen 5:dc88012caef1 39 }
leihen 5:dc88012caef1 40
leihen 5:dc88012caef1 41 handleRequest();
leihen 5:dc88012caef1 42 }
leihen 5:dc88012caef1 43
leihen 5:dc88012caef1 44 HTTPFsRequestHandler::~HTTPFsRequestHandler()
leihen 5:dc88012caef1 45 {
leihen 5:dc88012caef1 46 }
leihen 5:dc88012caef1 47
leihen 5:dc88012caef1 48 int HTTPFsRequestHandler::handleGetRequest()
leihen 5:dc88012caef1 49 {
leihen 5:dc88012caef1 50 INFO("Handling Get Request.");
leihen 5:dc88012caef1 51 int retval = 0; //success
leihen 5:dc88012caef1 52 std::string reqPath;
leihen 5:dc88012caef1 53
leihen 5:dc88012caef1 54 // Check if we received a directory with the local bath
leihen 5:dc88012caef1 55 if ((m_localPath.length() == 0) || (m_localPath.substr( m_localPath.length()-1, 1) == "/")) {
leihen 5:dc88012caef1 56 // yes, we shall append the default page name
leihen 5:dc88012caef1 57 m_localPath += "index.html";
leihen 5:dc88012caef1 58 }
leihen 5:dc88012caef1 59
leihen 5:dc88012caef1 60 reqPath = m_rootPath + m_localPath;
leihen 5:dc88012caef1 61
leihen 5:dc88012caef1 62 INFO("Mapping \"%s\" to \"%s\"", msg.uri.c_str(), reqPath.c_str());
leihen 5:dc88012caef1 63
leihen 5:dc88012caef1 64 FILE *fp = fopen(reqPath.c_str(), "r");
leihen 5:dc88012caef1 65 if (fp != NULL) {
leihen 5:dc88012caef1 66 // File was found and can be returned
leihen 5:dc88012caef1 67
leihen 5:dc88012caef1 68 // first determine the size
leihen 5:dc88012caef1 69 fseek(fp, 0, SEEK_END);
leihen 5:dc88012caef1 70 long size = ftell(fp);
leihen 5:dc88012caef1 71 fseek(fp, 0, SEEK_SET);
leihen 5:dc88012caef1 72
leihen 5:dc88012caef1 73 startResponse(200, size);
leihen 5:dc88012caef1 74 while(!feof(fp) && !ferror(fp)) {
leihen 5:dc88012caef1 75 int cnt = fread(buffer, 1, MAX_BUFFERSIZE , fp);
leihen 7:cb7fec1265b5 76 if (cnt < 0)
leihen 7:cb7fec1265b5 77 cnt = 0;
leihen 5:dc88012caef1 78 processResponse(cnt, buffer);
leihen 5:dc88012caef1 79 }
leihen 5:dc88012caef1 80 endResponse();
leihen 5:dc88012caef1 81 fclose(fp);
leihen 5:dc88012caef1 82 }
leihen 5:dc88012caef1 83 else {
leihen 5:dc88012caef1 84 retval = 404;
leihen 5:dc88012caef1 85 ERR("Requested file was not found !");
leihen 5:dc88012caef1 86 }
leihen 5:dc88012caef1 87
leihen 5:dc88012caef1 88 return retval;
leihen 5:dc88012caef1 89 }
leihen 5:dc88012caef1 90
leihen 5:dc88012caef1 91 int HTTPFsRequestHandler::handlePostRequest()
leihen 5:dc88012caef1 92 {
leihen 5:dc88012caef1 93 return 404;
leihen 5:dc88012caef1 94 }
leihen 5:dc88012caef1 95
leihen 5:dc88012caef1 96 int HTTPFsRequestHandler::handlePutRequest()
leihen 5:dc88012caef1 97 {
leihen 5:dc88012caef1 98 return 404;
leihen 5:dc88012caef1 99 }