Single instance HTTP Server using new Ethernet Interface with bug fix for URL arguments

Fork of HTTPServer by Henry Leinen

Revision:
11:3943841e1798
Parent:
10:cbde7929db7f
Child:
12:ba81cc117fb6
diff -r cbde7929db7f -r 3943841e1798 HTTPRequestHandler.cpp
--- a/HTTPRequestHandler.cpp	Sun Jun 02 00:37:38 2013 +0000
+++ b/HTTPRequestHandler.cpp	Sun Jun 02 22:59:51 2013 +0000
@@ -2,7 +2,7 @@
 #include "mbed.h"
 #include "HTTPRequestHandler.h"
 
-#define _DEBUG 1
+#define _DEBUG 0
 
 #if (_DEBUG && !defined(TARGET_LPC11U24))
 #define INFO(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
@@ -16,6 +16,14 @@
 
 static char buffer[128];
 
+
+const char hdrDNT[] = "DNT: 1\r\n";
+const char hdrMaxAge[] = "MaxAge: 0\r\n";
+const char hdrConClose[] = "Connection: Keep-Alive\r\n";
+const char hdrContent[] = "Content-Type: text/html\r\n";
+const char hdrServer[] = "Server: mbed embedded\r\n";
+const char hdrEndl[] = "\r\n";
+
 HTTPRequestHandler::HTTPRequestHandler(HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
     : msg(Msg), tcp(Tcp)
 {
@@ -65,7 +73,7 @@
 {
     INFO("Handling error !");
     tcp.set_blocking(true, 1500);
-    sprintf(buffer,"HTTP/1.0 %d Error\r\n", errorCode);
+    sprintf(buffer,"HTTP/1.1 %d Error\r\n", errorCode);
     tcp.send(buffer, strlen(buffer));
     sprintf(buffer, "Content-Length: %d\r\n", strlen(szErrorPage));
     tcp.send(buffer, strlen(buffer));
@@ -90,13 +98,17 @@
 {
     INFO("Starting response (%ld bytes in total)!", nLen);
     tcp.set_blocking(true, 1500);
-    sprintf(buffer, "HTTP/1.0 %d OK\r\n", returnCode);
-    tcp.send(buffer, strlen(buffer));
+    sprintf(buffer, "HTTP/1.1 %d OK\r\n", returnCode);
+    tcp.send_all(buffer, strlen(buffer));
+    tcp.send_all((char*)hdrConClose, strlen(hdrConClose));
     sprintf(buffer, "Content-Length: %ld\r\n", nLen);    //  Add 2 chars for the terminating CR+LF
-    tcp.send(buffer, strlen(buffer));
+    tcp.send_all(buffer, strlen(buffer));
     if (header == NULL) {
-        sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\r\n");
-        tcp.send(buffer, strlen(buffer));
+        tcp.send_all((char*)hdrDNT, strlen(hdrDNT));
+        tcp.send_all((char*)hdrMaxAge, strlen(hdrMaxAge));
+        tcp.send_all((char*)hdrContent, strlen(hdrContent));
+        tcp.send_all((char*)hdrServer, strlen(hdrServer));
+        tcp.send_all((char*)hdrEndl, strlen(hdrEndl));
     }
     else {
         for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) {
@@ -105,7 +117,7 @@
             tcp.send((char*)cIter->second, strlen(cIter->second));
             tcp.send("\r\n\r\n",2);
         }
-        tcp.send("\r\n", 2);
+        tcp.send_all("\r\n", 2);
     }
     //  other content must be sent using the 'processResponse' function
 }
@@ -113,11 +125,11 @@
 void HTTPRequestHandler::processResponse(int nLen, char* body)
 {
     INFO("Processing Response (%d bytes)!\n",nLen);
-    tcp.send(body, nLen);
+    tcp.send_all(body, nLen);
 }
 
 void HTTPRequestHandler::endResponse()
 {
     INFO("Ending Response !");
-    tcp.send("\r\n", 2);
+//    tcp.send("\r\n\r\n", 4);
 }