void Webserver::SendJsonResponse(const char* command) { Network *net = reprap.GetNetwork(); RequestState *req = net->GetRequest(NULL); bool keepOpen = false; bool mayKeepOpen; if (numQualKeys == 0) { mayKeepOpen = GetJsonResponse(command, "", "", 0); } else { mayKeepOpen = GetJsonResponse(command, qualifiers[0].key, qualifiers[0].value, qualifiers[1].key - qualifiers[0].value - 1); } if (mayKeepOpen) { // Check that the browser wants to persist the connection too for (size_t i = 0; i < numHeaderKeys; ++i) { if (StringEquals(headers[i].key, "Connection")) { // Comment out the following line to disable persistent connections keepOpen = StringEquals(headers[i].value, "keep-alive"); break; } } } req->Write("HTTP/1.1 200 OK\n"); req->Write("Content-Type: application/json\n"); req->Printf("Content-Length: %u\n", strlen(jsonResponse)); req->Printf("Connection: %s\n\n", keepOpen ? "keep-alive" : "close"); req->Write(jsonResponse); net->SendAndClose(NULL, keepOpen); }
// Start sending a file or a JSON response. void Webserver::SendFile(const char* nameOfFileToSend) { if (StringEquals(nameOfFileToSend, "/")) { nameOfFileToSend = INDEX_PAGE; } FileStore *fileToSend = platform->GetFileStore(platform->GetWebDir(), nameOfFileToSend, false); if (fileToSend == NULL) { nameOfFileToSend = FOUR04_FILE; fileToSend = platform->GetFileStore(platform->GetWebDir(), nameOfFileToSend, false); if (fileToSend == NULL) { RejectMessage("not found", 404); return; } } Network *net = reprap.GetNetwork(); RequestState *req = net->GetRequest(NULL); req->Write("HTTP/1.1 200 OK\n"); const char* contentType; bool zip = false; if (StringEndsWith(nameOfFileToSend, ".png")) { contentType = "image/png"; } else if (StringEndsWith(nameOfFileToSend, ".ico")) { contentType = "image/x-icon"; } else if (StringEndsWith(nameOfFileToSend, ".js")) { contentType = "application/javascript"; } else if (StringEndsWith(nameOfFileToSend, ".css")) { contentType = "text/css"; } else if (StringEndsWith(nameOfFileToSend, ".htm") || StringEndsWith(nameOfFileToSend, ".html")) { contentType = "text/html"; } else if (StringEndsWith(nameOfFileToSend, ".zip")) { contentType = "application/zip"; zip = true; } else { contentType = "application/octet-stream"; } req->Printf("Content-Type: %s\n", contentType); if (zip && fileToSend != NULL) { req->Write("Content-Encoding: gzip\n"); req->Printf("Content-Length: %lu", fileToSend->Length()); } req->Write("Connection: close\n\n"); net->SendAndClose(fileToSend); }