forked from solderpunk/molly-brown
Add basic logging.
This commit is contained in:
parent
0ddf8ca2ae
commit
7566636c97
19
handler.go
19
handler.go
|
@ -5,19 +5,30 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleGeminiRequest(conn net.Conn, config Config) {
|
func handleGeminiRequest(conn net.Conn, config Config, logEntries chan LogEntry) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
|
var log LogEntry
|
||||||
|
log.Time = time.Now()
|
||||||
|
log.RemoteAddr = conn.RemoteAddr()
|
||||||
|
log.RequestURL = "-"
|
||||||
|
log.Status = 0
|
||||||
|
|
||||||
// Read request
|
// Read request
|
||||||
reader := bufio.NewReaderSize(conn, 1024)
|
reader := bufio.NewReaderSize(conn, 1024)
|
||||||
request, overflow, err := reader.ReadLine()
|
request, overflow, err := reader.ReadLine()
|
||||||
if overflow {
|
if overflow {
|
||||||
conn.Write([]byte("59 Request too long!r\n"))
|
conn.Write([]byte("59 Request too long!r\n"))
|
||||||
|
log.Status = 59
|
||||||
|
logEntries <- log
|
||||||
return
|
return
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
conn.Write([]byte("40 Unknown error reading request!r\n"))
|
conn.Write([]byte("40 Unknown error reading request!r\n"))
|
||||||
|
log.Status = 40
|
||||||
|
logEntries <- log
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,11 +36,15 @@ func handleGeminiRequest(conn net.Conn, config Config) {
|
||||||
URL, err := url.Parse(string(request))
|
URL, err := url.Parse(string(request))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
conn.Write([]byte("59 Error parsing URL!r\n"))
|
conn.Write([]byte("59 Error parsing URL!r\n"))
|
||||||
|
log.Status = 59
|
||||||
|
logEntries <- log
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.RequestURL = URL.String()
|
||||||
// Generic response
|
// Generic response
|
||||||
conn.Write([]byte("20 text/gemini\r\n"))
|
conn.Write([]byte("20 text/gemini\r\n"))
|
||||||
body := fmt.Sprintf("Molly at %s says \"Hi!\" from %s.\n", URL.Host, URL.Path)
|
body := fmt.Sprintf("Molly at %s says \"Hi!\" from %s.\n", URL.Host, URL.Path)
|
||||||
conn.Write([]byte(body))
|
conn.Write([]byte(body))
|
||||||
|
log.Status = 20
|
||||||
|
logEntries <- log
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LogEntry struct {
|
||||||
|
Time time.Time
|
||||||
|
RemoteAddr net.Addr
|
||||||
|
RequestURL string
|
||||||
|
Status int
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeLogEntry(fp *os.File, entry LogEntry) {
|
||||||
|
var line string
|
||||||
|
line = "[" + entry.Time.Format(time.UnixDate)+ "]"
|
||||||
|
line += "\t" + strconv.Itoa(entry.Status)
|
||||||
|
line += "\t" + entry.RemoteAddr.String()
|
||||||
|
line += "\t" + entry.RequestURL
|
||||||
|
line += "\n"
|
||||||
|
fp.WriteString(line)
|
||||||
|
}
|
19
main.go
19
main.go
|
@ -26,6 +26,14 @@ func main() {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open logfile
|
||||||
|
logfile, err := os.OpenFile(config.LogPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error opening log file " + config.LogPath + ".")
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
defer logfile.Close()
|
||||||
|
|
||||||
// Read TLS files, create TLS config
|
// Read TLS files, create TLS config
|
||||||
cert, err := tls.LoadX509KeyPair(config.CertPath, config.KeyPath)
|
cert, err := tls.LoadX509KeyPair(config.CertPath, config.KeyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -44,13 +52,22 @@ func main() {
|
||||||
}
|
}
|
||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
|
|
||||||
|
// Start log handling routine
|
||||||
|
logEntries := make(chan LogEntry, 10)
|
||||||
|
go func () {
|
||||||
|
for {
|
||||||
|
entry := <- logEntries
|
||||||
|
writeLogEntry(logfile, entry)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Infinite serve loop
|
// Infinite serve loop
|
||||||
for {
|
for {
|
||||||
conn, err := listener.Accept()
|
conn, err := listener.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
go handleGeminiRequest(conn, config)
|
go handleGeminiRequest(conn, config, logEntries)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue