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

Subversion Repositories plasma

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

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
 
60
 
61 224 rhoads
void HttpServer(IPSocket *socket)
62 155 rhoads
{
63
   uint8 buf[600];
64
   int bytes, i, length, len, needFooter;
65
   char *name=NULL, *page=NULL;
66 192 rhoads
   const char *header, *header2;
67 155 rhoads
 
68
   if(socket == NULL)
69
      return;
70
   bytes = IPRead(socket, buf, sizeof(buf)-1);
71
   if(bytes)
72
   {
73
      buf[bytes] = 0;
74
      if(strncmp((char*)buf, "GET /", 5) == 0)
75
      {
76
         for(i = 0; ; ++i)
77
         {
78
            length = HtmlPages[i].length;
79
            if(length == -1)
80
               break;
81
            name = (char*)HtmlPages[i].name;
82
            page = (char*)HtmlPages[i].page;
83
            len = (int)strlen(name);
84
            if(strncmp((char*)buf+4, name, len) == 0)
85
               break;
86
         }
87
#ifdef WIN32
88
         if(length == -1 && HtmlFiles)
89
         {
90
            FILE *file;
91
            char *ptr;
92
 
93
            name = (char*)buf + 5;
94
            ptr = strstr(name, " ");
95
            if(ptr)
96
               *ptr = 0;
97
            file = fopen(name, "rb");
98
            if(file)
99
            {
100
               page = (char*)malloc(1024*1024*8);
101
               length = (int)fread(page, 1, 1024*1024*8, file);
102
               fclose(file);
103
            }
104
         }
105
#endif
106 161 rhoads
         if(length != HTML_LENGTH_LIST_END)
107 155 rhoads
         {
108 161 rhoads
            if(length == HTML_LENGTH_CALLBACK)
109 155 rhoads
            {
110 172 rhoads
               IPFuncPtr funcPtr = (IPFuncPtr)(uint32)page;
111 161 rhoads
               funcPtr(socket, buf, bytes);
112 155 rhoads
               return;
113
            }
114
            if(length == 0)
115
               length = (int)strlen(page);
116
            needFooter = 0;
117 192 rhoads
#if 0
118 155 rhoads
            if(strstr(name, ".html"))
119
               IPWrite(socket, (uint8*)pageHtml, (int)strlen(pageHtml));
120
            else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)
121
            {
122
               IPWrite(socket, (uint8*)HtmlPages[0].page, (int)strlen(HtmlPages[0].page));
123
               needFooter = 1;
124
            }
125
            else if(strstr(HtmlPages[i].name, ".gif"))
126
               IPWrite(socket, (uint8*)pageGif, (int)strlen(pageGif));
127
            else
128
               IPWrite(socket, (uint8*)pageBinary, (int)strlen(pageBinary));
129 192 rhoads
#else
130
            header2 = NULL;
131
            if(strstr(name, ".html"))
132
               header = pageHtml;
133
            else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)
134
            {
135
               header = pageHtml;
136
               header2 = HtmlPages[0].page;
137
               needFooter = 1;
138
            }
139
            else if(strstr(HtmlPages[i].name, ".gif"))
140
               header = pageGif;
141
            else
142
               header = pageBinary;
143
            len = 0;
144
            if(header2)
145
               len += (int)strlen(header2) + (int)strlen(HtmlPages[1].page);
146
            sprintf((char*)buf, header, length + len);
147
            IPWrite(socket, buf, (int)strlen((char*)buf));
148
            if(header2)
149
               IPWrite(socket, (uint8*)header2, (int)strlen(header2));
150
#endif
151 155 rhoads
            IPWrite(socket, (uint8*)page, length);
152
            if(needFooter)
153
               IPWrite(socket, (uint8*)HtmlPages[1].page, (int)strlen(HtmlPages[1].page));
154
#ifdef WIN32
155
            if(page != HtmlPages[i].page)
156
               free(page);
157
#endif
158
         }
159
         else
160
         {
161
            IPWrite(socket, (uint8*)pageEmpty, (int)strlen(pageEmpty));
162
         }
163
         IPClose(socket);
164
      }
165
   }
166
}
167
 
168
 
169
void HttpInit(const PageEntry_t *Pages, int UseFiles)
170
{
171
   HtmlPages = Pages;
172
   HtmlFiles = UseFiles;
173
   IPOpen(IP_MODE_TCP, 0, 80, HttpServer);
174
   IPOpen(IP_MODE_TCP, 0, 8080, HttpServer);
175
}
176
 
177
 
178
#if 0
179
//Example test code
180 161 rhoads
static void MyProg(IPSocket *socket, char *request, int bytes)
181 155 rhoads
{
182
   char *text="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
183
              "<html><body>Hello World!</body></html>";
184 161 rhoads
   (void)request; (void)bytes;
185 155 rhoads
   IPWrite(socket, text, (int)strlen(text));
186
   IPClose(socket);
187
}
188
static const PageEntry_t pageEntry[]=
189
{  //name, length, htmlText
190 192 rhoads
   {"/Header", 0, "<HTML><HEAD><TITLE>Plasma CPU</TITLE></HEAD>\n<BODY>"},
191 155 rhoads
   {"/Footer", 0, "</BODY></HTML>"},
192
   {"/ ", 0, "<h2>Home Page</h2>Welcome!  <a href='/other.htm'>Other</a>"
193
             " <a href='/cgi/myprog'>myprog</a>"},
194
   {"/other.htm ", 0, "<h2>Other</h2>Other."},
195
   //{"/binary/plasma.gif ", 1945, PlasmaGif},
196
   {"/cgi/myprog", HTML_LENGTH_CALLBACK, (char*)MyProg},
197
   {"", HTML_LENGTH_LIST_END, NULL}
198
};
199
void HttpTest(void)
200
{
201
   HttpInit(pageEntry, 0);
202
}
203
#endif
204
 
205
 

powered by: WebSVN 2.1.0

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