Andrew Boyson / web

Dependents:   oldheating gps motorhome heating

Revision:
109:3e82f62c7e1f
Parent:
108:91bfb40e7487
Child:
110:8ab752842d25
--- a/web-base.c	Sun Apr 28 09:56:42 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-#include "web-base.h"
-#include "web-derived.h"
-#include "http.h"
-#include "fault.h"
-#include "led.h"
-#include "mstimer.h"
-
-#define DO_LOGIN            DO_SERVER  +   0
-#define DO_FAVICON          DO_SERVER  +   1
-#define DO_BASE_CSS         DO_SERVER  +   2
-#define DO_NAV_CSS          DO_SERVER  +   3
-#define DO_TRACE_HTML       DO_SERVER  +   4
-#define DO_TRACE_AJAX       DO_SERVER  +   5
-#define DO_TRACE_SCRIPT     DO_SERVER  +   6
-#define DO_CLOCK_HTML       DO_SERVER  +   7
-#define DO_CLOCK_AJAX       DO_SERVER  +   8
-#define DO_CLOCK_SCRIPT     DO_SERVER  +   9
-#define DO_NET_HTML         DO_SERVER  +  10
-#define DO_NET4_HTML        DO_SERVER  +  11
-#define DO_NET4_AJAX        DO_SERVER  +  12
-#define DO_NET4_SCRIPT      DO_SERVER  +  13
-#define DO_NET6_HTML        DO_SERVER  +  14
-#define DO_NET6_AJAX        DO_SERVER  +  15
-#define DO_NET6_SCRIPT      DO_SERVER  +  16
-#define DO_LOG_HTML         DO_SERVER  +  17
-#define DO_FAULT_HTML       DO_SERVER  +  18
-#define DO_FIRMWARE_HTML    DO_SERVER  +  19
-#define DO_FIRMWARE_AJAX    DO_SERVER  +  20
-#define DO_FIRMWARE_SCRIPT  DO_SERVER  +  21
-#define DO_SEND_SESSION_ID  DO_DERIVED + 100
-
-#define LOGIN_DELAY_MS 200
-
-static int decideWhatToDoFromPath(char *pPath, char* pLastModified)
-{
-    if (HttpSameStr(pPath, "/login"        )) return DO_LOGIN;
-    if (HttpSameStr(pPath, "/clock"        )) return DO_CLOCK_HTML;
-    if (HttpSameStr(pPath, "/clock-ajax"   )) return DO_CLOCK_AJAX;
-    if (HttpSameStr(pPath, "/net"          )) return DO_NET_HTML;
-    if (HttpSameStr(pPath, "/net4"         )) return DO_NET4_HTML;
-    if (HttpSameStr(pPath, "/net4-ajax"    )) return DO_NET4_AJAX;
-    if (HttpSameStr(pPath, "/net6"         )) return DO_NET6_HTML;
-    if (HttpSameStr(pPath, "/net6-ajax"    )) return DO_NET6_AJAX;
-    if (HttpSameStr(pPath, "/log"          )) return DO_LOG_HTML;
-    if (HttpSameStr(pPath, "/trace"        )) return DO_TRACE_HTML;
-    if (HttpSameStr(pPath, "/trace-ajax"   )) return DO_TRACE_AJAX;
-    if (HttpSameStr(pPath, "/fault"        )) return DO_FAULT_HTML;
-    if (HttpSameStr(pPath, "/firmware"     )) return DO_FIRMWARE_HTML;
-    if (HttpSameStr(pPath, "/firmware-ajax")) return DO_FIRMWARE_AJAX;
-
-    if (HttpSameStr(pPath, "/favicon.ico"  )) return HttpSameDate(WebFaviconDate,        WebFaviconTime,        pLastModified) ? DO_NOT_MODIFIED : DO_FAVICON;
-    if (HttpSameStr(pPath, "/base.css"     )) return HttpSameDate(WebBaseCssDate,        WebBaseCssTime,        pLastModified) ? DO_NOT_MODIFIED : DO_BASE_CSS;
-    if (HttpSameStr(pPath, "/settings.css" )) return HttpSameDate(WebNavCssDate,         WebNavCssTime,         pLastModified) ? DO_NOT_MODIFIED : DO_NAV_CSS;
-    if (HttpSameStr(pPath, "/net4.js"      )) return HttpSameDate(WebNet4ScriptDate,     WebNet4ScriptTime,     pLastModified) ? DO_NOT_MODIFIED : DO_NET4_SCRIPT;
-    if (HttpSameStr(pPath, "/net6.js"      )) return HttpSameDate(WebNet6ScriptDate,     WebNet6ScriptTime,     pLastModified) ? DO_NOT_MODIFIED : DO_NET6_SCRIPT;
-    if (HttpSameStr(pPath, "/trace.js"     )) return HttpSameDate(WebTraceScriptDate,    WebTraceScriptTime,    pLastModified) ? DO_NOT_MODIFIED : DO_TRACE_SCRIPT;
-    if (HttpSameStr(pPath, "/clock.js"     )) return HttpSameDate(WebClockScriptDate,    WebClockScriptTime,    pLastModified) ? DO_NOT_MODIFIED : DO_CLOCK_SCRIPT;
-    if (HttpSameStr(pPath, "/firmware.js"  )) return HttpSameDate(WebFirmwareScriptDate, WebFirmwareScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_FIRMWARE_SCRIPT;
-
-    return WebDerivedRequest(pPath, pLastModified);
-}
-static void handleQuery(int todo, char* pQuery)
-{
-    switch (todo)
-    {
-        case DO_LOGIN:         WebLoginQuery   (pQuery); return;
-        case DO_TRACE_AJAX:    WebTraceQuery   (pQuery); return;
-        case DO_CLOCK_AJAX:    WebClockQuery   (pQuery); return;
-        case DO_CLOCK_HTML:    WebClockQuery   (pQuery); return;
-        case DO_LOG_HTML:      WebLogQuery     (pQuery); return;
-        case DO_FAULT_HTML:    WebFaultQuery   (pQuery); return;
-        case DO_FIRMWARE_HTML: WebFirmwareQuery(pQuery); return;
-        case DO_FIRMWARE_AJAX: WebFirmwareQuery(pQuery); return;
-    }
-    WebDerivedGet(todo, pQuery);
-}
-static bool handlePost(int todo, int contentLength, int contentStart, int size, char* pRequestStream, uint32_t positionInRequestStream)
-{
-    switch (todo)
-    {
-        case DO_FIRMWARE_AJAX: return WebFirmwarePost(contentLength, contentStart, size, pRequestStream, positionInRequestStream);
-    }
-    return WebDerivedPost(todo, contentLength, size, pRequestStream, positionInRequestStream);
-}
-
-static void serverRequest(int size, char* pRequestStream, uint32_t positionInRequestStream, int* pToDo, bool* pPostComplete, uint32_t* pDelayUntil)
-{
-    //Handle request for the first packet of data received but leave todo the same after that.
-    int contentLength = 0;
-    int contentStart  = 0;
-    if (size && positionInRequestStream == 0)
-    {
-        //Read the headers
-        char* pMethod;
-        char* pPath;
-        char* pQuery;
-        char* pLastModified;
-        char* pCookies;
-        contentStart = HttpRequestRead(pRequestStream, size, &pMethod, &pPath, &pQuery, &pLastModified, &pCookies, &contentLength);
-        
-        //Ask the web server what to do
-        *pToDo = decideWhatToDoFromPath(pPath, pLastModified);
-        
-        //If what to do is NOTHING, NOT_FOUND or NOT_MODIFIED then no query or post will be valid so stop now
-        if (*pToDo < DO_SERVER) { *pPostComplete = true; return; }
-        
-        //If what to do is LOGIN then the user has just returned the login form
-        if (*pToDo == DO_LOGIN)
-        {
-            handleQuery(*pToDo, pQuery);                  //Read the password and the original location
-            if (WebLoginQueryPasswordOk)
-            {
-                if (!WebLoginSessionIdIsSet())           //If there isn't a session id already
-                {
-                    WebLoginSessionIdNew();              //Create a new session id
-                }
-                *pToDo =  WebLoginOriginalToDo;          //Load the original todo and SEND_SESSION_ID
-                *pToDo += DO_SEND_SESSION_ID;
-            }
-            *pDelayUntil = MsTimerCount + LOGIN_DELAY_MS; //To prevent brute forcing the hash delay the reply to the login
-            *pPostComplete = true;
-            return;                                       //Either way no query or post will be valid
-        }
-        
-        //Have a normal request so authenticate
-        if (!WebLoginCookiesContainValidSessionId(pCookies))
-        {
-            WebLoginOriginalToDo = *pToDo; //Record the original destination for redirection
-            *pToDo = DO_LOGIN;
-            *pPostComplete = true;
-            return; //Ignore any query or post as the user is not authenticated
-        }
-        
-        //Handle the query
-        handleQuery(*pToDo, pQuery);
-    }
-    
-    //Do the upload of anything that needs it. Todos it doesn't understand are ignored.
-    if (!*pPostComplete) *pPostComplete = handlePost(*pToDo, contentLength, contentStart, size, pRequestStream, positionInRequestStream);
-}
-
-static void serverReply(int todo)
-{
-    //Check if todo includes the need to send a cookie
-    if (todo >= DO_SEND_SESSION_ID)
-    {
-        HttpOkCookieName   = WebLoginSessionNameGet();
-        HttpOkCookieValue  = WebLoginSessionIdGet();
-        HttpOkCookieMaxAge = WebLoginSessionNameLife();
-        todo -= DO_SEND_SESSION_ID;
-    }
-    else
-    {
-        HttpOkCookieName   = NULL;
-        HttpOkCookieValue  = NULL;
-        HttpOkCookieMaxAge = -1;
-    }
-    
-    //Try all the base modules
-    switch (todo)
-    {
-        case DO_NOT_FOUND:       HttpNotFound      (); return;
-        case DO_NOT_MODIFIED:    HttpNotModified   (); return;
-        case DO_LOGIN:           WebLoginHtml     (); return;
-        case DO_FAVICON:         WebFavicon       (); return;
-        case DO_BASE_CSS:        WebBaseCss       (); return;
-        case DO_NAV_CSS:         WebNavCss        (); return;
-        case DO_TRACE_HTML:      WebTraceHtml     (); return;
-        case DO_TRACE_AJAX:      WebTraceAjax     (); return;
-        case DO_TRACE_SCRIPT:    WebTraceScript   (); return;
-        case DO_CLOCK_HTML:      WebClockHtml     (); return;
-        case DO_CLOCK_AJAX:      WebClockAjax     (); return;
-        case DO_CLOCK_SCRIPT:    WebClockScript   (); return;
-        case DO_NET_HTML:        WebNetHtml       (); return;
-        case DO_NET4_HTML:       WebNet4Html      (); return;
-        case DO_NET4_AJAX:       WebNet4Ajax      (); return;
-        case DO_NET4_SCRIPT:     WebNet4Script    (); return;
-        case DO_NET6_HTML:       WebNet6Html      (); return;
-        case DO_NET6_AJAX:       WebNet6Ajax      (); return;
-        case DO_NET6_SCRIPT:     WebNet6Script    (); return;
-        case DO_LOG_HTML:        WebLogHtml       (); return;
-        case DO_FAULT_HTML:      WebFaultHtml     (); return;
-        case DO_FIRMWARE_HTML:   WebFirmwareHtml  (); return;
-        case DO_FIRMWARE_AJAX:   WebFirmwareAjax  (); return;
-        case DO_FIRMWARE_SCRIPT: WebFirmwareScript(); return;
-    }
-    
-    //If not called then call the derived (child) module
-    WebDerivedReply(todo);
-}
-
-int WebInit()
-{
-    HttpRequestFunction = serverRequest;
-    HttpReplyFunction   = serverReply;
-    
-    WebLoginInit();
-    
-    return 0;
-}