Andrew Boyson / web

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Sun Apr 28 09:45:02 2019 +0000
Revision:
106:7cff473be687
Parent:
105:43ef124233cd
Parent:
104:40097d08edd5
Child:
107:8ce0c528e2e5
Tidied

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 103:91194cc19bbb 1 #include "web-base.h"
andrewboyson 103:91194cc19bbb 2 #include "web-derived.h"
andrewboyson 103:91194cc19bbb 3 #include "http.h"
andrewboyson 103:91194cc19bbb 4 #include "fault.h"
andrewboyson 103:91194cc19bbb 5 #include "led.h"
andrewboyson 103:91194cc19bbb 6 #include "mstimer.h"
andrewboyson 103:91194cc19bbb 7
andrewboyson 103:91194cc19bbb 8 #define DO_LOGIN DO_SERVER + 0
andrewboyson 103:91194cc19bbb 9 #define DO_FAVICON DO_SERVER + 1
andrewboyson 103:91194cc19bbb 10 #define DO_BASE_CSS DO_SERVER + 2
andrewboyson 103:91194cc19bbb 11 #define DO_NAV_CSS DO_SERVER + 3
andrewboyson 103:91194cc19bbb 12 #define DO_TRACE_HTML DO_SERVER + 4
andrewboyson 103:91194cc19bbb 13 #define DO_TRACE_AJAX DO_SERVER + 5
andrewboyson 103:91194cc19bbb 14 #define DO_TRACE_SCRIPT DO_SERVER + 6
andrewboyson 103:91194cc19bbb 15 #define DO_CLOCK_HTML DO_SERVER + 7
andrewboyson 103:91194cc19bbb 16 #define DO_CLOCK_AJAX DO_SERVER + 8
andrewboyson 103:91194cc19bbb 17 #define DO_CLOCK_SCRIPT DO_SERVER + 9
andrewboyson 103:91194cc19bbb 18 #define DO_NET_HTML DO_SERVER + 10
andrewboyson 103:91194cc19bbb 19 #define DO_NET4_HTML DO_SERVER + 11
andrewboyson 103:91194cc19bbb 20 #define DO_NET4_AJAX DO_SERVER + 12
andrewboyson 103:91194cc19bbb 21 #define DO_NET4_SCRIPT DO_SERVER + 13
andrewboyson 103:91194cc19bbb 22 #define DO_NET6_HTML DO_SERVER + 14
andrewboyson 103:91194cc19bbb 23 #define DO_NET6_AJAX DO_SERVER + 15
andrewboyson 103:91194cc19bbb 24 #define DO_NET6_SCRIPT DO_SERVER + 16
andrewboyson 103:91194cc19bbb 25 #define DO_LOG_HTML DO_SERVER + 17
andrewboyson 103:91194cc19bbb 26 #define DO_FAULT_HTML DO_SERVER + 18
andrewboyson 103:91194cc19bbb 27 #define DO_FIRMWARE_HTML DO_SERVER + 19
andrewboyson 103:91194cc19bbb 28 #define DO_FIRMWARE_AJAX DO_SERVER + 20
andrewboyson 103:91194cc19bbb 29 #define DO_FIRMWARE_SCRIPT DO_SERVER + 21
andrewboyson 103:91194cc19bbb 30 #define DO_SEND_SESSION_ID DO_DERIVED + 100
andrewboyson 103:91194cc19bbb 31
andrewboyson 103:91194cc19bbb 32 #define LOGIN_DELAY_MS 200
andrewboyson 103:91194cc19bbb 33
andrewboyson 103:91194cc19bbb 34 static int decideWhatToDoFromPath(char *pPath, char* pLastModified)
andrewboyson 103:91194cc19bbb 35 {
andrewboyson 103:91194cc19bbb 36 if (HttpSameStr(pPath, "/login" )) return DO_LOGIN;
andrewboyson 103:91194cc19bbb 37 if (HttpSameStr(pPath, "/clock" )) return DO_CLOCK_HTML;
andrewboyson 103:91194cc19bbb 38 if (HttpSameStr(pPath, "/clock-ajax" )) return DO_CLOCK_AJAX;
andrewboyson 103:91194cc19bbb 39 if (HttpSameStr(pPath, "/net" )) return DO_NET_HTML;
andrewboyson 103:91194cc19bbb 40 if (HttpSameStr(pPath, "/net4" )) return DO_NET4_HTML;
andrewboyson 103:91194cc19bbb 41 if (HttpSameStr(pPath, "/net4-ajax" )) return DO_NET4_AJAX;
andrewboyson 103:91194cc19bbb 42 if (HttpSameStr(pPath, "/net6" )) return DO_NET6_HTML;
andrewboyson 103:91194cc19bbb 43 if (HttpSameStr(pPath, "/net6-ajax" )) return DO_NET6_AJAX;
andrewboyson 103:91194cc19bbb 44 if (HttpSameStr(pPath, "/log" )) return DO_LOG_HTML;
andrewboyson 103:91194cc19bbb 45 if (HttpSameStr(pPath, "/trace" )) return DO_TRACE_HTML;
andrewboyson 103:91194cc19bbb 46 if (HttpSameStr(pPath, "/trace-ajax" )) return DO_TRACE_AJAX;
andrewboyson 103:91194cc19bbb 47 if (HttpSameStr(pPath, "/fault" )) return DO_FAULT_HTML;
andrewboyson 103:91194cc19bbb 48 if (HttpSameStr(pPath, "/firmware" )) return DO_FIRMWARE_HTML;
andrewboyson 103:91194cc19bbb 49 if (HttpSameStr(pPath, "/firmware-ajax")) return DO_FIRMWARE_AJAX;
andrewboyson 103:91194cc19bbb 50
andrewboyson 103:91194cc19bbb 51 if (HttpSameStr(pPath, "/favicon.ico" )) return HttpSameDate(WebFaviconDate, WebFaviconTime, pLastModified) ? DO_NOT_MODIFIED : DO_FAVICON;
andrewboyson 103:91194cc19bbb 52 if (HttpSameStr(pPath, "/base.css" )) return HttpSameDate(WebBaseCssDate, WebBaseCssTime, pLastModified) ? DO_NOT_MODIFIED : DO_BASE_CSS;
andrewboyson 103:91194cc19bbb 53 if (HttpSameStr(pPath, "/settings.css" )) return HttpSameDate(WebNavCssDate, WebNavCssTime, pLastModified) ? DO_NOT_MODIFIED : DO_NAV_CSS;
andrewboyson 103:91194cc19bbb 54 if (HttpSameStr(pPath, "/net4.js" )) return HttpSameDate(WebNet4ScriptDate, WebNet4ScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_NET4_SCRIPT;
andrewboyson 103:91194cc19bbb 55 if (HttpSameStr(pPath, "/net6.js" )) return HttpSameDate(WebNet6ScriptDate, WebNet6ScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_NET6_SCRIPT;
andrewboyson 103:91194cc19bbb 56 if (HttpSameStr(pPath, "/trace.js" )) return HttpSameDate(WebTraceScriptDate, WebTraceScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_TRACE_SCRIPT;
andrewboyson 103:91194cc19bbb 57 if (HttpSameStr(pPath, "/clock.js" )) return HttpSameDate(WebClockScriptDate, WebClockScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_CLOCK_SCRIPT;
andrewboyson 103:91194cc19bbb 58 if (HttpSameStr(pPath, "/firmware.js" )) return HttpSameDate(WebFirmwareScriptDate, WebFirmwareScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_FIRMWARE_SCRIPT;
andrewboyson 106:7cff473be687 59 <<<<<<< working copy
andrewboyson 105:43ef124233cd 60
andrewboyson 106:7cff473be687 61 =======
andrewboyson 103:91194cc19bbb 62 #ifdef INCLUDE_1_WIRE
andrewboyson 103:91194cc19bbb 63 if (HttpSameStr(pPath, "/1wire.js" )) return HttpSameDate(WebOneWireScriptDate, WebOneWireScriptTime, pLastModified) ? DO_NOT_MODIFIED : DO_1WIRE_SCRIPT;
andrewboyson 103:91194cc19bbb 64 #endif
andrewboyson 106:7cff473be687 65 >>>>>>> merge rev
andrewboyson 104:40097d08edd5 66 return WebDerivedRequest(pPath, pLastModified);
andrewboyson 103:91194cc19bbb 67 }
andrewboyson 103:91194cc19bbb 68 static void handleQuery(int todo, char* pQuery)
andrewboyson 103:91194cc19bbb 69 {
andrewboyson 103:91194cc19bbb 70 switch (todo)
andrewboyson 103:91194cc19bbb 71 {
andrewboyson 103:91194cc19bbb 72 case DO_LOGIN: WebLoginQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 73 case DO_TRACE_AJAX: WebTraceQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 74 case DO_CLOCK_AJAX: WebClockQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 75 case DO_CLOCK_HTML: WebClockQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 76 case DO_LOG_HTML: WebLogQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 77 case DO_FAULT_HTML: WebFaultQuery (pQuery); return;
andrewboyson 103:91194cc19bbb 78 case DO_FIRMWARE_HTML: WebFirmwareQuery(pQuery); return;
andrewboyson 103:91194cc19bbb 79 case DO_FIRMWARE_AJAX: WebFirmwareQuery(pQuery); return;
andrewboyson 103:91194cc19bbb 80 }
andrewboyson 104:40097d08edd5 81 WebDerivedGet(todo, pQuery);
andrewboyson 103:91194cc19bbb 82 }
andrewboyson 103:91194cc19bbb 83 static bool handlePost(int todo, int contentLength, int contentStart, int size, char* pRequestStream, uint32_t positionInRequestStream)
andrewboyson 103:91194cc19bbb 84 {
andrewboyson 103:91194cc19bbb 85 switch (todo)
andrewboyson 103:91194cc19bbb 86 {
andrewboyson 103:91194cc19bbb 87 case DO_FIRMWARE_AJAX: return WebFirmwarePost(contentLength, contentStart, size, pRequestStream, positionInRequestStream);
andrewboyson 103:91194cc19bbb 88 }
andrewboyson 104:40097d08edd5 89 return WebDerivedPost(todo, contentLength, size, pRequestStream, positionInRequestStream);
andrewboyson 103:91194cc19bbb 90 }
andrewboyson 103:91194cc19bbb 91
andrewboyson 103:91194cc19bbb 92 static void serverRequest(int size, char* pRequestStream, uint32_t positionInRequestStream, int* pToDo, bool* pPostComplete, uint32_t* pDelayUntil)
andrewboyson 103:91194cc19bbb 93 {
andrewboyson 103:91194cc19bbb 94 //Handle request for the first packet of data received but leave todo the same after that.
andrewboyson 103:91194cc19bbb 95 int contentLength = 0;
andrewboyson 103:91194cc19bbb 96 int contentStart = 0;
andrewboyson 103:91194cc19bbb 97 if (size && positionInRequestStream == 0)
andrewboyson 103:91194cc19bbb 98 {
andrewboyson 103:91194cc19bbb 99 //Read the headers
andrewboyson 103:91194cc19bbb 100 char* pMethod;
andrewboyson 103:91194cc19bbb 101 char* pPath;
andrewboyson 103:91194cc19bbb 102 char* pQuery;
andrewboyson 103:91194cc19bbb 103 char* pLastModified;
andrewboyson 103:91194cc19bbb 104 char* pCookies;
andrewboyson 103:91194cc19bbb 105 contentStart = HttpRequestRead(pRequestStream, size, &pMethod, &pPath, &pQuery, &pLastModified, &pCookies, &contentLength);
andrewboyson 103:91194cc19bbb 106
andrewboyson 103:91194cc19bbb 107 //Ask the web server what to do
andrewboyson 103:91194cc19bbb 108 *pToDo = decideWhatToDoFromPath(pPath, pLastModified);
andrewboyson 103:91194cc19bbb 109
andrewboyson 103:91194cc19bbb 110 //If what to do is NOTHING, NOT_FOUND or NOT_MODIFIED then no query or post will be valid so stop now
andrewboyson 103:91194cc19bbb 111 if (*pToDo < DO_SERVER) { *pPostComplete = true; return; }
andrewboyson 103:91194cc19bbb 112
andrewboyson 103:91194cc19bbb 113 //If what to do is LOGIN then the user has just returned the login form
andrewboyson 103:91194cc19bbb 114 if (*pToDo == DO_LOGIN)
andrewboyson 103:91194cc19bbb 115 {
andrewboyson 103:91194cc19bbb 116 handleQuery(*pToDo, pQuery); //Read the password and the original location
andrewboyson 103:91194cc19bbb 117 if (WebLoginQueryPasswordOk)
andrewboyson 103:91194cc19bbb 118 {
andrewboyson 103:91194cc19bbb 119 if (!WebLoginSessionIdIsSet()) //If there isn't a session id already
andrewboyson 103:91194cc19bbb 120 {
andrewboyson 103:91194cc19bbb 121 WebLoginSessionIdNew(); //Create a new session id
andrewboyson 103:91194cc19bbb 122 }
andrewboyson 103:91194cc19bbb 123 *pToDo = WebLoginOriginalToDo; //Load the original todo and SEND_SESSION_ID
andrewboyson 103:91194cc19bbb 124 *pToDo += DO_SEND_SESSION_ID;
andrewboyson 103:91194cc19bbb 125 }
andrewboyson 103:91194cc19bbb 126 *pDelayUntil = MsTimerCount + LOGIN_DELAY_MS; //To prevent brute forcing the hash delay the reply to the login
andrewboyson 103:91194cc19bbb 127 *pPostComplete = true;
andrewboyson 103:91194cc19bbb 128 return; //Either way no query or post will be valid
andrewboyson 103:91194cc19bbb 129 }
andrewboyson 103:91194cc19bbb 130
andrewboyson 103:91194cc19bbb 131 //Have a normal request so authenticate
andrewboyson 103:91194cc19bbb 132 if (!WebLoginCookiesContainValidSessionId(pCookies))
andrewboyson 103:91194cc19bbb 133 {
andrewboyson 103:91194cc19bbb 134 WebLoginOriginalToDo = *pToDo; //Record the original destination for redirection
andrewboyson 103:91194cc19bbb 135 *pToDo = DO_LOGIN;
andrewboyson 103:91194cc19bbb 136 *pPostComplete = true;
andrewboyson 103:91194cc19bbb 137 return; //Ignore any query or post as the user is not authenticated
andrewboyson 103:91194cc19bbb 138 }
andrewboyson 103:91194cc19bbb 139
andrewboyson 103:91194cc19bbb 140 //Handle the query
andrewboyson 103:91194cc19bbb 141 handleQuery(*pToDo, pQuery);
andrewboyson 103:91194cc19bbb 142 }
andrewboyson 103:91194cc19bbb 143
andrewboyson 103:91194cc19bbb 144 //Do the upload of anything that needs it. Todos it doesn't understand are ignored.
andrewboyson 103:91194cc19bbb 145 if (!*pPostComplete) *pPostComplete = handlePost(*pToDo, contentLength, contentStart, size, pRequestStream, positionInRequestStream);
andrewboyson 103:91194cc19bbb 146 }
andrewboyson 103:91194cc19bbb 147
andrewboyson 103:91194cc19bbb 148 static void serverReply(int todo)
andrewboyson 103:91194cc19bbb 149 {
andrewboyson 103:91194cc19bbb 150 //Check if todo includes the need to send a cookie
andrewboyson 103:91194cc19bbb 151 if (todo >= DO_SEND_SESSION_ID)
andrewboyson 103:91194cc19bbb 152 {
andrewboyson 103:91194cc19bbb 153 HttpOkCookieName = WebLoginSessionNameGet();
andrewboyson 103:91194cc19bbb 154 HttpOkCookieValue = WebLoginSessionIdGet();
andrewboyson 103:91194cc19bbb 155 HttpOkCookieMaxAge = WebLoginSessionNameLife();
andrewboyson 103:91194cc19bbb 156 todo -= DO_SEND_SESSION_ID;
andrewboyson 103:91194cc19bbb 157 }
andrewboyson 103:91194cc19bbb 158 else
andrewboyson 103:91194cc19bbb 159 {
andrewboyson 103:91194cc19bbb 160 HttpOkCookieName = NULL;
andrewboyson 103:91194cc19bbb 161 HttpOkCookieValue = NULL;
andrewboyson 103:91194cc19bbb 162 HttpOkCookieMaxAge = -1;
andrewboyson 103:91194cc19bbb 163 }
andrewboyson 103:91194cc19bbb 164
andrewboyson 103:91194cc19bbb 165 //Try all the base modules
andrewboyson 103:91194cc19bbb 166 switch (todo)
andrewboyson 103:91194cc19bbb 167 {
andrewboyson 103:91194cc19bbb 168 case DO_NOT_FOUND: HttpNotFound (); return;
andrewboyson 103:91194cc19bbb 169 case DO_NOT_MODIFIED: HttpNotModified (); return;
andrewboyson 103:91194cc19bbb 170 case DO_LOGIN: WebLoginHtml (); return;
andrewboyson 103:91194cc19bbb 171 case DO_FAVICON: WebFavicon (); return;
andrewboyson 103:91194cc19bbb 172 case DO_BASE_CSS: WebBaseCss (); return;
andrewboyson 103:91194cc19bbb 173 case DO_NAV_CSS: WebNavCss (); return;
andrewboyson 103:91194cc19bbb 174 case DO_TRACE_HTML: WebTraceHtml (); return;
andrewboyson 103:91194cc19bbb 175 case DO_TRACE_AJAX: WebTraceAjax (); return;
andrewboyson 103:91194cc19bbb 176 case DO_TRACE_SCRIPT: WebTraceScript (); return;
andrewboyson 103:91194cc19bbb 177 case DO_CLOCK_HTML: WebClockHtml (); return;
andrewboyson 103:91194cc19bbb 178 case DO_CLOCK_AJAX: WebClockAjax (); return;
andrewboyson 103:91194cc19bbb 179 case DO_CLOCK_SCRIPT: WebClockScript (); return;
andrewboyson 103:91194cc19bbb 180 case DO_NET_HTML: WebNetHtml (); return;
andrewboyson 103:91194cc19bbb 181 case DO_NET4_HTML: WebNet4Html (); return;
andrewboyson 103:91194cc19bbb 182 case DO_NET4_AJAX: WebNet4Ajax (); return;
andrewboyson 103:91194cc19bbb 183 case DO_NET4_SCRIPT: WebNet4Script (); return;
andrewboyson 103:91194cc19bbb 184 case DO_NET6_HTML: WebNet6Html (); return;
andrewboyson 103:91194cc19bbb 185 case DO_NET6_AJAX: WebNet6Ajax (); return;
andrewboyson 103:91194cc19bbb 186 case DO_NET6_SCRIPT: WebNet6Script (); return;
andrewboyson 103:91194cc19bbb 187 case DO_LOG_HTML: WebLogHtml (); return;
andrewboyson 103:91194cc19bbb 188 case DO_FAULT_HTML: WebFaultHtml (); return;
andrewboyson 103:91194cc19bbb 189 case DO_FIRMWARE_HTML: WebFirmwareHtml (); return;
andrewboyson 103:91194cc19bbb 190 case DO_FIRMWARE_AJAX: WebFirmwareAjax (); return;
andrewboyson 103:91194cc19bbb 191 case DO_FIRMWARE_SCRIPT: WebFirmwareScript(); return;
andrewboyson 103:91194cc19bbb 192 }
andrewboyson 103:91194cc19bbb 193
andrewboyson 103:91194cc19bbb 194 //If not called then call the derived (child) module
andrewboyson 104:40097d08edd5 195 WebDerivedReply(todo);
andrewboyson 103:91194cc19bbb 196 }
andrewboyson 103:91194cc19bbb 197
andrewboyson 106:7cff473be687 198 <<<<<<< working copy
andrewboyson 105:43ef124233cd 199 int WebInit()
andrewboyson 106:7cff473be687 200 =======
andrewboyson 104:40097d08edd5 201 int WebBaseInit()
andrewboyson 106:7cff473be687 202 >>>>>>> merge rev
andrewboyson 103:91194cc19bbb 203 {
andrewboyson 103:91194cc19bbb 204 HttpRequestFunction = serverRequest;
andrewboyson 103:91194cc19bbb 205 HttpReplyFunction = serverReply;
andrewboyson 103:91194cc19bbb 206
andrewboyson 103:91194cc19bbb 207 WebLoginInit();
andrewboyson 103:91194cc19bbb 208
andrewboyson 103:91194cc19bbb 209 return 0;
andrewboyson 103:91194cc19bbb 210 }