1 /*--------------------------------------------------------------------
2 * TITLE: Plasma TCP/IP HTTP Server
3 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4 * DATE CREATED: 4/22/06
6 * PROJECT: Plasma CPU core
7 * COPYRIGHT: Software placed into the public domain by the author.
8 * Software 'as is' without warranty. Author liable for nothing.
10 * Plasma TCP/IP HTTP Server
11 *--------------------------------------------------------------------*/
22 #define UartPrintf printf
23 #define OS_MQueueCreate(A,B,C) 0
24 #define OS_MQueueGet(A,B,C) 0
25 #define OS_ThreadCreate(A,B,C,D,E) 0
28 static const char pageGif[]=
31 "Content-Length: %d\r\n"
32 "Content-Type: binary/gif\r\n\r\n"
34 static const char pageGif2[]=
37 "Content-Type: binary/gif\r\n\r\n"
39 static const char pageBinary[]=
42 "Content-Length: %d\r\n"
43 "Content-Type: binary/binary\r\n\r\n"
45 static const char pageBinary2[]=
48 "Content-Type: binary/binary\r\n\r\n"
50 static const char pageHtml[]={
52 "Content-Length: %d\r\n"
53 "Content-Type: text/html\r\n\r\n"
55 static const char pageHtml2[]={
57 "Content-Type: text/html\r\n\r\n"
59 static const char pageText[]={
61 "Content-Length: %d\r\n"
62 "Content-Type: text/text\r\n\r\n"
64 static const char pageEmpty[]=
67 "Content-Length: 0\r\n"
68 "Content-Type: text/html\r\n\r\n"
71 static const PageEntry_t *HtmlPages;
75 void HttpServer(IPSocket *socket)
79 int bytes, i, length, len, needFooter;
80 char *name=NULL, *page=NULL;
81 const char *header, *header2;
85 if(socket->funcPtr != HttpServer && socket->funcPtr)
87 socket->funcPtr(socket);
90 bytes = IPRead(socket, buf, sizeof(buf)-1);
94 if(strncmp((char*)buf, "GET /", 5) == 0)
98 length = HtmlPages[i].length;
101 name = (char*)HtmlPages[i].name;
102 page = (char*)HtmlPages[i].page;
103 len = (int)strlen(name);
104 if(strncmp((char*)buf+4, name, len) == 0)
107 #if defined(WIN32) || defined(INCLUDE_FILESYS)
108 if(length == HTML_LENGTH_LIST_END && HtmlFiles)
113 name = (char*)buf + 5;
114 ptr = strstr(name, " ");
117 strcpy(filename, "/web/");
118 strncat(filename, name, 60);
119 file = fopen(filename, "rb");
122 strcpy(filename, "/flash/web/");
123 strncat(filename, name, 60);
124 file = fopen(filename, "rb");
128 if(strstr(name, ".htm"))
129 IPWrite(socket, (uint8*)pageHtml2, sizeof(pageHtml2)-1);
130 else if(strstr(name, ".gif"))
131 IPWrite(socket, (uint8*)pageGif2, sizeof(pageGif2)-1);
133 IPWrite(socket, (uint8*)pageBinary2, sizeof(pageBinary2)-1);
136 len = fread(buf, 1, sizeof(buf), file);
139 IPWrite(socket, (uint8*)buf, len);
142 IPWriteFlush(socket);
148 if(length != HTML_LENGTH_LIST_END)
150 if(length == HTML_LENGTH_CALLBACK)
152 IPFuncPtr funcPtr = (IPFuncPtr)(uint32)page;
153 funcPtr(socket, buf, bytes);
157 length = (int)strlen(page);
160 if(strstr(name, ".html"))
162 else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)
165 header2 = HtmlPages[0].page;
168 else if(strstr(HtmlPages[i].name, ".gif"))
174 len += (int)strlen(header2) + (int)strlen(HtmlPages[1].page);
175 sprintf((char*)buf, header, length + len);
176 IPWrite(socket, buf, (int)strlen((char*)buf));
178 IPWrite(socket, (uint8*)header2, (int)strlen(header2));
179 IPWrite(socket, (uint8*)page, length);
181 IPWrite(socket, (uint8*)HtmlPages[1].page, (int)strlen(HtmlPages[1].page));
185 IPWrite(socket, (uint8*)pageEmpty, (int)strlen(pageEmpty));
193 void HttpInit(const PageEntry_t *Pages, int UseFiles)
196 HtmlFiles = UseFiles;
197 IPOpen(IP_MODE_TCP, 0, 80, HttpServer);
198 IPOpen(IP_MODE_TCP, 0, 8080, HttpServer);
204 static void MyProg(IPSocket *socket, char *request, int bytes)
206 char *text="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
207 "<html><body>Hello World!</body></html>";
208 (void)request; (void)bytes;
209 IPWrite(socket, (uint8*)text, (int)strlen(text));
212 static const PageEntry_t pageEntry[]=
213 { //name, length, htmlText
214 {"/Header", 0, "<HTML><HEAD><TITLE>Plasma CPU</TITLE></HEAD>\n<BODY>"},
215 {"/Footer", 0, "</BODY></HTML>"},
216 {"/ ", 0, "<h2>Home Page</h2>Welcome! <a href='/other.htm'>Other</a>"
217 " <a href='/cgi/myprog'>myprog</a>"},
218 {"/other.htm ", 0, "<h2>Other</h2>Other."},
219 //{"/binary/plasma.gif ", 1945, PlasmaGif},
220 {"/cgi/myprog", HTML_LENGTH_CALLBACK, (char*)MyProg},
221 {"", HTML_LENGTH_LIST_END, NULL}
223 void HtmlInit(int UseFiles)
226 HttpInit(pageEntry, 1);