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);
}
