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

Subversion Repositories mlite

[/] [mlite/] [trunk/] [kernel/] [http.c] - Blame information for rev 192

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

powered by: WebSVN 2.1.0

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