Skip to content

Commit

Permalink
Add url redirect (#8970)
Browse files Browse the repository at this point in the history
* added getAvailableVersion(), moved _httpClientTimeout and _followRedirects to protected, added enum HTTPUpdateError

* auto numbering of HTTPUpdateError enum

* added getAvailableVersion(), debug output current current Sketch MD5

* Revert "added getAvailableVersion(), debug output current current Sketch MD5"

This reverts commit 60d2c77.

* Revert "auto numbering of HTTPUpdateError enum"

This reverts commit 61785b2.

* Revert "added getAvailableVersion(), moved _httpClientTimeout and _followRedirects to protected, added enum HTTPUpdateError"

This reverts commit cec84ed.

* add redirect function

* enhanced redirect() by cache control and client stop

* updated redirect() comment

* replaced redirect() API calls in examples

* server.client().stop() not needed, redirect() does this
  • Loading branch information
hmueller01 authored Mar 24, 2024
1 parent 2bb1b5a commit 877d440
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 14 deletions.
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

0 comments on commit 877d440

Please sign in to comment.