/*************************************************************************************** File: http.c Date: 24.2.2003 Version: 0.1 Author: Jari Lahti (jari@violasystems.com) Description: This file implements simple HTTP 1.0 server. Version Info: 9.10.2002 - First version (Jari Lahti) 24.2.2003 - Put sockets back to listen 22.2.2004 - Port for MCF5282 01.8.2004 - Port for MCF53x(A19257) ***************************************************************************************/ #include "opentcp.h" UINT8 https_enabled = 0; struct { UINT8 state; UINT8 ownersocket; UINT32 fstart; /* Can contain pointer or start address on e.g. external */ UINT32 flen; /* EEPROM etc. */ UINT32 fpoint; UINT16 funacked; } Https[NO_OF_HTTP_SESSIONS]; const char Https_NotFoundPage[] = "HTTP/1.0 200 OK\r\n\ Server: ESERV-10/1.0\nContent-type: text/html\r\n\ Content-length: 400\r\n\ \r\n\ \ Viola Systems Embedded WEB Server\ \

HTTP 1.0 404 Error. File Not Found

\ The requested URL was not found on this server.\
\
\ \r\n\ Viola Systems Embedded WEB Server 2.1, 2002\
\ Web Server for Embedded Applications\
\r\n\
\ \ www.violasystems.com - Embedding The Internet\ "; /* const char Https_TestIndexPage[] = "HTTP/1.0 200 OK\r\n\ Server: ESERV-10/1.0\nContent-type: text/html\r\n\ Content-length: 400\r\n\ \r\n\ \ Viola Systems Embedded WEB Server\ \

Test page

\ Replace the page with your own content.\
\
\ \r\n\ Viola Systems Embedded WEB Server 2.1, 2002\
\ Web Server for Embedded Applications\
\r\n\
\ \ www.violasystems.com - Embedding The Internet\ "; */ extern char *Https_TestIndexPage; /* = "HTTP/1.0 200 OK\r\n\ Server: ESERV-10/1.0\nContent-type: text/html\r\n\ Content-length: 400\r\n\ \r\n\ \ InSyst\ \

InSyst

\ Status:
\ "; const char Https_TestIndexPage_default[] = "1:
"; char *Https_TestIndexPage_dynamic = (char*)Https_TestIndexPage_default; const char Https_TestIndexPage_end[] = "\
\
\ \r\n\ InSyst ColdFire System, BNL\
\ Web Server for Embedded Applications\
\r\n\
\ \ Andrey Sukhanov\ "; */ /******************************************************************************** Function: init_http Parameters: void Return val: INT8 - (>=0) OK (-1) Error Date: 13.10.2002 Desc: This function should be called before the HTTP Server application is used to set the operating parameters of it *********************************************************************************/ INT8 init_http (void) { UINT8 i; INT8 soch; for( i=0; i= NO_OF_HTTP_SESSIONS) ses = 0; /* Keep sockets listening */ if(tcp_getstate(Https[ses].ownersocket) < TCP_STATE_LISTENING) { tcp_listen(Https[ses].ownersocket, HTTPS_SERVERPORT); ses++; continue; } if(Https[ses].state != HTTPS_STATE_ACTIVE) { ses++; continue; } if(Https[ses].funacked != 0) { ses++; continue; } if(Https[ses].fstart == 0) { ses++; continue; } /* End of data? */ if( Https[ses].fpoint >= Https[ses].flen) { tcp_close(Https[ses].ownersocket); tcp_abort(Https[ses].ownersocket); https_deletesession(ses); ses++; return; } /* More data to send */ len = https_loadbuffer(ses, &OTCP_TXBUF[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET); if(len<0) return; len = tcp_send(Https[ses].ownersocket, &OTCP_TXBUF[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len); if(len<0) { tcp_close(Https[ses].ownersocket); https_deletesession(ses); ses++; return; } Https[ses].funacked = len; /* Serve another session on next run */ ses++; return; } } /******************************************************************************** Function: https_eventlistener Parameters: INT8 cbhandle - handle to TCP socket where event is coming from UINT8 event - type of event UINT32 par1 - parameter the meaning of depends on event UINT32 par2 - parameter the meaning of depends on event Return val: INT32 - depends on event but usually (-1) is error of some kind and positive reply means OK Date: 13.10.2002 Desc: This function is given to TCP socket as function pointer to be used by TCP engine to make callbacks to inform about events on TCP e.g. arriving data. *********************************************************************************/ INT32 https_eventlistener (INT8 cbhandle, UINT8 event, UINT32 par1, UINT32 par2) { /* This function is called by TCP stack to inform about events */ INT16 i; INT16 session; if( https_enabled == 0) return(-1); if(cbhandle < 0) return(-1); /* Search for rigth session */ session = https_searchsession(cbhandle); switch( event ) { case TCP_EVENT_CONREQ: /* Do we have a session for requesting socket? */ if(session < 0) return(-1); /* Try to get new session */ session = https_bindsession(cbhandle); if(session < 0) /* No resources */ return(-1); return(1); case TCP_EVENT_ABORT: if(session < 0) return(1); https_deletesession((UINT8)session); return(1); case TCP_EVENT_CONNECTED: if(session < 0) return(-1); https_activatesession((UINT8)session); return(1); case TCP_EVENT_CLOSE: if(session < 0) return(-1); https_deletesession((UINT8)session); return(1); case TCP_EVENT_ACK: if(session < 0) return(-1); Https[session].fpoint += Https[session].funacked; Https[session].funacked = 0; return(1); case TCP_EVENT_DATA: /* Check for GET request */ if(session < 0) return(-1); if(Https[session].fstart == 0) { if(par1 <= 3) return(1); /* Check for GET */ if(RECEIVE_NETWORK_B() != 'G') return(1); if(RECEIVE_NETWORK_B() != 'E') return(1); if(RECEIVE_NETWORK_B() != 'T') return(1); par1 -= 3; /* Search for '/' */ for(i=0; i 60) len = 60; for( i=0; i= buflen) break; *buf++ = Https_NotFoundPage[Https[ses].fpoint + i]; } return(i); } /* Other page asked */ for(i=0; i < (Https[ses].flen - Https[ses].fpoint); i++) { if(i >= buflen) break; *buf++ = *(UINT8*)(Https[ses].fstart + Https[ses].fpoint + i); } return(i); }