2009-10-11 10:12:22 +00:00
/*
ChibiOS / RT - Copyright ( C ) 2006 - 2007 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 < http : //www.gnu.org/licenses/>.
*/
/*
* 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
2009-10-17 10:33:37 +00:00
static const char http_html_hdr [ ] = " HTTP/1.1 200 OK \r \n Content-type: text/html \r \n \r \n " ;
static const char http_index_html [ ] = " <html><head><title>Congrats!</title></head><body><h1>Welcome to our lwIP HTTP server!</h1><p>This is a small test page.</body></html> " ;
2009-10-11 10:12:22 +00:00
static void http_server_serve ( struct netconn * conn ) {
struct netbuf * inbuf ;
char * buf ;
u16_t buflen ;
/* Read the data from the port, blocking if nothing yet there.
We assume the request ( the part we care about ) is in one netbuf */
inbuf = netconn_recv ( conn ) ;
if ( netconn_err ( conn ) = = 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 ;
2009-10-17 10:33:37 +00:00
( void ) p ;
2009-10-11 10:12:22 +00:00
/* 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 ) {
newconn = netconn_accept ( conn ) ;
http_server_serve ( newconn ) ;
netconn_delete ( newconn ) ;
}
return RDY_OK ;
}
# endif /* LWIP_NETCONN */
/** @} */