Created
November 25, 2015 05:34
-
-
Save hackintoshrao/0adf99e5589518383eb3 to your computer and use it in GitHub Desktop.
redirect.go with the global HTML string inside the middleware
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Package redirect is middleware for redirecting certain requests | |
// to other locations. | |
package redirect | |
import ( | |
"fmt" | |
"html" | |
"net/http" | |
"github.com/mholt/caddy/middleware" | |
) | |
// Redirect is middleware to respond with HTTP redirects | |
type Redirect struct { | |
Next middleware.Handler | |
Rules []Rule | |
} | |
// ServeHTTP implements the middleware.Handler interface. | |
func (rd Redirect) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { | |
const metaRedir = `<!DOCTYPE html> | |
<html> | |
<head> | |
<script>window.location.replace("%s");</script> | |
<meta http-equiv="refresh" content="0; URL='%s'"> | |
</head> | |
<body>Redirecting...</body> | |
</html>` | |
for _, rule := range rd.Rules { | |
if (rule.FromPath == "/" || r.URL.Path == rule.FromPath) && schemeMatches(rule, r) { | |
to := middleware.NewReplacer(r, nil, "").Replace(rule.To) | |
if rule.Meta { | |
safeTo := html.EscapeString(to) | |
fmt.Fprintf(w, metaRedir, safeTo, safeTo) | |
} else { | |
http.Redirect(w, r, to, rule.Code) | |
} | |
return 0, nil | |
} | |
} | |
return rd.Next.ServeHTTP(w, r) | |
} | |
func schemeMatches(rule Rule, req *http.Request) bool { | |
return (rule.FromScheme == "https" && req.TLS != nil) || | |
(rule.FromScheme != "https" && req.TLS == nil) | |
} | |
// Rule describes an HTTP redirect rule. | |
type Rule struct { | |
FromScheme, FromPath, To string | |
Code int | |
Meta bool | |
} | |
// Script tag comes first since that will better imitate a redirect in the browser's | |
// history, but the meta tag is a fallback for most non-JS clients. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment