initial support for nex protocol

This commit is contained in:
tjp 2023-11-14 18:58:06 -07:00
parent a2b05982a2
commit 2cdc569840
4 changed files with 113 additions and 0 deletions

79
nex.go Normal file
View File

@ -0,0 +1,79 @@
package main
import (
"context"
"fmt"
"github.com/go-kit/log/level"
sr "tildegit.org/tjp/sliderule"
"tildegit.org/tjp/sliderule/contrib/cgi"
"tildegit.org/tjp/sliderule/contrib/fs"
"tildegit.org/tjp/sliderule/logging"
"tildegit.org/tjp/sliderule/nex"
)
func buildNexServer(server Server, config *Configuration) (sr.Server, error) {
addr := fmt.Sprintf("%s:%d", server.IP.String(), server.Port)
baselog := BaseLogger(config)
info := level.Info(baselog)
errlog := level.Error(baselog)
if server.TLS != nil {
return nex.NewTLSServer(
context.Background(),
server.Hostnames[0],
"tcp",
addr,
logging.LogRequests(info)(routes(server)),
errlog,
server.TLS,
)
} else {
return nex.NewServer(
context.Background(),
server.Hostnames[0],
"tcp",
addr,
logging.LogRequests(info)(routes(server)),
errlog,
)
}
}
func addNexRoute(router *sr.Router, route RouteDirective) {
switch route.Type {
case "static":
addNexStaticRoute(router, route)
case "cgi":
buildAndAddRoute(router, route, func(route RouteDirective) sr.Handler {
return cgi.NexCGIDirectory(route.FsPath, route.URLPath, route.Modifiers.ExecCmd)
})
}
}
func addNexStaticRoute(router *sr.Router, route RouteDirective) {
buildAndAddRoute(router, route, func(route RouteDirective) sr.Handler {
handlers := []sr.Handler{}
if route.Modifiers.Exec {
handlers = append(handlers, cgi.NexCGIDirectory(route.FsPath, route.URLPath, route.Modifiers.ExecCmd))
}
handlers = append(handlers, fs.NexFileHandler(route.FsPath, route.URLPath))
if route.Modifiers.DirDefault != "" {
handlers = append(
handlers,
fs.NexDirectoryDefault(route.FsPath, route.URLPath, route.Modifiers.DirDefault),
)
}
if route.Modifiers.DirList {
handlers = append(handlers, fs.NexDirectoryListing(route.FsPath, route.URLPath, nil))
}
return sr.FallthroughHandler(handlers...)
})
}

View File

@ -115,6 +115,12 @@ func Parse(input io.ReadCloser) (*Configuration, error) {
return nil, err
}
servers = append(servers, s)
case "nex":
s, err := parseNexServer(line, buf)
if err != nil {
return nil, err
}
servers = append(servers, s)
}
}
@ -241,6 +247,20 @@ func parseSpartanServer(line string, buf *bufio.Reader) (Server, error) {
return server, nil
}
func parseNexServer(line string, buf *bufio.Reader) (Server, error) {
server := Server{Type: "nex"}
if err := parseServerLine(&server, line); err != nil {
return server, err
}
if err := parseServerDirectives(&server, buf); err != nil {
return server, err
}
return server, nil
}
func parseServerDirectives(server *Server, buf *bufio.Reader) error {
for {
line, err := buf.ReadString('\n')
@ -306,6 +326,10 @@ func validateRoute(serverType string, dir *RouteDirective) error {
return errors.New("cgi directives only support the 'extendedgophermap' modifier")
}
if dir.Type == "git" && serverType != "gemini" && serverType != "gopher" && serverType != "spartan" {
return fmt.Errorf("git directive not allowed in %s server", serverType)
}
if serverType == "finger" && (dir.Modifiers.DirDefault != "" || dir.Modifiers.DirList) {
return errors.New("finger servers don't support directory 'with' modifiers")
}
@ -558,6 +582,8 @@ func parseServerLine(server *Server, line string) error {
defaultPort = "1965"
case "spartan":
defaultPort = "300"
case "nex":
defaultPort = "1900"
default:
return errors.New("invalid server")
}

View File

@ -20,6 +20,8 @@ func addRoute(server Server, router *sr.Router, route RouteDirective) {
addGeminiRoute(router, route)
case "spartan":
addSpartanRoute(router, route)
case "nex":
addNexRoute(router, route)
default:
panic("invalid server type '" + server.Type + "'")
}

View File

@ -23,6 +23,12 @@ func buildServers(config *Configuration) ([]sr.Server, error) {
return nil, err
}
result = append(result, srv)
case "nex":
srv, err := buildNexServer(server, config)
if err != nil {
return nil, err
}
result = append(result, srv)
case "gemini":
geminis = append(geminis, server)
case "spartan":