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.
Dependents: RPC_HTTP RPC_HTTP_WIZnetInterface RPC_HTTP rpc_over_http_TL_interrupter_gatePJ
Fork of HTTPServer by
Revision 14:011edcd33e86, committed 2013-08-17
- 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, ð);
+* 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.
