WIP: Add UNIX socket support.

This commit is contained in:
luk3yx 2020-06-15 17:44:51 +12:00
parent a093f741df
commit a29e6f1cd6
3 changed files with 46 additions and 8 deletions

View File

@ -5,9 +5,13 @@
name: Test name: Test
# The address and port to bind on. # The address and port to bind on.
# address: "[::]" address: "[::]"
port: 5000 port: 5000
# Alternatively, lurkcoin can bind on a UNIX domain socket.
# network_protocol: unix
# address: "/tmp/lurkcoin.sock"
# TLS (optional). # TLS (optional).
tls: tls:
enable: false enable: false

View File

@ -25,6 +25,7 @@ import (
"log" "log"
"lurkcoin" "lurkcoin"
"lurkcoin/databases" "lurkcoin/databases"
"net"
"net/http" "net/http"
"os" "os"
"strings" "strings"
@ -35,6 +36,10 @@ type Config struct {
// the default server name for the v2 API. // the default server name for the v2 API.
Name string `yaml:"name"` Name string `yaml:"name"`
// The network protocol to use when binding to the socket. Defaults to
// "tcp", can be set to "unix" for example.
NetworkProtocol string `yaml:"network_protocol"`
// The address to bind to (optional) and port. // The address to bind to (optional) and port.
Address string `yaml:"address"` Address string `yaml:"address"`
Port uint16 `yaml:"port"` Port uint16 `yaml:"port"`
@ -115,17 +120,45 @@ func StartServer(config *Config) {
router := MakeHTTPRouter(db, config) router := MakeHTTPRouter(db, config)
address := fmt.Sprintf("%s:%d", config.Address, config.Port)
urlAddress := address var address, networkProtocol, urlAddress string
if config.Address == "" { switch config.NetworkProtocol {
urlAddress = "[::]" + urlAddress case "", "tcp":
if config.Port == 0 {
address = config.Address
} else {
address = fmt.Sprintf("%s:%d", address, config.Port)
}
networkProtocol = "tcp"
urlAddress = address
if address != "" && address[0] == ':' {
urlAddress = "[::]" + urlAddress
}
case "unix":
address = config.Address
networkProtocol = "unix"
urlAddress = "unix:" + address + ":"
if config.Port != 0 {
log.Fatal("The port option is invalid with UNIX sockets.")
}
default:
log.Fatalf("Unrecognised network protocol: %q", config.NetworkProtocol)
} }
if config.TLS.Enable { if config.TLS.Enable {
log.Printf("Starting server on https://%s/", urlAddress) log.Printf("Starting server on https://%s/", urlAddress)
} else { } else {
log.Printf("Starting server on http://%s/", urlAddress) log.Printf("Starting server on http://%s/", urlAddress)
} }
// Bind to the address
var ln net.Listener
ln, err = net.Listen(networkProtocol, address)
if err != nil {
log.Fatal(err)
}
// Switch to the logfile
if config.Logfile != "" { if config.Logfile != "" {
f, err := os.OpenFile( f, err := os.OpenFile(
config.Logfile, config.Logfile,
@ -151,10 +184,11 @@ func StartServer(config *Config) {
server.SetKeepAlivesEnabled(false) server.SetKeepAlivesEnabled(false)
} }
// Serve the webpage
if config.TLS.Enable { if config.TLS.Enable {
err = server.ListenAndServeTLS(config.TLS.CertFile, config.TLS.KeyFile) err = server.ServeTLS(ln, config.TLS.CertFile, config.TLS.KeyFile)
} else { } else {
err = server.ListenAndServe() err = server.Serve(ln)
} }
log.Fatal(err) log.Fatal(err)

View File

@ -35,7 +35,7 @@ import (
) )
const SYMBOL = "¤" const SYMBOL = "¤"
const VERSION = "3.0.0" const VERSION = "3.0.1 alpha"
// Note that public source code is required by the AGPL // Note that public source code is required by the AGPL
const SOURCE_URL = "https://github.com/luk3yx/lurkcoin-core" const SOURCE_URL = "https://github.com/luk3yx/lurkcoin-core"