⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.c

📁 Plasma IP Core 你可以利用这个组件在FPGA中设计MIPS结构的CPU
💻 C
字号:
/*-------------------------------------------------------------------- * TITLE: Plasma TCP/IP HTTP Server * AUTHOR: Steve Rhoads (rhoadss@yahoo.com) * DATE CREATED: 4/22/06 * FILENAME: http.c * PROJECT: Plasma CPU core * COPYRIGHT: Software placed into the public domain by the author. *    Software 'as is' without warranty.  Author liable for nothing. * DESCRIPTION: *    Plasma TCP/IP HTTP Server *--------------------------------------------------------------------*/#ifdef WIN32#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#define _LIBC#endif#include "rtos.h"#include "tcpip.h"#ifdef WIN32#define UartPrintf printf#define OS_MQueueCreate(A,B,C) 0#define OS_MQueueGet(A,B,C) 0#define OS_ThreadCreate(A,B,C,D,E) 0#endifconst char pageGif[]={   "HTTP/1.0 200 OK\r\n"   "Content-Length: %d\r\n"   "Content-Type: binary/gif\r\n\r\n"};const char pageBinary[]={   "HTTP/1.0 200 OK\r\n"   "Content-Length: %d\r\n"   "Content-Type: binary/binary\r\n\r\n"};const char pageHtml[]={   "HTTP/1.0 200 OK\r\n"   "Content-Length: %d\r\n"   "Content-Type: text/html\r\n\r\n"};const char pageText[]={   "HTTP/1.0 200 OK\r\n"   "Content-Length: %d\r\n"   "Content-Type: text/text\r\n\r\n"};const char pageEmpty[]={   "HTTP/1.0 404 OK\r\n"   "Content-Length: 0\r\n"   "Content-Type: text/html\r\n\r\n"};static const PageEntry_t *HtmlPages;static int HtmlFiles;static OS_MQueue_t *HttpMQueue;void HttpServerAction(IPSocket *socket){   uint8 buf[600];   int bytes, i, length, len, needFooter;   char *name=NULL, *page=NULL;   const char *header, *header2;   if(socket == NULL)      return;   bytes = IPRead(socket, buf, sizeof(buf)-1);   if(bytes)   {      buf[bytes] = 0;      if(strncmp((char*)buf, "GET /", 5) == 0)      {         for(i = 0; ; ++i)         {            length = HtmlPages[i].length;            if(length == -1)               break;            name = (char*)HtmlPages[i].name;            page = (char*)HtmlPages[i].page;            len = (int)strlen(name);            if(strncmp((char*)buf+4, name, len) == 0)               break;         }#ifdef WIN32         if(length == -1 && HtmlFiles)         {            FILE *file;            char *ptr;            name = (char*)buf + 5;            ptr = strstr(name, " ");            if(ptr)               *ptr = 0;            file = fopen(name, "rb");            if(file)            {               page = (char*)malloc(1024*1024*8);               length = (int)fread(page, 1, 1024*1024*8, file);               fclose(file);            }         }#endif         if(length != HTML_LENGTH_LIST_END)         {            if(length == HTML_LENGTH_CALLBACK)            {               IPFuncPtr funcPtr = (IPFuncPtr)(uint32)page;               funcPtr(socket, buf, bytes);               return;            }            if(length == 0)               length = (int)strlen(page);            needFooter = 0;#if 0            if(strstr(name, ".html"))               IPWrite(socket, (uint8*)pageHtml, (int)strlen(pageHtml));            else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)            {               IPWrite(socket, (uint8*)HtmlPages[0].page, (int)strlen(HtmlPages[0].page));               needFooter = 1;            }            else if(strstr(HtmlPages[i].name, ".gif"))               IPWrite(socket, (uint8*)pageGif, (int)strlen(pageGif));            else               IPWrite(socket, (uint8*)pageBinary, (int)strlen(pageBinary));#else            header2 = NULL;            if(strstr(name, ".html"))               header = pageHtml;            else if(strstr(name, ".htm") || strcmp(name, "/ ") == 0)            {               header = pageHtml;               header2 = HtmlPages[0].page;               needFooter = 1;            }            else if(strstr(HtmlPages[i].name, ".gif"))               header = pageGif;            else               header = pageBinary;            len = 0;            if(header2)               len += (int)strlen(header2) + (int)strlen(HtmlPages[1].page);            sprintf((char*)buf, header, length + len);            IPWrite(socket, buf, (int)strlen((char*)buf));            if(header2)               IPWrite(socket, (uint8*)header2, (int)strlen(header2));#endif            IPWrite(socket, (uint8*)page, length);            if(needFooter)               IPWrite(socket, (uint8*)HtmlPages[1].page, (int)strlen(HtmlPages[1].page));#ifdef WIN32            if(page != HtmlPages[i].page)               free(page);#endif         }         else         {            IPWrite(socket, (uint8*)pageEmpty, (int)strlen(pageEmpty));         }         IPClose(socket);      }   }}void HttpThread(void *Arg){   IPSocket *socket=NULL;   (void)Arg;   for(;;)   {      OS_MQueueGet(HttpMQueue, &socket, OS_WAIT_FOREVER);      HttpServerAction(socket);   }}void HttpServer(IPSocket *socket){#ifdef WIN32   HttpServerAction(socket);#else   OS_MQueueSend(HttpMQueue, &socket);#endif}void HttpInit(const PageEntry_t *Pages, int UseFiles){   HtmlPages = Pages;   HtmlFiles = UseFiles;   HttpMQueue = OS_MQueueCreate("http", FRAME_COUNT, 4);   OS_ThreadCreate("http", HttpThread, NULL, 50, 0);   IPOpen(IP_MODE_TCP, 0, 80, HttpServer);   IPOpen(IP_MODE_TCP, 0, 8080, HttpServer);}#if 0//Example test codestatic void MyProg(IPSocket *socket, char *request, int bytes){   char *text="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"              "<html><body>Hello World!</body></html>";   (void)request; (void)bytes;   IPWrite(socket, text, (int)strlen(text));   IPClose(socket);}static const PageEntry_t pageEntry[]={  //name, length, htmlText   {"/Header", 0, "<HTML><HEAD><TITLE>Plasma CPU</TITLE></HEAD>\n<BODY>"},   {"/Footer", 0, "</BODY></HTML>"},   {"/ ", 0, "<h2>Home Page</h2>Welcome!  <a href='/other.htm'>Other</a>"             " <a href='/cgi/myprog'>myprog</a>"},   {"/other.htm ", 0, "<h2>Other</h2>Other."},   //{"/binary/plasma.gif ", 1945, PlasmaGif},   {"/cgi/myprog", HTML_LENGTH_CALLBACK, (char*)MyProg},   {"", HTML_LENGTH_LIST_END, NULL}};void HttpTest(void){   HttpInit(pageEntry, 0);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -