HTTP Server upon new mbed Ethernet Interface. Based on original code by Henry Leinen.

Dependencies:   EthernetInterface mbed-rtos mbed

Fork of HTTP_server by pablo gindel

Committer:
pabloxid
Date:
Fri Jul 26 22:05:19 2013 +0000
Revision:
0:fcceff3299be
Child:
2:dc9184e97328
HTTP Server ; Copyright (c) 2013 Pablo Gindel (palmer@pablogindel.com); Based on original code by Henry Leinen.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pabloxid 0:fcceff3299be 1 #include "mbed.h"
pabloxid 0:fcceff3299be 2 #include "HTTPServer.h"
pabloxid 0:fcceff3299be 3
pabloxid 0:fcceff3299be 4 #define DEBUG
pabloxid 0:fcceff3299be 5 #include "debug.h"
pabloxid 0:fcceff3299be 6
pabloxid 0:fcceff3299be 7 #define TIMEOUT 500
pabloxid 0:fcceff3299be 8 #define OK 0
pabloxid 0:fcceff3299be 9 #define ERROR -1
pabloxid 0:fcceff3299be 10 #define EMPTY -2
pabloxid 0:fcceff3299be 11 #define MIN_LONG 3
pabloxid 0:fcceff3299be 12
pabloxid 0:fcceff3299be 13
pabloxid 0:fcceff3299be 14 RequestConfig rq_conf[] = {
pabloxid 0:fcceff3299be 15 { "GET", HTTP_RT_GET },
pabloxid 0:fcceff3299be 16 { "POST", HTTP_RT_POST}
pabloxid 0:fcceff3299be 17 };
pabloxid 0:fcceff3299be 18
pabloxid 0:fcceff3299be 19 HTTPServer::HTTPServer (int port, const char* _path) {
pabloxid 0:fcceff3299be 20
pabloxid 0:fcceff3299be 21 INFO("Binding to port %d...", port);
pabloxid 0:fcceff3299be 22 if (socketServer.bind (port) < 0) {
pabloxid 0:fcceff3299be 23 ERR("Failed to bind to port !\n");
pabloxid 0:fcceff3299be 24 error("Binding");
pabloxid 0:fcceff3299be 25 }
pabloxid 0:fcceff3299be 26
pabloxid 0:fcceff3299be 27 INFO("Listening ...");
pabloxid 0:fcceff3299be 28 if (socketServer.listen(1) < 0) {
pabloxid 0:fcceff3299be 29 ERR("Failed to listen !\n");
pabloxid 0:fcceff3299be 30 error("Listening");
pabloxid 0:fcceff3299be 31 }
pabloxid 0:fcceff3299be 32
pabloxid 0:fcceff3299be 33 INFO("Connected !");
pabloxid 0:fcceff3299be 34 // set into blocking operation
pabloxid 0:fcceff3299be 35 socketServer.set_blocking (true, TIMEOUT);
pabloxid 0:fcceff3299be 36
pabloxid 0:fcceff3299be 37 path = _path;
pabloxid 0:fcceff3299be 38
pabloxid 0:fcceff3299be 39 }
pabloxid 0:fcceff3299be 40
pabloxid 0:fcceff3299be 41 HTTPServer::~HTTPServer() { };
pabloxid 0:fcceff3299be 42
pabloxid 0:fcceff3299be 43 int HTTPServer::poll () {
pabloxid 0:fcceff3299be 44
pabloxid 0:fcceff3299be 45 cliente = new TCPSocketConnection;
pabloxid 0:fcceff3299be 46 cliente->set_blocking (false, TIMEOUT);
pabloxid 0:fcceff3299be 47
pabloxid 0:fcceff3299be 48 if (socketServer.accept(*cliente) < 0) {
pabloxid 0:fcceff3299be 49 INFO("No connection\n");
pabloxid 0:fcceff3299be 50 return ERROR;
pabloxid 0:fcceff3299be 51 }
pabloxid 0:fcceff3299be 52
pabloxid 0:fcceff3299be 53 // a new connection was received
pabloxid 0:fcceff3299be 54 INFO("Client (IP=%s) is connected !\n", cliente->get_address());
pabloxid 0:fcceff3299be 55
pabloxid 0:fcceff3299be 56 msg = new HTTPMsg; // estructura para decodificar y alojar el mensaje
pabloxid 0:fcceff3299be 57
pabloxid 0:fcceff3299be 58 int c = pollConnection (); // esto parsea y llena las cosas contenidas en msg
pabloxid 0:fcceff3299be 59
pabloxid 0:fcceff3299be 60 if (c == OK) {
pabloxid 0:fcceff3299be 61 // Handle the request
pabloxid 0:fcceff3299be 62 INFO("Handling request !");
pabloxid 0:fcceff3299be 63 //cliente->set_blocking (true, TIMEOUT);
pabloxid 0:fcceff3299be 64 handleRequest ();
pabloxid 0:fcceff3299be 65 }
pabloxid 0:fcceff3299be 66
pabloxid 0:fcceff3299be 67 delete msg;
pabloxid 0:fcceff3299be 68 delete cliente;
pabloxid 0:fcceff3299be 69
pabloxid 0:fcceff3299be 70 INFO("Leaving polling thread");
pabloxid 0:fcceff3299be 71 return c;
pabloxid 0:fcceff3299be 72 }
pabloxid 0:fcceff3299be 73
pabloxid 0:fcceff3299be 74 int HTTPServer::pollConnection () {
pabloxid 0:fcceff3299be 75
pabloxid 0:fcceff3299be 76 int received = 0;
pabloxid 0:fcceff3299be 77 INFO("Waiting for new data in connection");
pabloxid 0:fcceff3299be 78 // Try receiving request line
pabloxid 0:fcceff3299be 79 received = receiveLine ();
pabloxid 0:fcceff3299be 80
pabloxid 0:fcceff3299be 81 if (received == ERROR) {
pabloxid 0:fcceff3299be 82 // there was an error, probably the connection was closed, so close this connection as well
pabloxid 0:fcceff3299be 83 INFO("No more data available. Will close this connection now.");
pabloxid 0:fcceff3299be 84 return ERROR;
pabloxid 0:fcceff3299be 85 }
pabloxid 0:fcceff3299be 86
pabloxid 0:fcceff3299be 87 // The Request has not yet been received so try it
pabloxid 0:fcceff3299be 88 received = parse ();
pabloxid 0:fcceff3299be 89
pabloxid 0:fcceff3299be 90 if (received == ERROR) {
pabloxid 0:fcceff3299be 91 // Invalid content received, so close the connection
pabloxid 0:fcceff3299be 92 INFO("Invalid message received, so sending negative response and closing connection !");
pabloxid 0:fcceff3299be 93 sprintf (buffer,"HTTP/1.1 400 BadRequest\n\rContent-Length: %d\n\rContent-Type: text\n\r\n\r\n\r",0);
pabloxid 0:fcceff3299be 94
pabloxid 0:fcceff3299be 95 cliente->send (buffer, strlen (buffer));
pabloxid 0:fcceff3299be 96
pabloxid 0:fcceff3299be 97 return ERROR;
pabloxid 0:fcceff3299be 98 }
pabloxid 0:fcceff3299be 99
pabloxid 0:fcceff3299be 100 /* The request has been received, try receive the body
pabloxid 0:fcceff3299be 101 do {
pabloxid 0:fcceff3299be 102 received = receiveLine ();
pabloxid 0:fcceff3299be 103 if (received == ERROR) {return ERROR;}
pabloxid 0:fcceff3299be 104 // First check if we received an empty line. This would indicate the end of the message or message body.
pabloxid 0:fcceff3299be 105 if (received == EMPTY) {
pabloxid 0:fcceff3299be 106 // there was an empty line, so we can start with performing the request
pabloxid 0:fcceff3299be 107 INFO("Request Header was received completely. Performing request.");
pabloxid 0:fcceff3299be 108 received = 0;
pabloxid 0:fcceff3299be 109 break;
pabloxid 0:fcceff3299be 110 } else {
pabloxid 0:fcceff3299be 111 // add message body
pabloxid 0:fcceff3299be 112 if (parseHeader () != 0) {
pabloxid 0:fcceff3299be 113 WARN("Invalid message header received !");
pabloxid 0:fcceff3299be 114 }
pabloxid 0:fcceff3299be 115 }
pabloxid 0:fcceff3299be 116 } while (received > 0); */
pabloxid 0:fcceff3299be 117
pabloxid 0:fcceff3299be 118 INFO("Leaving poll function!");
pabloxid 0:fcceff3299be 119 return received;
pabloxid 0:fcceff3299be 120 }
pabloxid 0:fcceff3299be 121
pabloxid 0:fcceff3299be 122 int HTTPServer::receiveLine () {
pabloxid 0:fcceff3299be 123
pabloxid 0:fcceff3299be 124 buffer[0] = 0;
pabloxid 0:fcceff3299be 125
pabloxid 0:fcceff3299be 126 if (!cliente->is_connected()) {
pabloxid 0:fcceff3299be 127 error("NOT Connected anymore");
pabloxid 0:fcceff3299be 128 return ERROR;
pabloxid 0:fcceff3299be 129 }
pabloxid 0:fcceff3299be 130
pabloxid 0:fcceff3299be 131 Timer tm;
pabloxid 0:fcceff3299be 132 int i;
pabloxid 0:fcceff3299be 133
pabloxid 0:fcceff3299be 134 // Try to receive up to the max number of characters
pabloxid 0:fcceff3299be 135 for (i=0; i<BUFFER_SIZE-1; i++) {
pabloxid 0:fcceff3299be 136 int c = cliente->receive (buffer+i, 1);
pabloxid 0:fcceff3299be 137 // Check that - if no character was currently received - the timeout period is reached.
pabloxid 0:fcceff3299be 138 if (c == 0 || c == -1) {
pabloxid 0:fcceff3299be 139 // no character was read, so check if operation timed out
pabloxid 0:fcceff3299be 140 if (tm.read_ms() > TIMEOUT) {
pabloxid 0:fcceff3299be 141 // Operation timed out
pabloxid 0:fcceff3299be 142 INFO("Timeout occured in function 'receiveLine'.");
pabloxid 0:fcceff3299be 143 return ERROR;
pabloxid 0:fcceff3299be 144 }
pabloxid 0:fcceff3299be 145 }
pabloxid 0:fcceff3299be 146 // Check if line terminating character was received
pabloxid 0:fcceff3299be 147 if (buffer[i] == '\n') {break;}
pabloxid 0:fcceff3299be 148 }
pabloxid 0:fcceff3299be 149 // Terminate with \0
pabloxid 0:fcceff3299be 150 buffer[i] = 0;
pabloxid 0:fcceff3299be 151
pabloxid 0:fcceff3299be 152 // Trim for '\r' linefeed at the end
pabloxid 0:fcceff3299be 153 if (i>0 && buffer[i-1] == '\r') {
pabloxid 0:fcceff3299be 154 i--;
pabloxid 0:fcceff3299be 155 buffer[i] = 0;
pabloxid 0:fcceff3299be 156 }
pabloxid 0:fcceff3299be 157
pabloxid 0:fcceff3299be 158 // return number of characters received in the line or return -2 if an empty line was received
pabloxid 0:fcceff3299be 159 if (i==0 || (i==1 && buffer[0]=='\r')) {
pabloxid 0:fcceff3299be 160 // empty line received, so return -2
pabloxid 0:fcceff3299be 161 return EMPTY;
pabloxid 0:fcceff3299be 162 }
pabloxid 0:fcceff3299be 163 // retorna número de caracteres leidos
pabloxid 0:fcceff3299be 164 return i;
pabloxid 0:fcceff3299be 165 }
pabloxid 0:fcceff3299be 166
pabloxid 0:fcceff3299be 167 int HTTPServer::parse () {
pabloxid 0:fcceff3299be 168
pabloxid 0:fcceff3299be 169 // Check if buffer content is not long enough.
pabloxid 0:fcceff3299be 170 if (strlen(buffer) < MIN_LONG) {
pabloxid 0:fcceff3299be 171 ERR("Buffer content is invalid or too short.");
pabloxid 0:fcceff3299be 172 return ERROR;
pabloxid 0:fcceff3299be 173 }
pabloxid 0:fcceff3299be 174
pabloxid 0:fcceff3299be 175 std::vector<std::string> args;
pabloxid 0:fcceff3299be 176
pabloxid 0:fcceff3299be 177 int argno = 0;
pabloxid 0:fcceff3299be 178 // decompose string into a list of arguments
pabloxid 0:fcceff3299be 179 int start = 0; // current starting char
pabloxid 0:fcceff3299be 180 int nLen = strlen(buffer)+1;
pabloxid 0:fcceff3299be 181 for (int i=0; i<nLen; i++) {
pabloxid 0:fcceff3299be 182 if ((buffer[i] == ' ') || (buffer[i] == '\n') || (buffer[i] == 0)) {
pabloxid 0:fcceff3299be 183 // new arg found
pabloxid 0:fcceff3299be 184 buffer[i] = 0;
pabloxid 0:fcceff3299be 185 if (argno++ == 1) {
pabloxid 0:fcceff3299be 186 // it's the uri
pabloxid 0:fcceff3299be 187 // parse the uri args
pabloxid 0:fcceff3299be 188 parseUriArgs (&buffer[start]);
pabloxid 0:fcceff3299be 189 }
pabloxid 0:fcceff3299be 190 INFO("Found argument \"%s\"", &buffer[start]);
pabloxid 0:fcceff3299be 191 args.push_back(&buffer[start]);
pabloxid 0:fcceff3299be 192 start = i+1;
pabloxid 0:fcceff3299be 193 }
pabloxid 0:fcceff3299be 194 }
pabloxid 0:fcceff3299be 195
pabloxid 0:fcceff3299be 196 // store the uri and the HTTP version
pabloxid 0:fcceff3299be 197 msg->uri = args[1];
pabloxid 0:fcceff3299be 198 msg->version = args[2];
pabloxid 0:fcceff3299be 199
pabloxid 0:fcceff3299be 200 // Find matching request type
pabloxid 0:fcceff3299be 201 for (int i=0; i<sizeof(rq_conf)/sizeof(RequestConfig) ; i++) {
pabloxid 0:fcceff3299be 202 if (args.at(0) == rq_conf[i].request_string) {
pabloxid 0:fcceff3299be 203 msg->request = rq_conf[i].request_type;
pabloxid 0:fcceff3299be 204 }
pabloxid 0:fcceff3299be 205 }
pabloxid 0:fcceff3299be 206
pabloxid 0:fcceff3299be 207 return OK;
pabloxid 0:fcceff3299be 208 }
pabloxid 0:fcceff3299be 209
pabloxid 0:fcceff3299be 210 /* esta rutina no se usa */
pabloxid 0:fcceff3299be 211
pabloxid 0:fcceff3299be 212 int HTTPServer::parseHeader () {
pabloxid 0:fcceff3299be 213
pabloxid 0:fcceff3299be 214 // Check if the buffer content is too short to be meaningful
pabloxid 0:fcceff3299be 215 if (strlen(buffer) < MIN_LONG) {return ERROR;}
pabloxid 0:fcceff3299be 216
pabloxid 0:fcceff3299be 217 // decompose string into a touple of <field name> : <field value>
pabloxid 0:fcceff3299be 218 int value_start = 0;
pabloxid 0:fcceff3299be 219 int buflen = strlen(buffer)+1;
pabloxid 0:fcceff3299be 220 for (int i=0; i<buflen; i++) {
pabloxid 0:fcceff3299be 221 if (buffer[i] == ':') {
pabloxid 0:fcceff3299be 222 // touple found
pabloxid 0:fcceff3299be 223 buffer[i] = 0;
pabloxid 0:fcceff3299be 224 value_start = i+1;
pabloxid 0:fcceff3299be 225 msg->headers[buffer] = &buffer[value_start];
pabloxid 0:fcceff3299be 226 INFO("Header name=\"%s\" : value=\"%s\".", buffer, &buffer[value_start]);
pabloxid 0:fcceff3299be 227 return OK;
pabloxid 0:fcceff3299be 228 }
pabloxid 0:fcceff3299be 229 }
pabloxid 0:fcceff3299be 230
pabloxid 0:fcceff3299be 231 ERR("Did not recieve a valid header : \"%s\".", buffer);
pabloxid 0:fcceff3299be 232 return ERROR;
pabloxid 0:fcceff3299be 233 }
pabloxid 0:fcceff3299be 234
pabloxid 0:fcceff3299be 235 int HTTPServer::parseUriArgs (char *uri_buffer) {
pabloxid 0:fcceff3299be 236
pabloxid 0:fcceff3299be 237 // Check if the buffer content is too short to be meaningful
pabloxid 0:fcceff3299be 238 if (strlen(uri_buffer) < MIN_LONG) {return ERROR;}
pabloxid 0:fcceff3299be 239
pabloxid 0:fcceff3299be 240 int args_start = -1;
pabloxid 0:fcceff3299be 241 int value_start = -1;
pabloxid 0:fcceff3299be 242 int buflen = strlen(uri_buffer) + 1;
pabloxid 0:fcceff3299be 243 char* argname = NULL;
pabloxid 0:fcceff3299be 244 char* valuename = NULL;
pabloxid 0:fcceff3299be 245 for (int i=0; i<buflen; i++) {
pabloxid 0:fcceff3299be 246 if (args_start == -1) { // args section not yet found
pabloxid 0:fcceff3299be 247 if (uri_buffer[i] == '?') { // starts with a question mark, so got it
pabloxid 0:fcceff3299be 248 uri_buffer[i] = 0;
pabloxid 0:fcceff3299be 249 args_start = i; // set the start of the args section
pabloxid 0:fcceff3299be 250 INFO("Argument section found !");
pabloxid 0:fcceff3299be 251 }
pabloxid 0:fcceff3299be 252 } else { // search arg-value touples
pabloxid 0:fcceff3299be 253 if (argname == NULL) { // arg-name found ?
pabloxid 0:fcceff3299be 254 if (uri_buffer[i] == '=') {
pabloxid 0:fcceff3299be 255 // yes, separate the arg-name
pabloxid 0:fcceff3299be 256 uri_buffer[i] = 0;
pabloxid 0:fcceff3299be 257 argname = &uri_buffer[args_start];
pabloxid 0:fcceff3299be 258 value_start = i+1;
pabloxid 0:fcceff3299be 259 INFO("Argument name %s", argname);
pabloxid 0:fcceff3299be 260 }
pabloxid 0:fcceff3299be 261 } else { // search for end of value
pabloxid 0:fcceff3299be 262 if ((uri_buffer[i] == '&') || (uri_buffer[i] == 0) || (uri_buffer[i] == '\r') || (uri_buffer[i] == '\n')) {
pabloxid 0:fcceff3299be 263 buffer[i] = 0;
pabloxid 0:fcceff3299be 264 valuename = &uri_buffer[value_start];
pabloxid 0:fcceff3299be 265 INFO("Argument value %s", valuename);
pabloxid 0:fcceff3299be 266 msg->args[argname] = valuename;
pabloxid 0:fcceff3299be 267 // reset all indicators
pabloxid 0:fcceff3299be 268 argname = NULL;
pabloxid 0:fcceff3299be 269 valuename = NULL;
pabloxid 0:fcceff3299be 270 }
pabloxid 0:fcceff3299be 271 }
pabloxid 0:fcceff3299be 272 }
pabloxid 0:fcceff3299be 273 }
pabloxid 0:fcceff3299be 274
pabloxid 0:fcceff3299be 275 return OK;
pabloxid 0:fcceff3299be 276 }
pabloxid 0:fcceff3299be 277
pabloxid 0:fcceff3299be 278 /* verificar qué parte de msg realmente se usa,
pabloxid 0:fcceff3299be 279 eliminar el resto, incluyendo los procesos asociados */
pabloxid 0:fcceff3299be 280
pabloxid 0:fcceff3299be 281 void HTTPServer::handleRequest () {
pabloxid 0:fcceff3299be 282
pabloxid 0:fcceff3299be 283 int err_;
pabloxid 0:fcceff3299be 284
pabloxid 0:fcceff3299be 285 switch (msg->request) {
pabloxid 0:fcceff3299be 286 case HTTP_RT_GET:
pabloxid 0:fcceff3299be 287 INFO("Dispatching GET Request.");
pabloxid 0:fcceff3299be 288 err_ = handleGetRequest();
pabloxid 0:fcceff3299be 289 break;
pabloxid 0:fcceff3299be 290 case HTTP_RT_POST:
pabloxid 0:fcceff3299be 291 INFO("Dispatching POST request.");
pabloxid 0:fcceff3299be 292 err_ = handlePostRequest();
pabloxid 0:fcceff3299be 293 break;
pabloxid 0:fcceff3299be 294 default:
pabloxid 0:fcceff3299be 295 INFO("Error in handleRequest, unhandled request type.");
pabloxid 0:fcceff3299be 296 err_ = 501; // HTTP_NotImplemented
pabloxid 0:fcceff3299be 297 break;
pabloxid 0:fcceff3299be 298 }
pabloxid 0:fcceff3299be 299
pabloxid 0:fcceff3299be 300 // if any of these functions returns a negative number, call the error handler
pabloxid 0:fcceff3299be 301 if (err_ > 0) {
pabloxid 0:fcceff3299be 302 handleError (err_);
pabloxid 0:fcceff3299be 303 }
pabloxid 0:fcceff3299be 304
pabloxid 0:fcceff3299be 305 }
pabloxid 0:fcceff3299be 306
pabloxid 0:fcceff3299be 307 int HTTPServer::handleGetRequest() {
pabloxid 0:fcceff3299be 308
pabloxid 0:fcceff3299be 309 INFO("Handling Get Request.");
pabloxid 0:fcceff3299be 310
pabloxid 0:fcceff3299be 311 int retval = OK; //success
pabloxid 0:fcceff3299be 312
pabloxid 0:fcceff3299be 313 // maping to root path
pabloxid 0:fcceff3299be 314 std::string reqPath = path + msg->uri.substr(1);
pabloxid 0:fcceff3299be 315
pabloxid 0:fcceff3299be 316 // Check if we received a directory with the local path
pabloxid 0:fcceff3299be 317 if (reqPath.substr(reqPath.length()-1, 1) == "/") {
pabloxid 0:fcceff3299be 318 // yes, we shall append the default page name
pabloxid 0:fcceff3299be 319 reqPath += "index.htm";
pabloxid 0:fcceff3299be 320 }
pabloxid 0:fcceff3299be 321
pabloxid 0:fcceff3299be 322 INFO("Mapping \"%s\" to \"%s\"", msg->uri.c_str(), reqPath.c_str());
pabloxid 0:fcceff3299be 323
pabloxid 0:fcceff3299be 324 FILE *fp = fopen(reqPath.c_str(), "r");
pabloxid 0:fcceff3299be 325 if (fp != NULL) {
pabloxid 0:fcceff3299be 326
pabloxid 0:fcceff3299be 327 char * pBuffer = NULL;
pabloxid 0:fcceff3299be 328 int sz = 8192; // fixme harcode
pabloxid 0:fcceff3299be 329 while( pBuffer == NULL) {
pabloxid 0:fcceff3299be 330 sz /= 2;
pabloxid 0:fcceff3299be 331 pBuffer = (char*)malloc(sz);
pabloxid 0:fcceff3299be 332 if (sz < 128) // fixme harcode
pabloxid 0:fcceff3299be 333 error ("OutOfMemory");
pabloxid 0:fcceff3299be 334 }
pabloxid 0:fcceff3299be 335
pabloxid 0:fcceff3299be 336 // File was found and can be returned
pabloxid 0:fcceff3299be 337
pabloxid 0:fcceff3299be 338 // first determine the size
pabloxid 0:fcceff3299be 339 fseek(fp, 0, SEEK_END);
pabloxid 0:fcceff3299be 340 long size = ftell(fp);
pabloxid 0:fcceff3299be 341 fseek(fp, 0, SEEK_SET);
pabloxid 0:fcceff3299be 342
pabloxid 0:fcceff3299be 343 startResponse (200, size); // response: 200
pabloxid 0:fcceff3299be 344 while (!feof(fp) && !ferror(fp)) {
pabloxid 0:fcceff3299be 345 int cnt = fread (pBuffer, 1, sz , fp);
pabloxid 0:fcceff3299be 346 if (cnt < 0)
pabloxid 0:fcceff3299be 347 cnt = 0;
pabloxid 0:fcceff3299be 348 processResponse (cnt, pBuffer);
pabloxid 0:fcceff3299be 349 }
pabloxid 0:fcceff3299be 350
pabloxid 0:fcceff3299be 351 INFO("Ending Response !");
pabloxid 0:fcceff3299be 352
pabloxid 0:fcceff3299be 353 free (pBuffer);
pabloxid 0:fcceff3299be 354 fclose (fp);
pabloxid 0:fcceff3299be 355
pabloxid 0:fcceff3299be 356 } else {
pabloxid 0:fcceff3299be 357 retval = 404;
pabloxid 0:fcceff3299be 358 ERR("Requested file was not found !");
pabloxid 0:fcceff3299be 359 }
pabloxid 0:fcceff3299be 360
pabloxid 0:fcceff3299be 361 return retval;
pabloxid 0:fcceff3299be 362
pabloxid 0:fcceff3299be 363 }
pabloxid 0:fcceff3299be 364
pabloxid 0:fcceff3299be 365 int HTTPServer::handlePostRequest() {
pabloxid 0:fcceff3299be 366
pabloxid 0:fcceff3299be 367 return 404;
pabloxid 0:fcceff3299be 368 }
pabloxid 0:fcceff3299be 369
pabloxid 0:fcceff3299be 370 static const char hdrStandard[] = "DNT: 1\r\n"
pabloxid 0:fcceff3299be 371 "MaxAge: 0\r\n"
pabloxid 0:fcceff3299be 372 "Connection: Keep-Alive\r\n"
pabloxid 0:fcceff3299be 373 "Content-Type: text/html\r\n"
pabloxid 0:fcceff3299be 374 "Server: mbed embedded\r\n"
pabloxid 0:fcceff3299be 375 "Accessible: 1\r\n"
pabloxid 0:fcceff3299be 376 "\r\n";
pabloxid 0:fcceff3299be 377
pabloxid 0:fcceff3299be 378 void HTTPServer::startResponse (int returnCode, long nLen) {
pabloxid 0:fcceff3299be 379
pabloxid 0:fcceff3299be 380 INFO("Starting response (%ld bytes in total)!", nLen);
pabloxid 0:fcceff3299be 381
pabloxid 0:fcceff3299be 382 sprintf (buffer, "HTTP/1.1 %d OK\r\n", returnCode);
pabloxid 0:fcceff3299be 383 cliente->send(buffer, strlen(buffer));
pabloxid 0:fcceff3299be 384 sprintf (buffer, "Content-Length: %ld\r\n", nLen); // Add 2 chars for the terminating CR+LF
pabloxid 0:fcceff3299be 385 cliente->send(buffer, strlen(buffer));
pabloxid 0:fcceff3299be 386 INFO("Sending standard headers !");
pabloxid 0:fcceff3299be 387 cliente->send_all((char*)hdrStandard, strlen(hdrStandard));
pabloxid 0:fcceff3299be 388
pabloxid 0:fcceff3299be 389 INFO("Proceeding !");
pabloxid 0:fcceff3299be 390 // other content must be sent using the 'processResponse' function
pabloxid 0:fcceff3299be 391 }
pabloxid 0:fcceff3299be 392
pabloxid 0:fcceff3299be 393 void HTTPServer::processResponse (int nLen, char* body) {
pabloxid 0:fcceff3299be 394
pabloxid 0:fcceff3299be 395 INFO("Processing Response (%d bytes)!\n", nLen);
pabloxid 0:fcceff3299be 396 cliente->send_all (body, nLen);
pabloxid 0:fcceff3299be 397
pabloxid 0:fcceff3299be 398 }
pabloxid 0:fcceff3299be 399
pabloxid 0:fcceff3299be 400 static const char* errorPage = "<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type></HEAD><BODY><h1>Error</h1><P>HTTPServer Error<P></BODY></HTML>\r\n\r\n";
pabloxid 0:fcceff3299be 401
pabloxid 0:fcceff3299be 402 void HTTPServer::handleError (int errorCode) {
pabloxid 0:fcceff3299be 403
pabloxid 0:fcceff3299be 404 INFO("Handling error !");
pabloxid 0:fcceff3299be 405
pabloxid 0:fcceff3299be 406 sprintf (buffer,"HTTP/1.1 %d Error\r\n", errorCode);
pabloxid 0:fcceff3299be 407 cliente->send (buffer, strlen(buffer));
pabloxid 0:fcceff3299be 408 sprintf (buffer, "Content-Length: %ld\r\n", strlen(errorPage));
pabloxid 0:fcceff3299be 409 cliente->send (buffer, strlen(buffer));
pabloxid 0:fcceff3299be 410 sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\r\n");
pabloxid 0:fcceff3299be 411 cliente->send(buffer, strlen(buffer));
pabloxid 0:fcceff3299be 412 cliente->send_all((char*)errorPage, strlen(errorPage));
pabloxid 0:fcceff3299be 413 cliente->send("\r\n", 3);
pabloxid 0:fcceff3299be 414
pabloxid 0:fcceff3299be 415 INFO("Done !");
pabloxid 0:fcceff3299be 416
pabloxid 0:fcceff3299be 417 }