OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [http.c] - Blame information for rev 430

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 155 rhoads
/*--------------------------------------------------------------------
2
 * TITLE: Plasma TCP/IP HTTP Server
3
 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
 * DATE CREATED: 4/22/06
5
 * FILENAME: http.c
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.
9
 * DESCRIPTION:
10
 *    Plasma TCP/IP HTTP Server
11
 *--------------------------------------------------------------------*/
12
#include "rtos.h"
13
#include "tcpip.h"
14
#ifdef WIN32
15
#define UartPrintf printf
16 192 rhoads
#define OS_MQueueCreate(A,B,C) 0
17
#define OS_MQueueGet(A,B,C) 0
18
#define OS_ThreadCreate(A,B,C,D,E) 0
19 155 rhoads
#endif
20
 
21 237 rhoads
static const char pageGif[]=
22 155 rhoads
{
23
   "HTTP/1.0 200 OK\r\n"
24 192 rhoads
   "Content-Length: %d\r\n"
25 155 rhoads
   "Content-Type: binary/gif\r\n\r\n"
26
};
27 237 rhoads
static const char pageGif2[]=
28 155 rhoads
{
29
   "HTTP/1.0 200 OK\r\n"
30 237 rhoads
   "Content-Type: binary/gif\r\n\r\n"
31
};
32
static const char pageBinary[]=
33
{
34
   "HTTP/1.0 200 OK\r\n"
35 192 rhoads
   "Content-Length: %d\r\n"
36 155 rhoads
   "Content-Type: binary/binary\r\n\r\n"
37
};
38 237 rhoads
static const char pageBinary2[]=
39
{
40 155 rhoads
   "HTTP/1.0 200 OK\r\n"
41 237 rhoads
   "Content-Type: binary/binary\r\n\r\n"
42
};
43
static const char pageHtml[]={
44
   "HTTP/1.0 200 OK\r\n"
45 192 rhoads
   "Content-Length: %d\r\n"
46 155 rhoads
   "Content-Type: text/html\r\n\r\n"
47
};
48 237 rhoads
static const char pageHtml2[]={
49 155 rhoads
   "HTTP/1.0 200 OK\r\n"
50 237 rhoads
   "Content-Type: text/html\r\n\r\n"
51
};
52
static const char pageText[]={
53
   "HTTP/1.0 200 OK\r\n"
54 192 rhoads
   "Content-Length: %d\r\n"
55 155 rhoads
   "Content-Type: text/text\r\n\r\n"
56
};
57 237 rhoads
static const char pageEmpty[]=
58 155 rhoads
{
59
   "HTTP/1.0 404 OK\r\n"
60 192 rhoads
   "Content-Length: 0\r\n"
61 155 rhoads
   "Content-Type: text/html\r\n\r\n"
62
};
63
 
64
static const PageEntry_t *HtmlPages;
65
static int HtmlFiles;
66
 
67
 
68 224 rhoads
void HttpServer(IPSocket *socket)
69 155 rhoads
{
70
   uint8 buf[600];
71 302 rhoads
   char filename[80];
72 155 rhoads
   int bytes, i, length, len, needFooter;
73
   char *name=NULL, *page=NULL;
74 192 rhoads
   const char *header, *header2;
75 155 rhoads
 
76
   if(socket == NULL)
77
      return;
78 316 rhoads
   if(socket->funcPtr != HttpServer && socket->funcPtr)
79
   {
80
      socket->funcPtr(socket);
81
      return;
82
   }
83 430 rhoads
   socket->dontFlush = 2;
84 155 rhoads
   bytes = IPRead(socket, buf, sizeof(buf)-1);
85
   if(bytes)
86
   {
87
      buf[bytes] = 0;
88
      if(strncmp((char*)buf, "GET /", 5) == 0)
89
      {
90
         for(i = 0; ; ++i)
91
         {
92
            length = HtmlPages[i].length;
93
            if(length == -1)
94
               break;
95
            name = (char*)HtmlPages[i].name;
96
            page = (char*)HtmlPages[i].page;
97
            len = (int)strlen(name);
98
            if(strncmp((char*)buf+4, name, len) == 0)
99
               break;
100
         }
101 416 rhoads
#ifndef EXCLUDE_FILESYS
102 237 rhoads
         if(length == HTML_LENGTH_LIST_END && HtmlFiles)
103 155 rhoads
         {
104
            FILE *file;
105
            char *ptr;
106
 
107
            name = (char*)buf + 5;
108
            ptr = strstr(name, " ");
109
            if(ptr)
110
               *ptr = 0;
111 302 rhoads
            strcpy(filename, "/web/");
112
            strncat(filename, name, 60);
113
            file = fopen(filename, "rb");
114
            if(file == NULL)
115
            {
116
               strcpy(filename, "/flash/web/");
117
               strncat(filename, name, 60);
118
               file = fopen(filename, "rb");
119
            }
120 155 rhoads
            if(file)
121
            {
122 237 rhoads
               if(strstr(name, ".htm"))
123 310 rhoads
                  IPWrite(socket, (uint8*)pageHtml2, sizeof(pageHtml2)-1);
124 237 rhoads
               else if(strstr(name, ".gif"))
125 310 rhoads
                  IPWrite(socket, (uint8*)pageGif2, sizeof(pageGif2)-1);
126 237 rhoads
               else
127 310 rhoads
                  IPWrite(socket, (uint8*)pageBinary2, sizeof(pageBinary2)-1);
128 237 rhoads
               for(;;)
129
               {
130
                  len = fread(buf, 1, sizeof(buf), file);
131
                  if(len == 0)
132
                     break;
133
                  IPWrite(socket, (uint8*)buf, len);
134
               }
135 155 rhoads
               fclose(file);
136 237 rhoads
               IPWriteFlush(socket);
137
               IPClose(socket);
138
               return;
139 155 rhoads
            }
140
         }
141 416 rhoads
#endif //!EXCLUDE_FILESYS
142 161 rhoads
         if(length != HTML_LENGTH_LIST_END)
143 155 rhoads
         {
144 161 rhoads
            if(length == HTML_LENGTH_CALLBACK)
145 155 rhoads
            {
146 400 rhoads
               IPCallbackPtr funcPtr = (IPCallbackPtr)(uint32)page;
147 161 rhoads
               funcPtr(socket, buf, bytes);
148 155 rhoads
               return;
149
            }
150
            if(length == 0)
151
               length = (int)strlen(page);
152
            needFooter = 0;
153 192 rhoads
            header2 = NULL;
154
            if(strstr(name, ".html"))
155
               header = pageHtml;
156
            else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)
157
            {
158
               header = pageHtml;
159
               header2 = HtmlPages[0].page;
160
               needFooter = 1;
161
            }
162
            else if(strstr(HtmlPages[i].name, ".gif"))
163
               header = pageGif;
164
            else
165
               header = pageBinary;
166
            len = 0;
167
            if(header2)
168
               len += (int)strlen(header2) + (int)strlen(HtmlPages[1].page);
169
            sprintf((char*)buf, header, length + len);
170
            IPWrite(socket, buf, (int)strlen((char*)buf));
171
            if(header2)
172
               IPWrite(socket, (uint8*)header2, (int)strlen(header2));
173 155 rhoads
            IPWrite(socket, (uint8*)page, length);
174
            if(needFooter)
175
               IPWrite(socket, (uint8*)HtmlPages[1].page, (int)strlen(HtmlPages[1].page));
176
         }
177
         else
178
         {
179
            IPWrite(socket, (uint8*)pageEmpty, (int)strlen(pageEmpty));
180
         }
181
         IPClose(socket);
182
      }
183
   }
184
}
185
 
186
 
187
void HttpInit(const PageEntry_t *Pages, int UseFiles)
188
{
189
   HtmlPages = Pages;
190
   HtmlFiles = UseFiles;
191
   IPOpen(IP_MODE_TCP, 0, 80, HttpServer);
192
   IPOpen(IP_MODE_TCP, 0, 8080, HttpServer);
193
}
194
 
195
 
196 244 rhoads
#ifdef EXAMPLE_HTML
197 155 rhoads
//Example test code
198 161 rhoads
static void MyProg(IPSocket *socket, char *request, int bytes)
199 155 rhoads
{
200
   char *text="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
201
              "<html><body>Hello World!</body></html>";
202 161 rhoads
   (void)request; (void)bytes;
203 244 rhoads
   IPWrite(socket, (uint8*)text, (int)strlen(text));
204 155 rhoads
   IPClose(socket);
205
}
206
static const PageEntry_t pageEntry[]=
207
{  //name, length, htmlText
208 192 rhoads
   {"/Header", 0, "<HTML><HEAD><TITLE>Plasma CPU</TITLE></HEAD>\n<BODY>"},
209 155 rhoads
   {"/Footer", 0, "</BODY></HTML>"},
210
   {"/ ", 0, "<h2>Home Page</h2>Welcome!  <a href='/other.htm'>Other</a>"
211
             " <a href='/cgi/myprog'>myprog</a>"},
212
   {"/other.htm ", 0, "<h2>Other</h2>Other."},
213
   //{"/binary/plasma.gif ", 1945, PlasmaGif},
214 400 rhoads
   {"/cgi/myprog", HTML_LENGTH_CALLBACK, (char*)(int)MyProg},
215 155 rhoads
   {"", HTML_LENGTH_LIST_END, NULL}
216
};
217 244 rhoads
void HtmlInit(int UseFiles)
218 155 rhoads
{
219 244 rhoads
   (void)UseFiles;
220 237 rhoads
   HttpInit(pageEntry, 1);
221 155 rhoads
}
222
#endif
223
 
224
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.