WIZwikiREST ver1.0 (Memory problem)
Dependencies: MbedJSONValue WIZnetInterface mbed
HTTPServer.cpp
- Committer:
- joon874
- Date:
- 2016-03-02
- Revision:
- 0:5886f525a4ad
File content as of revision 0:5886f525a4ad:
#include <string.h>
#include "HTTPServer.h"
#include "MbedJSONValue.h"
extern MbedJSONValue WIZwikiREST;
bool cmp(char* a, char* b)
{
return strcmp(a,b) < 0;
}
HTTPServer::HTTPServer():
socket(),
handlers(&cmp)
{
}
HTTPServer::~HTTPServer()
{
for(std::map<char*, RequestHandler*>::iterator itor = handlers.begin();
itor != handlers.end();
++itor)
delete itor->second;
}
bool HTTPServer::init(int port)
{
socket.set_blocking(true);
if(socket.bind(port))
{
printf("Could not bind on port %d.\n", port);
return false;
}
if(socket.listen())
{
printf("Could not listen %d\n", port);
return false;
}
return true;
}
void HTTPServer::run()
{
TCPSocketConnection c;
while(true)
{
while(socket.accept(c));
c.set_blocking(false, 1000);
while(c.is_connected())
{
int n = c.receive_all(HTTPBUF, sizeof(HTTPBUF)-1);
if(n == 0)
{
c.close();
break;
}
else if(n != -1)
{
printf("Received data : %d\r\n",n);
HTTPBUF[n] = '\0';
if(handle_request(HTTPBUF) == HTTP_SUCCESS)
{
c.send(rest_result, strlen(rest_result));
//c.send((char*)rest_result.c_str(), 159);
}
else
{
//printf("send fail : %s\r\n",(char*)rest_result.c_str());
c.send(rest_result, strlen(rest_result));
}
}
else
printf("Error while receiving data\n");
}
}
}
HTTP_RESULT HTTPServer::handle_request(char *buffer)
{
char *request_type;
char *request;
//{"Name":"WIZwiki-REST-01","Network":{"IP":"192.168.100.100","SN":"255.255.255.0","GW":"192.168.100.1"},"User":{"Name":"Lawrence","ID":"law","PSWD":"law1234"}} 159
if(buffer)
{
// buffer check
printf("*******************************************************\r\n");
printf("buffer=%s\r\n",buffer);
printf("*******************************************************\r\n");
// type parsing
request_type = strtok(buffer," \r\n");
printf("Type = %s\r\n", request_type);
if(request_type)
{
request = strtok(NULL, " \r\n"); // corrested " " -> " /" : /Name -> Name
if(request)
{
printf("URI = %s\r\n", request);
}
else
{
strcpy(rest_result, "Invaild URI");
printf("%s\r\n",rest_result);
return HTTP_INVALID_URI;
}
}
}
std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
if(itor == handlers.end())
{
strcpy(rest_result, "No request handler found for this type of request.");
return HTTP_INVALID_HANDLE;
}
//if(itor != NULL)
//itor->handle(request, rest_result.c_str());
if(itor->second != NULL)
itor->second->handle(request, rest_result);
else
{
strcpy(rest_result, "Invalid request handler");
return HTTP_INVALID_HANDLE;
}
return HTTP_SUCCESS;
}
void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
{
handlers[name] = handler;
}