static boolean index_handler(TinyWebServer& web_server) { D(Serial.println("GET index.html")); web_server.send_error_code(200); web_server.send_content_type("text/html"); web_server.end_headers(); Client& client = web_server.get_client(); main_page(client); return true; }
void handle_request(OptsMap const &config, Database &database, Session &session, Request &request, std::ostream &fcout, std::istream &fcin) { (void)session; std::string query = request.query(); try { switch (request.type()) { case RequestType::Get: header(fcout, config, "Webservice API"); menu(fcout); fcout << "<div class=\"content\">"; if (query == "main") main_page(database, request, fcout); else if (query == "users") users_page(database, config, fcout); else if (query == "newuser") newuser_page(database, request, fcout, fcin); else if (query == "edituser") edituser_page(database, request, fcout, fcin); else if (query == "webserviceapi") static_page("webserviceapi.html", config, fcout); else if (query == "changelog") static_page("changelog.html", config, fcout); else { // TODO: handle 404 better fcout << "Error: 404"; } fcout << "</div>"; footer(fcout); break; case RequestType::Post: if (query == "newuser") newuser_page(database, request, fcout, fcin); else { // TODO: 404 } break; default: // TODO break; } } catch (std::exception const &error) { LOG_MESSAGE_WARN("Webadmin unknown error: %s", error.what()); } catch (...) { LOG_MESSAGE_WARN("Webadmin mysterious unknown error. This should never happen!"); } }
static boolean config_handler(TinyWebServer& web_server) { web_server.send_error_code(200); web_server.end_headers(); const char* length_str = web_server.get_header_value("Content-Length"); int length = atoi(length_str); uint32_t start_time = millis(); StringParse buf; EthernetClient client = web_server.get_client(); while (buf.length() < length && client.connected() && (millis() - start_time < 30000)) { if (!client.available()) continue; buf += client.readString(); } ParseConfig(buf); IP_Config.SaveConfig(); main_page(client, F("<font color='green'>IP Config saved</font>")); return true; }
static void file_uploader_handler(TinyWebServer& web_server, TinyWebPutHandler::PutAction action, char* buffer, int size) { static char *boundary = NULL; static size_t boundary_len = 0; static CircularBuffer<char, 128> cb; static enum state { search_begin=0, search_data, in_data} st; static int file_size = 0; static char *fname; switch (action) { case TinyWebPutHandler::START: { fname = web_server.get_file_from_path(web_server.get_path()); const char *ct = web_server.get_header_value("Content-Type"); if (!ct) break; boundary = strstr(ct, "boundary="); if (!boundary) break; boundary += 5; boundary[0] = '\r'; boundary[1] = '\n'; boundary[2] = '-'; boundary[3] = '-'; boundary_len = strlen(boundary); D(Serial.print("**** Upload file ")); D(Serial.println(fname)); free(fname); st = search_begin; file_size = 0; break; } case TinyWebPutHandler::WRITE: for (int i = 0; i < size; i++) { D(Serial.write(*buffer)); cb.push(*buffer++); switch(st) { case search_begin: if (cb.remain() < boundary_len-2) break; if (cb.match(boundary+2, boundary_len-2)) { st = search_data; D(Serial.println("search_data")); cb.flush(); } else { cb.pop(); } break; case search_data: if (cb.remain() < 4) break; if (cb.match("\r\n\r\n", 4)) { st = in_data; D(Serial.println("in_data")); cb.flush(); } else { cb.pop(); } break; case in_data: if (cb.remain() < boundary_len) break; if (cb.match(boundary, boundary_len)) { st = search_data; D(Serial.println("search_data")); cb.flush(); } else { if (file_size == 0) lduino.ClearProgram(); char c = cb.pop(); file_size++; lduino.LoadProgramLine(c); } break; }; } break; case TinyWebPutHandler::END: D(Serial.println("**** END")); D(Serial.print("file size ")); D(Serial.println(file_size)); Client& client = web_server.get_client(); String status; if (file_size > 0 && lduino.getProgramReady()) { status += F("<font color='green'>New ladder program uploaded - file size: "); status += file_size; status += F(" bytes</font>"); } else { status += F("<font color='red'>Upload aborted</font>"); } main_page(client, status); break; } }