molly-brown/handler.go

60 lines
1.2 KiB
Go
Raw Normal View History

2019-11-06 15:08:44 +00:00
package main
import (
"bufio"
"fmt"
"net"
"net/url"
2019-11-06 16:38:41 +00:00
"time"
2019-11-06 15:08:44 +00:00
)
2019-11-06 16:38:41 +00:00
func handleGeminiRequest(conn net.Conn, config Config, logEntries chan LogEntry) {
2019-11-06 15:08:44 +00:00
defer conn.Close()
2019-11-06 16:38:41 +00:00
var log LogEntry
log.Time = time.Now()
log.RemoteAddr = conn.RemoteAddr()
log.RequestURL = "-"
log.Status = 0
2019-11-06 16:50:44 +00:00
defer func() { logEntries <- log }()
2019-11-06 16:38:41 +00:00
2019-11-06 15:08:44 +00:00
// Read request
reader := bufio.NewReaderSize(conn, 1024)
request, overflow, err := reader.ReadLine()
if overflow {
conn.Write([]byte("59 Request too long!r\n"))
2019-11-06 16:38:41 +00:00
log.Status = 59
2019-11-06 15:08:44 +00:00
return
} else if err != nil {
conn.Write([]byte("40 Unknown error reading request!r\n"))
2019-11-06 16:38:41 +00:00
log.Status = 40
2019-11-06 15:08:44 +00:00
return
}
// Parse request as URL
URL, err := url.Parse(string(request))
if err != nil {
conn.Write([]byte("59 Error parsing URL!r\n"))
2019-11-06 16:38:41 +00:00
log.Status = 59
2019-11-06 15:08:44 +00:00
return
}
2019-11-06 16:38:41 +00:00
log.RequestURL = URL.String()
// Set implicit scheme
if URL.Scheme == "" {
URL.Scheme = "gemini"
}
// Reject non-gemini schemes
if URL.Scheme != "gemini" {
conn.Write([]byte("53 No proxying to non-Gemini content!\r\n"))
log.Status = 53
return
}
2019-11-06 15:08:44 +00:00
// Generic response
conn.Write([]byte("20 text/gemini\r\n"))
body := fmt.Sprintf("Molly at %s says \"Hi!\" from %s.\n", URL.Host, URL.Path)
conn.Write([]byte(body))
2019-11-06 16:38:41 +00:00
log.Status = 20
2019-11-06 15:08:44 +00:00
}