From bb05712efe864fd79162a4b0a9c411b7740a2bdb Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 29 Jul 2009 01:40:42 +0000
Subject: [PATCH] Added 404 errors to the RNDIS Webserver example.

---
 .../ClassDriver/RNDISEthernet/Lib/Webserver.c | 73 ++++++++++++++-----
 .../LowLevel/RNDISEthernet/Lib/Webserver.c    | 73 ++++++++++++++-----
 LUFA/ManPages/ChangeLog.txt                   |  1 +
 3 files changed, 109 insertions(+), 38 deletions(-)

diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
index 8055d9163..573ff336f 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
@@ -39,10 +39,14 @@
 /** HTTP server response header, for transmission before the page contents. This indicates to the host that a page exists at the
  *  given location, and gives extra connection information.
  */
-char PROGMEM HTTPHeader[] = "HTTP/1.1 200 OK\r\n"
-                            "Server: LUFA RNDIS\r\n"
-                            "Content-type: text/html\r\n"
-                            "Connection: close\r\n\r\n";
+char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
+                               "Server: LUFA RNDIS\r\n"
+                               "Content-type: text/html\r\n"
+                               "Connection: close\r\n\r\n";
+							
+char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
+                               "Server: LUFA RNDIS\r\n"
+                               "Connection: close\r\n\r\n";
 
 /** HTTP page to serve to the host when a HTTP request is made. This page is too long for a single response, thus it is automatically
  *  broken up into smaller blocks and sent as a series of packets each time the webserver application callback is run.
@@ -105,29 +109,60 @@ void Webserver_ApplicationCallback(TCP_ConnectionState_t* ConnectionState, TCP_C
 	{
 		if (IsHTTPCommand(Buffer->Data, "GET"))
 		{
-			PageBlock = 0;
-
-			/* Copy the HTTP response header into the packet buffer */
-			strcpy_P(BufferDataStr, HTTPHeader);
-			
-			/* Send the buffer contents to the host */
-			TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
-
-			/* Lock the buffer to Device->Host transmissions only while we send the page contents */
-			TCP_APP_CAPTURE_BUFFER(Buffer);
+			if (IsHTTPCommand(Buffer->Data, "GET / "))
+			{
+				PageBlock = 0;
+
+				/* Copy the HTTP 200 response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP200Header);
+				
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+
+				/* Lock the buffer to Device->Host transmissions only while we send the page contents */
+				TCP_APP_CAPTURE_BUFFER(Buffer);
+			}
+			else
+			{
+				/* Copy the HTTP 404 response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP404Header);
+				
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+				
+				/* All data sent, close the connection */
+				TCP_APP_CLOSECONNECTION(ConnectionState);
+			}
 		}
 		else if (IsHTTPCommand(Buffer->Data, "HEAD"))
 		{
-			/* Copy the HTTP response header into the packet buffer */
-			strcpy_P(BufferDataStr, HTTPHeader);
-
-			/* Send the buffer contents to the host */
-			TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+			if (IsHTTPCommand(Buffer->Data, "HEAD / "))
+			{
+				/* Copy the HTTP response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP200Header);
+
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+			}
+			else
+			{
+				/* Copy the HTTP response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP404Header);
+
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));			
+			}
+			
+			/* All data sent, close the connection */
+			TCP_APP_CLOSECONNECTION(ConnectionState);
 		}
 		else if (IsHTTPCommand(Buffer->Data, "TRACE"))
 		{
 			/* Echo the host's query back to the host */
 			TCP_APP_SEND_BUFFER(Buffer, Buffer->Length);
+			
+			/* All data sent, close the connection */
+			TCP_APP_CLOSECONNECTION(ConnectionState);
 		}
 		else
 		{
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
index 8055d9163..573ff336f 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
@@ -39,10 +39,14 @@
 /** HTTP server response header, for transmission before the page contents. This indicates to the host that a page exists at the
  *  given location, and gives extra connection information.
  */
-char PROGMEM HTTPHeader[] = "HTTP/1.1 200 OK\r\n"
-                            "Server: LUFA RNDIS\r\n"
-                            "Content-type: text/html\r\n"
-                            "Connection: close\r\n\r\n";
+char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
+                               "Server: LUFA RNDIS\r\n"
+                               "Content-type: text/html\r\n"
+                               "Connection: close\r\n\r\n";
+							
+char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
+                               "Server: LUFA RNDIS\r\n"
+                               "Connection: close\r\n\r\n";
 
 /** HTTP page to serve to the host when a HTTP request is made. This page is too long for a single response, thus it is automatically
  *  broken up into smaller blocks and sent as a series of packets each time the webserver application callback is run.
@@ -105,29 +109,60 @@ void Webserver_ApplicationCallback(TCP_ConnectionState_t* ConnectionState, TCP_C
 	{
 		if (IsHTTPCommand(Buffer->Data, "GET"))
 		{
-			PageBlock = 0;
-
-			/* Copy the HTTP response header into the packet buffer */
-			strcpy_P(BufferDataStr, HTTPHeader);
-			
-			/* Send the buffer contents to the host */
-			TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
-
-			/* Lock the buffer to Device->Host transmissions only while we send the page contents */
-			TCP_APP_CAPTURE_BUFFER(Buffer);
+			if (IsHTTPCommand(Buffer->Data, "GET / "))
+			{
+				PageBlock = 0;
+
+				/* Copy the HTTP 200 response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP200Header);
+				
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+
+				/* Lock the buffer to Device->Host transmissions only while we send the page contents */
+				TCP_APP_CAPTURE_BUFFER(Buffer);
+			}
+			else
+			{
+				/* Copy the HTTP 404 response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP404Header);
+				
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+				
+				/* All data sent, close the connection */
+				TCP_APP_CLOSECONNECTION(ConnectionState);
+			}
 		}
 		else if (IsHTTPCommand(Buffer->Data, "HEAD"))
 		{
-			/* Copy the HTTP response header into the packet buffer */
-			strcpy_P(BufferDataStr, HTTPHeader);
-
-			/* Send the buffer contents to the host */
-			TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+			if (IsHTTPCommand(Buffer->Data, "HEAD / "))
+			{
+				/* Copy the HTTP response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP200Header);
+
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
+			}
+			else
+			{
+				/* Copy the HTTP response header into the packet buffer */
+				strcpy_P(BufferDataStr, HTTP404Header);
+
+				/* Send the buffer contents to the host */
+				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));			
+			}
+			
+			/* All data sent, close the connection */
+			TCP_APP_CLOSECONNECTION(ConnectionState);
 		}
 		else if (IsHTTPCommand(Buffer->Data, "TRACE"))
 		{
 			/* Echo the host's query back to the host */
 			TCP_APP_SEND_BUFFER(Buffer, Buffer->Length);
+			
+			/* All data sent, close the connection */
+			TCP_APP_CLOSECONNECTION(ConnectionState);
 		}
 		else
 		{
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 1a09e8b8e..483e0a6fd 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -35,6 +35,7 @@
   *  - Added new LEDs_ToggleLEDs() function to the LEDs driver
   *  - Added new Pipe_BoundEndpointNumber() and Pipe_IsEndpointBound() functions
   *  - Added new DEVICE_STATE_AS_GPIOR and HOST_STATE_AS_GPIOR compile time options
+  *  - Added 404 errors to the Webserver in the RNDIS demos to indicate invalid URLs
   *  
   *  <b>Changed:</b>
   *  - Deprecated psuedo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused)
-- 
GitLab