go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/cmd/echo-srv/main.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package main 9 10 import ( 11 "bytes" 12 "fmt" 13 "io" 14 "log" 15 "net/http" 16 "os" 17 "strings" 18 "time" 19 ) 20 21 func port() string { 22 if value := os.Getenv("PORT"); value != "" { 23 return value 24 } 25 return "8080" 26 } 27 28 func main() { 29 log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile) 30 log.Printf("Listening on :%s", port()) 31 http.ListenAndServe(":"+port(), http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { 32 finish := logged(req) 33 defer finish() 34 if req.Body != nil { 35 body, _ := io.ReadAll(req.Body) 36 log.Println(bytes.NewBuffer(body).String()) 37 } 38 rw.WriteHeader(http.StatusNoContent) 39 })) 40 } 41 42 func logged(req *http.Request) func() { 43 start := time.Now() 44 logTokens := []string{ 45 fmt.Sprintf("verb=%s", req.Method), 46 fmt.Sprintf("path=%s", req.URL.String()), 47 fmt.Sprintf("userAgent=%s", req.UserAgent()), 48 } 49 if req.URL.User != nil { 50 logTokens = append(logTokens, fmt.Sprintf("user=%s", req.URL.User.Username())) 51 } 52 log.Printf("request-start %s", strings.Join(logTokens, " ")) 53 return func() { 54 logTokens = append(logTokens, fmt.Sprintf("elapsed=%v", time.Since(start).Round(time.Microsecond))) 55 log.Printf("request-end %s", strings.Join(logTokens, " ")) 56 } 57 }