/* Web_Parms_1.pde - very simple Webduino example of parameter passing and parsing */ /* * This is mostly a tool for testing and debugging the library, but can * also be used as an example of coding for it. * * To use it, enter one of the following USLs into your browser. * Replace "host" with the IP address assigned to the Arduino. * * http://host/ * http://host/index.html * * These return a "success" HTTP result and display the parameters * (if any) passed to them as a single string, without attempting to * parse them. This is done with a call to defaultCmd. * * * http://host/raw.html * * This is essentially the same as the index.html URL processing, * but is done by calling rawCmd. * * * http://host/parsed.html * * This invokes parsedCmd, which displays the "raw" parameter string, * but also uses the "nexyURLparam" routine to parse out the individual * parameters, and display them. */ #define WEBDUINO_FAIL_MESSAGE "

Request Failed

" #include "SPI.h" // new include #include "avr/pgmspace.h" // new include #include "Ethernet.h" #include "WebServer.h" #define VERSION_STRING "0.1" /* CHANGE THIS TO YOUR OWN UNIQUE VALUE. The MAC number should be * different from any other devices on your network or you'll have * problems receiving packets. */ static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; /* CHANGE THIS TO MATCH YOUR HOST NETWORK. Most home networks are in * the 192.168.0.XXX or 192.168.1.XXX subrange. Pick an address * that's not in use and isn't going to be automatically allocated by * DHCP from your router. */ static uint8_t ip[] = { 192, 168, 1, 210 }; // ROM-based messages used by the application // These are needed to avoid having the strings use up our limited // amount of RAM. P(Page_start) = "Web_Parms_1 Version " VERSION_STRING "\n"; P(Page_end) = ""; P(Get_head) = "

GET from "; P(Post_head) = "

POST to "; P(Unknown_head) = "

UNKNOWN request for "; P(Default_head) = "unidentified URL requested.


\n"; P(Raw_head) = "raw.html requested.
\n"; P(Parsed_head) = "parsed.html requested.
\n"; P(Good_tail_begin) = "URL tail = '"; P(Bad_tail_begin) = "INCOMPLETE URL tail = '"; P(Tail_end) = "'
\n"; P(Parsed_tail_begin) = "URL parameters:
\n"; P(Parsed_item_separator) = " = '"; P(Params_end) = "End of parameters
\n"; P(Post_params_begin) = "Parameters sent by POST:
\n"; P(Line_break) = "
\n"; /* This creates an instance of the webserver. By specifying a prefix * of "", all pages will be at the root of the server. */ #define PREFIX "" WebServer webserver(PREFIX, 80); /* commands are functions that get called by the webserver framework * they can read any posted data from client, and they output to the * server to send data back to the web browser. */ void helloCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { /* this line sends the standard "we're all OK" headers back to the browser */ server.httpSuccess(); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type == WebServer::HEAD) return; server.printP(Page_start); switch (type) { case WebServer::GET: server.printP(Get_head); break; case WebServer::POST: server.printP(Post_head); break; default: server.printP(Unknown_head); } server.printP(Default_head); server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin); server.print(url_tail); server.printP(Tail_end); server.printP(Page_end); } void rawCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { /* this line sends the standard "we're all OK" headers back to the browser */ server.httpSuccess(); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type == WebServer::HEAD) return; server.printP(Page_start); switch (type) { case WebServer::GET: server.printP(Get_head); break; case WebServer::POST: server.printP(Post_head); break; default: server.printP(Unknown_head); } server.printP(Raw_head); server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin); server.print(url_tail); server.printP(Tail_end); server.printP(Page_end); } #define NAMELEN 32 #define VALUELEN 32 void parsedCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { URLPARAM_RESULT rc; char name[NAMELEN]; int name_len; char value[VALUELEN]; int value_len; /* this line sends the standard "we're all OK" headers back to the browser */ server.httpSuccess(); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type == WebServer::HEAD) return; server.printP(Page_start); switch (type) { case WebServer::GET: server.printP(Get_head); break; case WebServer::POST: server.printP(Post_head); break; default: server.printP(Unknown_head); } server.printP(Parsed_head); server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin); server.print(url_tail); server.printP(Tail_end); if (strlen(url_tail)) { server.printP(Parsed_tail_begin); while (strlen(url_tail)) { rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN); if (rc == URLPARAM_EOS) server.printP(Params_end); else { server.print(name); server.printP(Parsed_item_separator); server.print(value); server.printP(Tail_end); } } } if (type == WebServer::POST) { server.printP(Post_params_begin); while (server.readPOSTparam(name, NAMELEN, value, VALUELEN)) { server.print(name); server.printP(Parsed_item_separator); server.print(value); server.printP(Tail_end); } } server.printP(Page_end); } void my_failCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { /* this line sends the standard "we're all OK" headers back to the browser */ server.httpFail(); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type == WebServer::HEAD) return; server.printP(Page_start); switch (type) { case WebServer::GET: server.printP(Get_head); break; case WebServer::POST: server.printP(Post_head); break; default: server.printP(Unknown_head); } server.printP(Default_head); server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin); server.print(url_tail); server.printP(Tail_end); server.printP(Page_end); } void setup() { /* initialize the Ethernet adapter */ Ethernet.begin(mac, ip); /* setup our default command that will be run when the user accesses * the root page on the server */ webserver.setDefaultCommand(&helloCmd); /* setup our default command that will be run when the user accesses * a page NOT on the server */ webserver.setFailureCommand(&my_failCmd); /* run the same command if you try to load /index.html, a common * default page name */ webserver.addCommand("index.html", &helloCmd); /*This command is called if you try to load /raw.html */ webserver.addCommand("raw.html", &rawCmd); webserver.addCommand("parsed.html", &parsedCmd); /* start the webserver */ webserver.begin(); } void loop() { char buff[64]; int len = 64; /* process incoming connections one at a time forever */ webserver.processConnection(buff, &len); }