Simple Webserver example for wiznet W5500 (SPI Ethernet chip) mbed OS 5 - HTTP 1.1 and multi-threaded

Dependencies:   W5500Interface easy-connect mbed-http

Fork of http-webserver-example by sandbox

mbed-os-example-http-server

This application demonstrates how to run an HTTP server on an mbed OS 5 device & WIZnet W5500 Ethernet components.

Request parsing is done through [nodejs/http-parser](https://github.com/nodejs/http-parser).

To build

  1. Open ``mbed_app.json`` and change the `network-interface` option to your connectivity method ([more info](https://github.com/ARMmbed/easy-connect)).
  2. Build the project in the online compiler or using mbed CLI.
  3. Flash the project to your development board.
  4. Attach a serial monitor to your board to see the debug messages.

Tested on

But every networking stack that supports the [mbed OS 5 NetworkInterface API](https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/communication/network_sockets/) should work.

Test Result

Committer:
Bongjun
Date:
Thu Aug 09 08:24:06 2018 +0000
Revision:
2:c8eff436549f
Parent:
0:41f820ea137a
Child:
5:ac9aebd61a31
http webserver example for W5500 Ethernet components

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jan Jongboom 0:41f820ea137a 1 #include "mbed.h"
Jan Jongboom 0:41f820ea137a 2 #include "easy-connect.h"
Jan Jongboom 0:41f820ea137a 3 #include "http_server.h"
Jan Jongboom 0:41f820ea137a 4 #include "http_response_builder.h"
Jan Jongboom 0:41f820ea137a 5
Bongjun 2:c8eff436549f 6 //Serial pc(USBTX, USBRX);
Bongjun 2:c8eff436549f 7 //DigitalOut led(D1);
Jan Jongboom 0:41f820ea137a 8
Jan Jongboom 0:41f820ea137a 9 // Requests come in here
Jan Jongboom 0:41f820ea137a 10 void request_handler(ParsedHttpRequest* request, TCPSocket* socket) {
Jan Jongboom 0:41f820ea137a 11
Jan Jongboom 0:41f820ea137a 12 printf("Request came in: %s %s\n", http_method_str(request->get_method()), request->get_url().c_str());
Jan Jongboom 0:41f820ea137a 13
Jan Jongboom 0:41f820ea137a 14 if (request->get_method() == HTTP_GET && request->get_url() == "/") {
Jan Jongboom 0:41f820ea137a 15 HttpResponseBuilder builder(200);
Jan Jongboom 0:41f820ea137a 16 builder.set_header("Content-Type", "text/html; charset=utf-8");
Jan Jongboom 0:41f820ea137a 17
Jan Jongboom 0:41f820ea137a 18 char response[] = "<html><head><title>Hello from mbed</title></head>"
Jan Jongboom 0:41f820ea137a 19 "<body>"
Jan Jongboom 0:41f820ea137a 20 "<h1>mbed webserver</h1>"
Jan Jongboom 0:41f820ea137a 21 "<button id=\"toggle\">Toggle LED</button>"
Jan Jongboom 0:41f820ea137a 22 "<script>document.querySelector('#toggle').onclick = function() {"
Jan Jongboom 0:41f820ea137a 23 "var x = new XMLHttpRequest(); x.open('POST', '/toggle'); x.send();"
Jan Jongboom 0:41f820ea137a 24 "}</script>"
Jan Jongboom 0:41f820ea137a 25 "</body></html>";
Jan Jongboom 0:41f820ea137a 26
Jan Jongboom 0:41f820ea137a 27 builder.send(socket, response, sizeof(response) - 1);
Jan Jongboom 0:41f820ea137a 28 }
Jan Jongboom 0:41f820ea137a 29 else if (request->get_method() == HTTP_POST && request->get_url() == "/toggle") {
Jan Jongboom 0:41f820ea137a 30 printf("toggle LED called\n");
Bongjun 2:c8eff436549f 31 //led = !led;
Jan Jongboom 0:41f820ea137a 32 HttpResponseBuilder builder(200);
Jan Jongboom 0:41f820ea137a 33 builder.send(socket, NULL, 0);
Jan Jongboom 0:41f820ea137a 34 }
Jan Jongboom 0:41f820ea137a 35 else {
Jan Jongboom 0:41f820ea137a 36 HttpResponseBuilder builder(404);
Jan Jongboom 0:41f820ea137a 37 builder.send(socket, NULL, 0);
Jan Jongboom 0:41f820ea137a 38 }
Jan Jongboom 0:41f820ea137a 39 }
Jan Jongboom 0:41f820ea137a 40
Jan Jongboom 0:41f820ea137a 41 int main() {
Bongjun 2:c8eff436549f 42 // pc.baud(115200);
Jan Jongboom 0:41f820ea137a 43
Bongjun 2:c8eff436549f 44 printf("Easy connect...\n");
Bongjun 2:c8eff436549f 45 NetworkInterface *network = easy_connect(true);
Jan Jongboom 0:41f820ea137a 46 if (!network) {
Bongjun 2:c8eff436549f 47 printf("Cannot connect to the network, see serial output");
Jan Jongboom 0:41f820ea137a 48 return 1;
Jan Jongboom 0:41f820ea137a 49 }
Jan Jongboom 0:41f820ea137a 50
Bongjun 2:c8eff436549f 51 printf("Connected to the network. Opening a socket...\n");
Bongjun 2:c8eff436549f 52
Jan Jongboom 0:41f820ea137a 53 HttpServer server(network);
Jan Jongboom 0:41f820ea137a 54 nsapi_error_t res = server.start(8080, &request_handler);
Jan Jongboom 0:41f820ea137a 55
Jan Jongboom 0:41f820ea137a 56 if (res == NSAPI_ERROR_OK) {
Jan Jongboom 0:41f820ea137a 57 printf("Server is listening at http://%s:8080\n", network->get_ip_address());
Jan Jongboom 0:41f820ea137a 58 }
Jan Jongboom 0:41f820ea137a 59 else {
Jan Jongboom 0:41f820ea137a 60 printf("Server could not be started... %d\n", res);
Jan Jongboom 0:41f820ea137a 61 }
Jan Jongboom 0:41f820ea137a 62
Jan Jongboom 0:41f820ea137a 63 wait(osWaitForever);
Bongjun 2:c8eff436549f 64
Bongjun 2:c8eff436549f 65 /*
Bongjun 2:c8eff436549f 66 // Connect to the network (see mbed_app.json for the connectivity method used)
Bongjun 2:c8eff436549f 67 NetworkInterface* network = easy_connect(true);
Bongjun 2:c8eff436549f 68 if (!network) {
Bongjun 2:c8eff436549f 69 printf("Cannot connect to the network, see serial output\n");
Bongjun 2:c8eff436549f 70 return 1;
Bongjun 2:c8eff436549f 71 }
Bongjun 2:c8eff436549f 72
Bongjun 2:c8eff436549f 73 HttpServer server(network);
Bongjun 2:c8eff436549f 74 nsapi_error_t res = server.start(8080, &request_handler);
Bongjun 2:c8eff436549f 75
Bongjun 2:c8eff436549f 76 if (res == NSAPI_ERROR_OK) {
Bongjun 2:c8eff436549f 77 printf("Server is listening at http://%s:8080\n", network->get_ip_address());
Bongjun 2:c8eff436549f 78 }
Bongjun 2:c8eff436549f 79 else {
Bongjun 2:c8eff436549f 80 printf("Server could not be started... %d\n", res);
Bongjun 2:c8eff436549f 81 }
Bongjun 2:c8eff436549f 82
Bongjun 2:c8eff436549f 83 wait(osWaitForever);
Bongjun 2:c8eff436549f 84 */
Jan Jongboom 0:41f820ea137a 85 }