Single instance HTTP Server using WiFly Interface.

Dependents:   WiFlyHTTPServerSample MultiThreadingHTTPServer

This is my implementation for a HTTP Server using the WiFly Interface. Please note that this is still under development.

It may still contain several bugs. I have tested it using a 1768 on an application board plus RN-XV board.

Currently there is only a FileSystem implemented. Also it is limited to GET request.

I try to extend it further so it will be more useful.

Btw, it does NOT work with RTOS, which seems not to be the Problem of my library.

Do not Forget to Import the WiFly Interface into your Project when using this library.

Change History:

REV5: - added support for basic RPC GET request functionality.

REV4: - added argument parsing from the request uri. - documentation extended and updated.

Committer:
leihen
Date:
Sat Jun 01 06:24:43 2013 +0000
Revision:
5:dc88012caef1
Child:
7:cb7fec1265b5
Now also supporting RPC get requests

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 5:dc88012caef1 19 #define MAX_BUFFERSIZE 128
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 5:dc88012caef1 76 processResponse(cnt, buffer);
leihen 5:dc88012caef1 77 }
leihen 5:dc88012caef1 78 endResponse();
leihen 5:dc88012caef1 79 fclose(fp);
leihen 5:dc88012caef1 80 }
leihen 5:dc88012caef1 81 else {
leihen 5:dc88012caef1 82 retval = 404;
leihen 5:dc88012caef1 83 ERR("Requested file was not found !");
leihen 5:dc88012caef1 84 }
leihen 5:dc88012caef1 85
leihen 5:dc88012caef1 86 return retval;
leihen 5:dc88012caef1 87 }
leihen 5:dc88012caef1 88
leihen 5:dc88012caef1 89 int HTTPFsRequestHandler::handlePostRequest()
leihen 5:dc88012caef1 90 {
leihen 5:dc88012caef1 91 return 404;
leihen 5:dc88012caef1 92 }
leihen 5:dc88012caef1 93
leihen 5:dc88012caef1 94 int HTTPFsRequestHandler::handlePutRequest()
leihen 5:dc88012caef1 95 {
leihen 5:dc88012caef1 96 return 404;
leihen 5:dc88012caef1 97 }