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.
Dependencies: EthernetInterface mbed-rpc mbed-rtos mbed
Fork of HTTP-Server by
Diff: HTTPServer.cpp
- Revision:
- 0:9e4bcb10b3e3
- Child:
- 4:624527ebc0fa
diff -r 000000000000 -r 9e4bcb10b3e3 HTTPServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HTTPServer.cpp Wed Jul 17 10:15:05 2013 +0000
@@ -0,0 +1,110 @@
+#include "HTTPServer.h"
+
+#define INVALID_FORMATTER "No valid formatter specified"
+
+bool cmp(char* a, char* b)
+{
+ return strcmp(a,b) < 0;
+}
+const char *TEST = "\
+<!DOCTYPE html>\
+<html>\
+ <head>\
+ <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
+ <title>TCP Server</title>\
+ </head>\
+ <body>Hello World !</body></html>";
+HTTPServer::HTTPServer(Formatter *f):
+socket(),
+handlers(&cmp),
+formatter(f),
+reply(),
+command()
+{
+}
+
+HTTPServer::~HTTPServer()
+{
+ for(std::map<char*, RequestHandler*>::iterator itor = handlers.begin();
+ itor != handlers.end();
+ ++itor)
+ delete itor->second;
+
+ if(formatter)
+ delete formatter;
+}
+
+bool HTTPServer::init(int port)
+{
+ socket.set_blocking(true);
+ return !socket.bind(port) && !socket.listen();
+}
+
+void HTTPServer::run()
+{
+ TCPSocketConnection c;
+ while(true)
+ {
+ while(socket.accept(c));
+ c.set_blocking(false, 1000);
+ while(c.is_connected())
+ {
+ char buffer[512];
+ int n = c.receive_all(buffer, sizeof(buffer)-1);
+ if(n == 0)
+ {
+ c.close();
+ break;
+ }
+ else if(n != -1)
+ {
+ buffer[n] = '\0';
+ handle_request(buffer);
+ if(formatter != NULL)
+ {
+ char *page = formatter->get_page(reply);
+ do
+ {
+ c.send(page, strlen(page)+1);
+ page = formatter->get_page(reply);
+ }while(strlen(page)>0);
+ }
+ else
+ c.send(INVALID_FORMATTER, strlen(INVALID_FORMATTER)+1);
+ }
+ }
+ }
+}
+
+void HTTPServer::handle_request(char *buffer)
+{
+ char *request_type = strtok(buffer, " ");
+ char *request = strtok(NULL, " ");
+
+ reply[0] = '\0';
+ if(!strcmp(request, "/"))
+ return;
+
+ if(!command.decode(request))
+ {
+ strcat(reply, "Malformed request");
+ return;
+ }
+
+ std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
+ if(itor == handlers.end())
+ {
+ strcat(reply, "Only PUT, DELETE and GET requests are accepted.");
+ return;
+ }
+ if(itor->second != NULL)
+ itor->second->handle(command, reply);
+ else
+ strcat(reply, "Invalid request handler");
+}
+
+void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
+{
+ handlers[name] = handler;
+}
+
