]> Sergey Matveev's repositories - tofuproxy.git/blobdiff - rounds/redirectHTML.go
Unify copyright comment format
[tofuproxy.git] / rounds / redirectHTML.go
index e92a4f9bd03f80c9c4e508513fb2bb0bd07f7e56..4f8dec3c437f29de611d7039c1e94067a7efb7ea 100644 (file)
@@ -1,19 +1,18 @@
-/*
-tofuproxy -- HTTP proxy with TLS certificates management
-Copyright (C) 2021 Sergey Matveev <stargrave@stargrave.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, version 3 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
+// tofuproxy -- flexible HTTP/HTTPS proxy, TLS terminator, X.509 TOFU
+//              manager, WARC/geminispace browser
+// Copyright (C) 2021-2024 Sergey Matveev <stargrave@stargrave.org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 package rounds
 
@@ -43,8 +42,14 @@ var imageExts = map[string]struct{}{
        ".webp": {},
 }
 
-func isNewsboat(req *http.Request) bool {
-       return strings.Contains(req.Header.Get("User-Agent"), "newsboat/")
+func isFeeder(req *http.Request) bool {
+       if strings.Contains(req.Header.Get("User-Agent"), "newsboat/") {
+               return true
+       }
+       if strings.Contains(req.Header.Get("User-Agent"), "stargrave.org-feeder/") {
+               return true
+       }
+       return false
 }
 
 func RoundRedirectHTML(
@@ -61,7 +66,7 @@ func RoundRedirectHTML(
        case http.StatusMovedPermanently, http.StatusPermanentRedirect:
                redirType = "permanent"
        case http.StatusFound, http.StatusSeeOther, http.StatusTemporaryRedirect:
-               if isNewsboat(req) {
+               if isFeeder(req) {
                        return true, nil
                }
                if _, ok := imageExts[filepath.Ext(req.URL.Path)]; ok {
@@ -75,15 +80,15 @@ func RoundRedirectHTML(
        w.Header().Add("Content-Type", "text/html")
        w.WriteHeader(http.StatusOK)
        location := resp.Header.Get("Location")
-       w.Write([]byte(
-               fmt.Sprintf(
-                       `<html><head><title>%d %s: %s redirection</title></head>
-<body>Redirection to <a href="%s">%s</a></body></html>`,
-                       resp.StatusCode, http.StatusText(resp.StatusCode),
-                       redirType, location, location,
-               )))
-       fifos.SinkRedir <- fmt.Sprintf(
-               "%s %s\t%s\t%s", req.Method, resp.Status, req.URL.String(), location,
+       fmt.Fprintf(
+               w, `<!DOCTYPE html>
+<html><head><title>%d %s: %s redirection</title></head>
+<body><a href="%s">%s</a></body></html>`,
+               resp.StatusCode, http.StatusText(resp.StatusCode),
+               redirType, location, location,
+       )
+       fifos.LogRedir <- fmt.Sprintf(
+               "%s %s\t%s\t%s", req.Method, req.URL, resp.Status, location,
        )
        return false, nil
 }