void Webserver::Spin() { //char sw[2]; if(!active) return; if(writing) { // if(inPHPFile) // WritePHPByte(); // else if (WriteBytes()) // if we wrote something { platform->ClassReport("Webserver", longWait); return; } } if(platform->GetNetwork()->Active()) { for(uint8_t i = 0; i < 16 && (platform->GetNetwork()->Status() & (clientConnected | byteAvailable)) == (clientConnected | byteAvailable); ++i) { char c; platform->GetNetwork()->Read(c); //SerialUSB.print(c); if(receivingPost && postFile != NULL) { if(MatchBoundary(c)) { //Serial.println("Got to end of file."); postFile->Close(); SendFile(clientRequest); clientRequest[0] = 0; InitialisePost(); } platform->ClassReport("Webserver", longWait); return; } if (CharFromClient(c)) break; // break if we did more than just store the character } } if (platform->GetNetwork()->Status() & clientLive) { if(needToCloseClient) { if(platform->Time() - clientCloseTime < CLIENT_CLOSE_DELAY) { platform->ClassReport("Webserver", longWait); return; } needToCloseClient = false; platform->GetNetwork()->Close(); } } platform->ClassReport("Webserver", longWait); }
// Deal with input/output from/to the client (if any) void Webserver::Spin() { if (webserverActive) { uint32_t ip; size_t length; uint32_t fragment; const char* request = network->GetRequest(ip, length, fragment); if (request != nullptr) { if (reprap.Debug(moduleWebserver)) { platform->MessageF(HOST_MESSAGE, "Request: %s fragment %u\n", request, fragment); } uint32_t fragNum = fragment & ~lastFragmentFlag; if (fragNum == 0) { HttpSession *session = StartSession(ip); if (session == nullptr) { network->SendReply(ip, 400, "Too many sessions"); } else { // First fragment, so parse the request ResetState(); const char *error = nullptr; bool finished = false; while (!finished && length != 0) { finished = CharFromClient(*request++, error); --length; } if (!finished) { error = "Incomplete command"; } if (error != nullptr) { network->SendReply(ip, 400, error); } else { ProcessFirstFragment(*session, clientMessage, (fragment & lastFragmentFlag) != 0); } } } else { HttpSession *session = FindSession(ip); if (session != nullptr) { ProcessUploadFragment(*session, request, length, fragment); } else { // Discard the message network->DiscardMessage(); platform->MessageF(DEBUG_MESSAGE, "session not found, fragment=%u\n", fragment); } } } } CheckSessions(); platform->ClassReport(longWait); }