error indication via GET arg err=...
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Cgi/template routines for configuring non-wifi settings
|
||||
*/
|
||||
|
||||
#include <esp8266.h>
|
||||
#include "cgi_wifi.h"
|
||||
#include "wifimgr.h"
|
||||
#include "persist.h"
|
||||
|
||||
// strcpy that adds 0 at the end of the buffer. Returns void.
|
||||
#define strncpy_safe(dst, src, n) do { strncpy((char *)(dst), (char *)(src), (n)); (dst)[(n)-1]=0; } while (0)
|
||||
|
||||
/**
|
||||
* Universal CGI endpoint to set WiFi params.
|
||||
* Note that some may cause a (delayed) restart.
|
||||
*/
|
||||
httpd_cgi_state ICACHE_FLASH_ATTR cgiAppCfgSet(HttpdConnData *connData)
|
||||
{
|
||||
static ETSTimer timer;
|
||||
|
||||
char buff[50];
|
||||
|
||||
#define REDIR_BASE_URL "/wifi?err="
|
||||
|
||||
char redir_url_buf[300];
|
||||
char *redir_url = redir_url_buf;
|
||||
redir_url += sprintf(redir_url, REDIR_BASE_URL);
|
||||
// we'll test if anything was printed by looking for \0 in failed_keys_buf
|
||||
|
||||
if (connData->conn == NULL) {
|
||||
//Connection aborted. Clean up.
|
||||
return HTTPD_CGI_DONE;
|
||||
}
|
||||
|
||||
#define GET_ARG(key) (httpdFindArg(connData->getArgs, key, buff, sizeof(buff)) > 0)
|
||||
|
||||
// TODO
|
||||
if (GET_ARG("opmode")) {
|
||||
dbg("Setting WiFi opmode to: %s", buff);
|
||||
int mode = atoi(buff);
|
||||
if (mode > NULL_MODE && mode < MAX_MODE) {
|
||||
wificonf->opmode = (WIFI_MODE) mode;
|
||||
} else {
|
||||
warn("Bad opmode value \"%s\"", buff);
|
||||
redir_url += sprintf(redir_url, "opmode,");
|
||||
}
|
||||
}
|
||||
|
||||
if (redir_url_buf[strlen(REDIR_BASE_URL)] == 0) {
|
||||
// All was OK
|
||||
info("Set WiFi params - success, applying in 1000 ms");
|
||||
|
||||
// Settings are applied only if all was OK
|
||||
//
|
||||
// This is so that options that consist of multiple keys sent together are not applied
|
||||
// only partially if set wrong, which could lead to eg. user losing access and having
|
||||
// to reset to defaults.
|
||||
persist_store();
|
||||
|
||||
// Delayed settings apply, so the response page has a chance to load.
|
||||
// If user connects via the Station IF, they may not even notice the connection reset.
|
||||
os_timer_disarm(&timer);
|
||||
os_timer_setfn(&timer, applyWifiSettingsLaterCb, NULL);
|
||||
os_timer_arm(&timer, 1000, false);
|
||||
|
||||
httpdRedirect(connData, "/wifi");
|
||||
} else {
|
||||
warn("Some WiFi settings did not validate, asking for correction");
|
||||
// Some errors, appended to the URL as ?err=
|
||||
httpdRedirect(connData, redir_url_buf);
|
||||
}
|
||||
return HTTPD_CGI_DONE;
|
||||
}
|
||||
|
||||
|
||||
//Template code for the WLAN page.
|
||||
httpd_cgi_state ICACHE_FLASH_ATTR tplAppCfg(HttpdConnData *connData, char *token, void **arg)
|
||||
{
|
||||
char buff[100];
|
||||
int x;
|
||||
int connectStatus;
|
||||
|
||||
if (token == NULL) {
|
||||
// We're done
|
||||
return HTTPD_CGI_DONE;
|
||||
}
|
||||
|
||||
strcpy(buff, ""); // fallback
|
||||
|
||||
// TODO
|
||||
if (streq(token, "opmode_name")) {
|
||||
strcpy(buff, opmode2str(wificonf->opmode));
|
||||
}
|
||||
|
||||
httpdSend(connData, buff, -1);
|
||||
return HTTPD_CGI_DONE;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef CGIAPPCFG_H
|
||||
#define CGIAPPCFG_H
|
||||
|
||||
#include "httpd.h"
|
||||
|
||||
httpd_cgi_state cgiAppCfgSet(HttpdConnData *connData);
|
||||
httpd_cgi_state tplAppCfg(HttpdConnData *connData, char *token, void **arg);
|
||||
|
||||
#endif
|
||||
+5
-7
@@ -13,17 +13,13 @@ Cgi/template routines for the /wifi url.
|
||||
* File adapted and improved by Ondřej Hruška <ondra@ondrovo.com>
|
||||
*/
|
||||
|
||||
// TODO convert to work with WiFi Manager
|
||||
// TODO make changes write to wificonf and apply when a different CGI is run (/wifi/apply or something)
|
||||
// TODO (connection will trigger this immediately, with some delayto show the connecting page. Then polling cna proceed as usual)
|
||||
|
||||
#include <esp8266.h>
|
||||
#include "cgi_wifi.h"
|
||||
#include "wifimgr.h"
|
||||
#include "persist.h"
|
||||
|
||||
// strcpy that adds 0 at the end of the buffer. Returns void.
|
||||
#define strncpy_safe(dst, src, n) do { strncpy((char *)(dst), (char *)(src), (n)); dst[(n)-1]=0; } while (0)
|
||||
#define strncpy_safe(dst, src, n) do { strncpy((char *)(dst), (char *)(src), (n)); (dst)[(n)-1]=0; } while (0)
|
||||
|
||||
/** WiFi access point data */
|
||||
typedef struct {
|
||||
@@ -419,9 +415,11 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData)
|
||||
|
||||
char buff[50];
|
||||
|
||||
#define REDIR_BASE_URL "/wifi?err="
|
||||
|
||||
char redir_url_buf[300];
|
||||
char *redir_url = redir_url_buf;
|
||||
redir_url += sprintf(redir_url, "/wifi?err=");
|
||||
redir_url += sprintf(redir_url, REDIR_BASE_URL);
|
||||
// we'll test if anything was printed by looking for \0 in failed_keys_buf
|
||||
|
||||
if (connData->conn == NULL) {
|
||||
@@ -707,7 +705,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData)
|
||||
}
|
||||
}
|
||||
|
||||
if (redir_url_buf[10] == 0) {
|
||||
if (redir_url_buf[strlen(REDIR_BASE_URL)] == 0) {
|
||||
// All was OK
|
||||
info("Set WiFi params - success, applying in 1000 ms");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user