From b384105d861a5aa1fd5e6338b36993b06e8cbbda Mon Sep 17 00:00:00 2001 From: Solderpunk Date: Fri, 5 Jun 2020 20:13:48 +0200 Subject: [PATCH] Factor out request reading code. --- handler.go | 56 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/handler.go b/handler.go index 92533d5..cc59b1f 100644 --- a/handler.go +++ b/handler.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "crypto/tls" "crypto/x509" + "errors" "encoding/hex" "fmt" "io/ioutil" @@ -33,15 +34,8 @@ func handleGeminiRequest(conn net.Conn, config Config, logEntries chan LogEntry) defer func() { logEntries <- log }() // Read request - reader := bufio.NewReaderSize(conn, 1024) - request, overflow, err := reader.ReadLine() - if overflow { - conn.Write([]byte("59 Request too long!\r\n")) - log.Status = 59 - return - } else if err != nil { - conn.Write([]byte("40 Unknown error reading request!\r\n")) - log.Status = 40 + URL, err := readRequest(conn, log) + if err != nil { return } @@ -62,20 +56,6 @@ func handleGeminiRequest(conn net.Conn, config Config, logEntries chan LogEntry) } } - // Parse request as URL - URL, err := url.Parse(string(request)) - if err != nil { - conn.Write([]byte("59 Error parsing URL!\r\n")) - log.Status = 59 - return - } - 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")) @@ -171,6 +151,36 @@ func handleGeminiRequest(conn net.Conn, config Config, logEntries chan LogEntry) } +func readRequest(conn net.Conn, log LogEntry) (*url.URL, error) { + reader := bufio.NewReaderSize(conn, 1024) + request, overflow, err := reader.ReadLine() + if overflow { + conn.Write([]byte("59 Request too long!\r\n")) + log.Status = 59 + return nil, errors.New("Request too long") + } else if err != nil { + conn.Write([]byte("40 Unknown error reading request!\r\n")) + log.Status = 40 + return nil, errors.New("Error reading request") + } + + // Parse request as URL + URL, err := url.Parse(string(request)) + if err != nil { + conn.Write([]byte("59 Error parsing URL!\r\n")) + log.Status = 59 + return nil, errors.New("Bad URL in request") + } + log.RequestURL = URL.String() + + // Set implicit scheme + if URL.Scheme == "" { + URL.Scheme = "gemini" + } + + return URL, nil +} + func resolvePath(path string, config Config) (string, os.FileInfo, error) { // Handle tildes if strings.HasPrefix(path, "/~") {