/* Some random cgi routines. Used in the LED example and the page that returns the entire flash as a binary. Also handles the hit counter on the main page. */ /* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * Jeroen Domburg wrote this file. As long as you retain * this notice you can do whatever you want with this stuff. If we meet some day, * and you think this stuff is worth it, you can buy me a beer in return. * ---------------------------------------------------------------------------- */ #include #include "cgi.h" #include "uptime.h" //Template code for the counter on the index page. int ICACHE_FLASH_ATTR tplHome(HttpdConnData *connData, char *token, void **arg) { struct station_config stconf; char buff[128]; u8 mac[6]; // empty string if no token matches buff[0] = 0; if (token == NULL) return HTTPD_CGI_DONE; if (strcmp(token, "uptime") == 0) { // Uptime uptime_str(buff); } else if (strcmp(token, "heap") == 0) { // Free heap sprintf(buff, "%u", system_get_free_heap_size()); } else if (strcmp(token, "wifiMode") == 0) { // WiFi mode switch (wifi_get_opmode()) { case STATION_MODE: strcpy(buff, "Client"); break; case SOFTAP_MODE: strcpy(buff, "SoftAP"); break; case STATIONAP_MODE: strcpy(buff, "STA+AP"); break; default: strcpy(buff, "Unknown"); } } else if (strcmp(token, "staSSID") == 0) { // Station SSID (if in station mode) int opmode = wifi_get_opmode(); if (opmode != STATION_MODE && opmode != STATIONAP_MODE) { strcpy(buff, "N/A"); // no SSID in AP-only mode } else { wifi_station_get_config(&stconf); strcpy(buff, (char*)stconf.ssid); } } else if (strcmp(token, "staRSSI") == 0) { // Signal strength if in Station mode int rssi = wifi_station_get_rssi(); sprintf(buff, "%d", rssi); } else if (strcmp(token, "staMAC") == 0) { // Station MAC addr wifi_get_macaddr(STATION_IF, mac); sprintf(buff, MACSTR, MAC2STR(mac)); } else if (strcmp(token, "apMAC") == 0) { // SoftAP MAC addr wifi_get_macaddr(SOFTAP_IF, mac); sprintf(buff, MACSTR, MAC2STR(mac)); } else if (strcmp(token, "chipID") == 0) { // Chip serial number sprintf(buff, "%08x", system_get_chip_id()); } httpdSend(connData, buff, -1); return HTTPD_CGI_DONE; } // ---- typedef struct { uint32_t count_remain; } RandomNumberState; //Template code for the counter on the index page. int ICACHE_FLASH_ATTR tplMultipart(HttpdConnData *connData, char *token, void **arg) { if (token == NULL) { if (*arg != NULL) { free(*arg); *arg = NULL; // mark as already freed } return HTTPD_CGI_DONE; // cleanup } if (os_strcmp(token, "numbers") == 0) { RandomNumberState *rns = *arg; char buff[20]; if (rns == NULL) { //First call to this cgi. Open the file so we can read it. rns=(RandomNumberState *)malloc(sizeof(RandomNumberState)); *arg=rns; // parse count uint32_t count = 1; int len = httpdFindArg(connData->getArgs, "count", buff, sizeof(buff)); if (len==-1) { // no such get arg } else { count = (uint32_t)atoi(buff); } rns->count_remain = count; info("User wants %d numbers.", count); } for (int i = 0; i < 100; i++) { os_sprintf(buff, "
  • %lu\n", os_random()); httpdSend(connData, buff, -1); if (--rns->count_remain == 0) { break; } } if (rns->count_remain == 0) { free(rns); *arg = NULL; // mark as already freed return HTTPD_CGI_DONE; } return HTTPD_CGI_MORE; } return HTTPD_CGI_DONE; } /* // better to put it in the fs... int FLASH_FN cgiRandomNumbers(HttpdConnData *connData) { RandomNumberState *rns=connData->cgiData; char buff[128]; if (connData->conn == NULL) { //Connection aborted. Clean up. if (rns != NULL) free(rns); return HTTPD_CGI_DONE; } if (rns == NULL) { //First call to this cgi. Open the file so we can read it. rns=(RandomNumberState *)malloc(sizeof(RandomNumberState)); connData->cgiData=rns; // parse count uint32_t count = 1; int len = httpdFindArg(connData->getArgs, "count", buff, sizeof(buff)); if (len==-1) { // no such get arg } else { count = (uint32_t)atoi(buff); } rns->count_remain = count; printf("User wants %d numbers.", count); httpdStartResponse(connData, 200); httpdHeader(connData, "Content-Type", "text/html"); httpdEndHeaders(connData); // start the page httpdSend(connData, "" "" "" " Generated page." " " "" "" "
    " "

    Random numbers:

    " "
      ", -1); return HTTPD_CGI_MORE; } // send end of the page if (rns->count_remain == 0) { httpdSend(connData, "
    ", -1); free(rns); return HTTPD_CGI_DONE; } // print chunk of data for (int i = 0; i < 100; i++) { os_sprintf(buff, "
  • %lu\n", os_random()); httpdSend(connData, buff, -1); if (--rns->count_remain == 0) { break; } } return HTTPD_CGI_MORE; } */