You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package gemini
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/tls"
|
|
"gophi/core"
|
|
"io"
|
|
|
|
"github.com/grufwub/go-config"
|
|
"github.com/grufwub/go-logger"
|
|
)
|
|
|
|
func init() {
|
|
// As part of init perform initial entropy assertion
|
|
b := make([]byte, 1)
|
|
_, err := io.ReadFull(rand.Reader, b)
|
|
if err != nil {
|
|
logger.Fatal("Failed to assert safe source of system entropy exists!")
|
|
}
|
|
}
|
|
|
|
// Run does as says :)
|
|
func Run() {
|
|
// Create new TOML config parser
|
|
tree := make(config.Tree)
|
|
|
|
// Parse gemini specific flags, then all
|
|
certFile := tree.String("gemini.tls-cert", "")
|
|
keyFile := tree.String("gemini.tls-key", "")
|
|
core.ParseConfigAndSetup(
|
|
tree,
|
|
"gemini",
|
|
1965,
|
|
func() (*core.Listener, error) {
|
|
// Load the supplied key pair
|
|
cert, err := tls.LoadX509KeyPair(*certFile, *keyFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Create TLS config
|
|
config := &tls.Config{
|
|
Certificates: []tls.Certificate{cert},
|
|
}
|
|
config.Rand = rand.Reader
|
|
|
|
// Create listener!
|
|
l, err := tls.Listen("tcp", core.Bind+":"+core.Port, config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Return wrapper listener
|
|
return core.NewListener(l), nil
|
|
},
|
|
newFileContent,
|
|
handleDirectory,
|
|
handleLargeFile,
|
|
appendCgiEnv,
|
|
)
|
|
|
|
// Generate the root redirect byte slice
|
|
// (has to be done here once the Hostname and Port have been set)
|
|
rootRedirect = buildRedirect("gemini://" + core.Hostname + ":" + core.Port + "/")
|
|
|
|
// Start!
|
|
core.Start(serve)
|
|
}
|