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  }