123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #include "Webserver.h"
- const 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";
- const char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
- "Server: LUFA RNDIS\r\n"
- "Connection: close\r\n\r\n";
- const char PROGMEM HTTPPage[] =
- "<html>"
- " <head>"
- " <title>"
- " LUFA Webserver Demo"
- " </title>"
- " </head>"
- " <body>"
- " <h1>Hello from your USB AVR!</h1>"
- " <p>"
- " Hello! Welcome to the LUFA RNDIS Demo Webserver test page, running on your USB AVR via the LUFA library. This demonstrates the HTTP webserver, TCP/IP stack and RNDIS demo all running atop the LUFA USB stack."
- " <br /><br />"
- " <small>Project Information: <a href=\"http://www.lufa-lib.org\">http://www.lufa-lib.org</a>.</small>"
- " <hr />"
- " <i>LUFA Version: </i>" LUFA_VERSION_STRING
- " </p>"
- " </body>"
- "</html>";
- void Webserver_Init(void)
- {
-
- TCP_SetPortState(TCP_PORT_HTTP, TCP_Port_Open, Webserver_ApplicationCallback);
- }
- static bool IsHTTPCommand(uint8_t* RequestHeader,
- char* Command)
- {
-
- return (strncmp((char*)RequestHeader, Command, strlen(Command)) == 0);
- }
- void Webserver_ApplicationCallback(TCP_ConnectionState_t* const ConnectionState,
- TCP_ConnectionBuffer_t* const Buffer)
- {
- char* BufferDataStr = (char*)Buffer->Data;
- static uint8_t PageBlock = 0;
-
- if (TCP_APP_HAS_RECEIVED_PACKET(Buffer))
- {
- if (IsHTTPCommand(Buffer->Data, "GET"))
- {
- if (IsHTTPCommand(Buffer->Data, "GET / "))
- {
- PageBlock = 0;
-
- strcpy_P(BufferDataStr, HTTP200Header);
-
- TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
-
- TCP_APP_CAPTURE_BUFFER(Buffer);
- }
- else
- {
-
- strcpy_P(BufferDataStr, HTTP404Header);
-
- TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
-
- TCP_APP_CLOSECONNECTION(ConnectionState);
- }
- }
- else if (IsHTTPCommand(Buffer->Data, "HEAD"))
- {
- if (IsHTTPCommand(Buffer->Data, "HEAD / "))
- {
-
- strcpy_P(BufferDataStr, HTTP200Header);
-
- TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
- }
- else
- {
-
- strcpy_P(BufferDataStr, HTTP404Header);
-
- TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr));
- }
-
- TCP_APP_CLOSECONNECTION(ConnectionState);
- }
- else if (IsHTTPCommand(Buffer->Data, "TRACE"))
- {
-
- TCP_APP_SEND_BUFFER(Buffer, Buffer->Length);
-
- TCP_APP_CLOSECONNECTION(ConnectionState);
- }
- else
- {
-
- TCP_APP_CLEAR_BUFFER(Buffer);
- }
- }
- else if (TCP_APP_HAVE_CAPTURED_BUFFER(Buffer))
- {
- uint16_t RemLength = strlen_P(&HTTPPage[PageBlock * HTTP_REPLY_BLOCK_SIZE]);
- uint16_t Length;
-
- Length = MIN(RemLength, HTTP_REPLY_BLOCK_SIZE);
-
- strncpy_P(BufferDataStr, &HTTPPage[PageBlock * HTTP_REPLY_BLOCK_SIZE], Length);
-
- TCP_APP_SEND_BUFFER(Buffer, Length);
-
- if (PageBlock++ == (sizeof(HTTPPage) / HTTP_REPLY_BLOCK_SIZE))
- {
-
- TCP_APP_RELEASE_BUFFER(Buffer);
-
- TCP_APP_CLOSECONNECTION(ConnectionState);
- }
- }
- }
|