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-rtos mbed
Fork of HTTP_server by
Revision 4:2a34139c7246, committed 2013-08-05
- Comitter:
- pabloxid
- Date:
- Mon Aug 05 05:51:16 2013 +0000
- Parent:
- 3:27b3a889b327
- Commit message:
- Some minor changes
Changed in this revision
--- a/HTTPServer.cpp	Tue Jul 30 04:37:09 2013 +0000
+++ b/HTTPServer.cpp	Mon Aug 05 05:51:16 2013 +0000
@@ -25,6 +25,8 @@
     socketServer.set_blocking (true);
 
     path = _path;
+    msg = NULL;
+    cliente = NULL;
 
 }
 
@@ -32,18 +34,14 @@
 
 int HTTPServer::poll () {
 
-    int retvalue;
-
     cliente = new TCPSocketConnection;
     cliente->set_blocking (false, TIMEOUT);
 
-    retvalue = socketServer.accept (*cliente);
+    int retvalue = socketServer.accept (*cliente);
 
     if (retvalue == OK) {
-
         // a new connection was received
         INFO("Client (IP=%s) is connected !", cliente->get_address());
-
         msg = new HTTPMsg;     // estructura para decodificar y alojar el mensaje
 
         retvalue = pollConnection (); // esto parsea y llena las cosas contenidas en msg
@@ -51,13 +49,13 @@
         if (retvalue == OK) {
             // Handle the request
             INFO("Handling request !");
-            handleRequest ();
+
+            handleRequest ();    // handling request
+
         }
-
         delete msg;
-
     } else {  // retvalue == ERROR
-        INFO("No connection\n");
+        ERR("Error accepting client");
     }
 
     delete cliente;
@@ -69,11 +67,10 @@
 
 int HTTPServer::pollConnection () {
 
-    int received = 0;
     INFO("Waiting for new data in connection");
 
     // Try receiving request line
-    received = receiveLine ();
+    int received = receiveLine ();
 
     if (received == ERROR) {
         // there was an error, probably the connection was closed, so close this connection as well
@@ -84,6 +81,10 @@
     // Request has not yet been received, so try it
     received = parseRequest ();
 
+    /*alternative (fast) parse request method:
+     * ret = sscanf(buffer, "%s %s HTTP/%*d.%*d", request, uri);
+     */
+
     if (received == ERROR) {
         // Invalid content received, so close the connection
         INFO("Invalid message received, so sending negative response and closing connection !");
@@ -100,7 +101,7 @@
         if (received == EMPTY) {
             // there was an empty line, so the headers section is complete
             INFO("Request Header was received completely. Performing request.");
-            received = 0;
+            received = OK;
             break;
         } else {
             // parse header field
@@ -118,12 +119,6 @@
 
     buffer[0] = 0;
 
-    if (!cliente->is_connected()) {
-        error("NOT Connected anymore");
-        return ERROR;
-    }
-
-    Timer tm;
     int i;
 
     //  Try to receive up to the max number of characters
@@ -132,11 +127,8 @@
         //  Check that - if no character was currently received - the timeout period is reached.
         if (c == 0 || c == -1) {
             //  no character was read, so check if operation timed out
-            if (tm.read_ms() > 2*TIMEOUT) {
-                //  Operation timed out
-                INFO("Timeout occured in function 'receiveLine'.");
-                return ERROR;
-            }
+            ERR("Timeout occured in function 'receiveLine'.");
+            return ERROR;
         }
         //  Check if line terminating character was received
         if (buffer[i] == '\n') {break;}
@@ -245,14 +237,14 @@
     char* argname = NULL;
     char* valuename = NULL;
     for (int i=0; i<buflen; i++) {
-        if (args_start == -1) { // args section not yet found
+        if (args_start == -1) {  // args section not yet found
             if (uri_buffer[i] == '?') {  // starts with a question mark, so got it
                 uri_buffer[i] = 0;
-                args_start = i; //  set the start of the args section
+                args_start = i;  // set the start of the args section
                 INFO("Argument section found !");
             }
-        } else { // search arg-value touples
-            if (argname == NULL) {    // arg-name found ?
+        } else {                    // search arg-value touples
+            if (argname == NULL) {     // arg-name found ?
                 if (uri_buffer[i] == '=') {
                     // yes, separate the arg-name
                     uri_buffer[i] = 0;
@@ -329,11 +321,10 @@
 
         startResponse (200, size);                  // response: 200 = HTTP_Ok
         while (!feof(file) && !ferror(file)) {
+            // TODO: handle filesystem errors too
             int count = fread (buffer, 1, CHUNK_SIZE, file);
             INFO("Processing Response (%d bytes)!", count);
-            if (cliente->send_all (buffer, count) != count) {
-                WARN ("Unsent bytes left !");                  // TODO: handle filesystem errors
-            }
+            tcpsend (buffer, count);
         }
         INFO("Ending Response !");
 
@@ -353,12 +344,13 @@
     // Try receive the body data, if there is any
     if (msg->body_length > 0) {
 
-        INFO("Receiving body data.");
-        if (msg->body_length > BUFFER_SIZE) {error ("OutOfMemory");}
+        char post_buffer [msg->body_length];
+
+        INFO("Receiving body data. (%i bytes)", msg->body_length);
 
         int bytes_read = 0;
         while (bytes_read < msg->body_length) {
-            int result = cliente->receive_all(buffer+bytes_read, msg->body_length-bytes_read);
+            int result = cliente->receive_all(post_buffer+bytes_read, msg->body_length-bytes_read);
             if (result == ERROR) {
                 WARN("Error receiving body data.");
                 break;
@@ -367,17 +359,16 @@
         }
 
         INFO("Body data received.");
-
+    
         // do something
-        // use the url_decode routine :)
-
+        // use the url_decode function :)
+            
         INFO("Done !\n");
+        
         return handleGetRequest();
-            
+        
     } else {
-        
         ERR("POST data not found !");
-    
     }
 
     return 404;
--- a/HTTPServer.h	Tue Jul 30 04:37:09 2013 +0000
+++ b/HTTPServer.h	Mon Aug 05 05:51:16 2013 +0000
@@ -32,15 +32,15 @@
 #include <map>
 
 #define BUFFER_SIZE     256       // all-purpose buffer
-#define TIMEOUT         800
+#define TIMEOUT         500
 #define OK              0
 #define ERROR           -1
 #define EMPTY           -2
 #define MIN_LONG        3
 #define CHUNK_SIZE      256
 
-#define DEBUG 0
-#include "../debug.h"
+#define DEBUG 2
+#include "debug.h"
 
 enum RequestType {
      HTTP_RT_GET,        /*!< GET request */
@@ -88,26 +88,32 @@
     void handleError (int errorCode);
 
     int tcpsend (const char* text, int param) {
-        //if (cliente == NULL) {return ERROR;}
         sprintf (buffer, text, param);
-        int len = strlen (buffer);
-        if (cliente->send_all (buffer, len) == len) {
-            return OK;
-        } else {
+        return tcpsend (buffer, strlen (buffer));
+    }
+
+    int tcpsend (const char* text) {
+        return tcpsend ((char*)text, strlen (text));
+    }
+
+    /*int tcpsend (char* buf, int len) {
+        int sent = 0;
+        while (sent<len) {
+            sent += cliente->send (buf+sent, len-sent);
+            if (sent == ERROR) {
+                WARN("Unsent bytes left !");
+                return ERROR;
+            }
+        }
+        return OK;
+    }*/
+
+    int tcpsend (char* buf, int len) {
+        if (cliente->send_all (buf, len) != len) {
             WARN("Unsent bytes left !");
             return ERROR;
         }
-    }
-
-    int tcpsend (const char* text) {
-        //if (cliente == NULL) {return ERROR;}
-        int len = strlen (text);
-        if (cliente->send_all ((char*)text, len) == len) {
-            return OK;
-        } else {
-            WARN("Unsent bytes left !");
-            return ERROR;
-        }
+        return OK;
     }
 
 public:
@@ -124,4 +130,5 @@
 void url_decode (char *str);
 
 
+
 #endif //__HTTPSERVER_H__
--- a/main.cpp	Tue Jul 30 04:37:09 2013 +0000
+++ b/main.cpp	Mon Aug 05 05:51:16 2013 +0000
@@ -16,17 +16,13 @@
     eth.connect();
     printf("IP Address is %s\n", eth.getIPAddress());
     
-    Timer onesec;
-    onesec.start();
-
     Thread httpsvr( &http_thread );
 
     while (true) {
 
-        if (onesec.read() > 1) {
-            onesec.reset();
-            led1 = 1-led1;
-        }
+        led1 = 1-led1;
+        
+        Thread::wait (1000);
         
     }
     
    