Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add url redirect #8970

Merged
merged 16 commits into from
Mar 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ void handleRoot() {
boolean captivePortal() {
if (!isIp(server.hostHeader()) && server.hostHeader() != (String(myHostname) + ".local")) {
Serial.println("Request redirected to captive portal");
server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true);
server.send(302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
server.client().stop(); // Stop is needed because we sent no content length
server.redirect(String("http://") + toStringIp(server.client().localIP()));
return true;
}
return false;
Expand Down Expand Up @@ -91,12 +89,7 @@ void handleWifiSave() {
Serial.println("wifi save");
server.arg("n").toCharArray(ssid, sizeof(ssid) - 1);
server.arg("p").toCharArray(password, sizeof(password) - 1);
server.sendHeader("Location", "wifi", true);
server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
server.sendHeader("Pragma", "no-cache");
server.sendHeader("Expires", "-1");
server.send(302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
server.client().stop(); // Stop is needed because we sent no content length
server.redirect("wifi");
saveCredentials();
connect = strlen(ssid) > 0; // Request WLAN connect with new credentials if there is a SSID
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,11 @@ void sendPortalRedirect(String path, String targetName) {
If the "Location" header element works the HTML stuff is never seen.
*/
// https://tools.ietf.org/html/rfc7231#section-6.4.3
server.sendHeader("Location", path, true);
addNoCacheHeader();
String reply = FPSTR(portalRedirectHTML);
reply.reserve(reply.length() + 2 * path.length() + 80);
reply.replace("{t}", targetName);
reply.replace("{1}", path);
server.send(302, "text/html", reply);
server.redirect(path, reply);
}

#endif // LWIP_FEATURES && !LWIP_IPV6
3 changes: 1 addition & 2 deletions libraries/ESP8266WebServer/examples/WebServer/WebServer.ino
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ void handleRedirect() {

if (!LittleFS.exists(url)) { url = "/$update.htm"; }

server.sendHeader("Location", url, true);
server.send(302);
server.redirect(url);
} // handleRedirect()


Expand Down
24 changes: 24 additions & 0 deletions libraries/ESP8266WebServer/src/ESP8266WebServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,30 @@ class ESP8266WebServerTemplate
sendContent(emptyString);
}

/**
* @brief Redirect to another URL, e.g.
* webserver.on("/index.html", HTTP_GET, []() { webserver.redirect("/"); });
* There are 3 points of redirection here:
* 1) "Location" element in the header
* 2) Disable client caching
* 3) HTML "content" element to redirect
* If the "Location" header element works the HTML content is never seen.
* https://tools.ietf.org/html/rfc7231#section-6.4.3
* @param url URL to redirect to
* @param content Optional redirect content
*/
void redirect(const String& url, const String& content = emptyString) {
sendHeader(F("Location"), url, true);
sendHeader(F("Cache-Control"), F("no-cache, no-store, must-revalidate"));
sendHeader(F("Pragma"), F("no-cache"));
sendHeader(F("Expires"), F("-1"));
send(302, F("text/html"), content); // send 302: "Found"
if (content.isEmpty()) {
// Empty content inhibits Content-length header so we have to close the socket ourselves.
client().stop(); // Stop is needed because we sent no content length
}
}

// Whether other requests should be accepted from the client on the
// same socket after a response is sent.
// This will automatically configure the "Connection" header of the response.
Expand Down