/* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, 2011,2012 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ChibiOS/RT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * This file is a modified version of the lwIP web server demo. The original * author is unknown because the file didn't contain any license information. */ /** * @file web.c * @brief HTTP server wrapper thread code. * @addtogroup WEB_THREAD * @{ */ #include "ch.h" #include "lwip/opt.h" #include "lwip/arch.h" #include "lwip/api.h" #include "web.h" #if LWIP_NETCONN static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; static const char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; static void http_server_serve(struct netconn *conn) { struct netbuf *inbuf; char *buf; u16_t buflen; err_t err; /* Read the data from the port, blocking if nothing yet there. We assume the request (the part we care about) is in one netbuf */ err = netconn_recv(conn, &inbuf); if (err == ERR_OK) { netbuf_data(inbuf, (void **)&buf, &buflen); /* Is this an HTTP GET command? (only check the first 5 chars, since there are other formats for GET, and we're keeping it very simple )*/ if (buflen>=5 && buf[0]=='G' && buf[1]=='E' && buf[2]=='T' && buf[3]==' ' && buf[4]=='/' ) { /* Send the HTML header * subtract 1 from the size, since we dont send the \0 in the string * NETCONN_NOCOPY: our data is const static, so no need to copy it */ netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); /* Send our HTML page */ netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); } } /* Close the connection (server closes in HTTP) */ netconn_close(conn); /* Delete the buffer (netconn_recv gives us ownership, so we have to make sure to deallocate the buffer) */ netbuf_delete(inbuf); } /** * Stack area for the http thread. */ WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); /** * HTTP server thread. */ msg_t http_server(void *p) { struct netconn *conn, *newconn; err_t err; (void)p; /* Create a new TCP connection handle */ conn = netconn_new(NETCONN_TCP); LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); /* Bind to port 80 (HTTP) with default IP address */ netconn_bind(conn, NULL, WEB_THREAD_PORT); /* Put the connection into LISTEN state */ netconn_listen(conn); /* Goes to the final priority after initialization.*/ chThdSetPriority(WEB_THREAD_PRIORITY); while(1) { err = netconn_accept(conn, &newconn); if (err != ERR_OK) continue; http_server_serve(newconn); netconn_delete(newconn); } return RDY_OK; } #endif /* LWIP_NETCONN */ /** @} */