This is a HTTP Server example using the new EthernetInterface and new mbed-rpc libraries.

Dependents:   HTTP-RPCServerExample

Fork of HTTPServer by Henry Leinen

Files at this revision

API Documentation at this revision

Comitter:
leihen
Date:
Sat Aug 17 12:12:13 2013 +0000
Parent:
13:aa5338a5e452
Child:
15:909dcf44c3db
Commit message:
Changed behaviour, so that now an EthernetInterface can be provided by user of the library as an alternative to having the HTTPServer being the owner.
; Example documentation Extended.

Changed in this revision

HTTPServer.cpp Show annotated file Show diff for this revision Revisions of this file
HTTPServer.h Show annotated file Show diff for this revision Revisions of this file
--- a/HTTPServer.cpp	Sat Jun 22 15:41:34 2013 +0000
+++ b/HTTPServer.cpp	Sat Aug 17 12:12:13 2013 +0000
@@ -12,20 +12,23 @@
 DigitalOut led4(LED4);
 #endif
 
-static EthernetInterface eth;
 
 /* Constructor */
 /* initialize all members and set the standard error handler. */
 HTTPServer::HTTPServer()
+    : m_pEthernet(NULL)
 {
     m_pErrorHandler = StdErrorHandler;
 }
 
 HTTPServer::~HTTPServer()
 {
+    if (m_pEthernet == NULL) {
+        INFO("Deleting EthernetInterface Object.\n");
+        delete m_pEthernet;
+    }
 }
 
-
 static const char* szStdErrorPage = "<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type></HEAD><BODY><h1>Error 404</h1><P>This resource is not available<P></BODY></HTML>\r\n\r\n";
 
 void HTTPServer::StdErrorHandler(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp)
@@ -38,14 +41,44 @@
 }
 
 
-bool HTTPServer::start(int port)
+bool HTTPServer::start(int port, EthernetInterface* pEthernet)
 {
-    INFO("Initializing network\n");
-    eth.init();
+    //  If no ethernet interface is provided, instantiate own on the heap. This has to be deleted later in the destructor.
+    //  If a valid pointer to an thernet interface is proveded, we can simply use it. 
+    if (pEthernet == NULL) {
+        INFO("Creating EthernetInterface object\n");
+        m_pEthernet = new EthernetInterface();
+        
+        if (m_pEthernet == NULL) {
+            ERR("Out of memory, unable to instantiate an EthernetInterface object.");
+            return false;
+        }
 
-    INFO("Connecting to network...");
-    eth.connect();
-
+        //  Initiaize the network
+        INFO("Initializing network\n");
+        if (m_pEthernet->init() != 0) {
+            ERR("Failed to initialize the ethernet interface !");
+            delete m_pEthernet;
+            m_pEthernet = NULL;
+            return false;
+        }
+        
+        //  Connect to the network using DHCP
+        INFO("Connecting to the network using DHCP...");
+        if (m_pEthernet->connect() != 0) {
+            ERR("Failed to connect to the ethernet !");
+            delete m_pEthernet;
+            m_pEthernet = NULL;
+            return false;
+        }
+        
+        INFO("Connected IP %s", m_pEthernet->getIPAddress());
+        
+    } else {
+        //  In the case that the ethernet interface is provided, it is assumed that a connection has already been created.
+        INFO("Using connection IP %s", pEthernet->getIPAddress());
+    }
+    
     INFO("Binding to port %d...", port);
     if (m_Svr.bind(port) < 0) {
         ERR("Failed to bind to port !\n");
@@ -70,8 +103,6 @@
 
 int HTTPServer::poll(bool blocking)
 {
-    int retval = -1;
-
 #ifdef _DEBUG
     led4 = 1;   //  Indicate we are waiting for a new connection
 #endif
--- a/HTTPServer.h	Sat Jun 22 15:41:34 2013 +0000
+++ b/HTTPServer.h	Sat Aug 17 12:12:13 2013 +0000
@@ -57,12 +57,11 @@
 * #include "LocalFileSystem.h"
 *
 * LocalFileSystem local("local"); 
-* WiflyInterface wifly(p9, p10, p25, p26, "<your access point>", "<your password>", WPA);
 *
 * void main(void)
 * {
 *     HTTPServer svr;
-      svr.mount("/local/", "/");
+*     svr.mount("/local/", "/");
 *     svr.addHandler<HTTPFsRequestHandler>( "/" );
 *     svr.start();
 *     while(1)
@@ -72,13 +71,55 @@
 *     }
 * }
 * @endcode
+*
+* An alternate approach e.g. if you need to perform additional tasks using the EthernetInterface
+* there is the possibility to provide the EthernetInterface object in an initialized and connected
+* state. __NOTE: You should choose this scenario for compatibility reasons.___
+*
+* \b Example2:
+* @code
+* #include "mbed.h"
+* #include "HTTPServer.h"
+* #include "EthernetInterface.h"
+* #include "LocalFileSystem.h"
+*
+* LocalFileSystem local("local");
+* EthernetInterface eth;
+*
+* void main(void)
+* {
+*     HTTPServer svr;
+*     //    Initialize the ethernet interface
+*     if (eth.init() != 0) {
+*         printf("Initialization of EthernetInterface failed !");
+*         exit(0);
+*     }
+*     //    Connect using DHCP
+*     if (eth.connect() !=0) {
+*         printf("Failed to connect using DHCP !");
+*         exit(0);
+*     }
+*     
+*     // Moint the local file system and provide a handler for 'root'.
+*     svr.mount("/local/", "/");
+*     svr.addHandler<HTTPFsRequestHandler>( "/" );
+*     // Start the server on port 80, providing our own ethernet interface object.
+*     svr.start(80, &eth);
+*     while(1)
+*     {
+*         if (svr.poll() < 0)
+*             exit(0);
+*     }
+* }
+* @endcode
+*     
 */
 class HTTPServer
 {
-        
         TCPSocketServer         m_Svr;
         bool                    m_bServerListening;
-        
+        EthernetInterface*      m_pEthernet;
+       
     public:
         /** Constructor for HTTPServer objects.
         */
@@ -127,9 +168,11 @@
         /** Binds server to a specific port and starts listening. This member prepares the internal variables and the server socket
         * and terminates after successfull initialization
         * @param port : port on which to listen for incoming connections
-        * @returns : -1 if an unrecoverable error occured, or 0 if everything was ok.
+        * @param pEthernet : a pointer to an existing EthernetInterface object or NULL if the HTTPServer shall allocate the object. _Please note that for compatibility reasons
+        * your should consider to create the EthernetInterface as a static variable. Otherwise the the object will be created on the heap._
+        * @returns : false if an unrecoverable error occured or if the ethernet interface was not set or not initialized correctly, or true if everything was ok.
         */
-        bool start(int port = 80);
+        bool start(int port = 80, EthernetInterface* pEthernet = NULL);
         
         /** Performs the regular polling of the server component. Needs to be called cyclically.
         * The function will internally check whether new connections are requested by a client and will also poll all existing client connections.
@@ -138,8 +181,9 @@
         * ready for processing the next request. Simply call \c poll as long as you want to serve new incoming requests.
         */
         int poll(bool blocking = true);
-   
+        
     private:
+        
         /** The standard error handler function.
         * @param msg : Request message data.
         * @param tcp : Socket to be used for responding.