summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorheqnx <root@heqnx.com>2025-08-06 12:22:31 +0300
committerheqnx <root@heqnx.com>2025-08-06 12:22:31 +0300
commit2fc27e5b3b802dcc77a0299f99b97056712c92e3 (patch)
tree4c0d6f6ca74ab9f7eb9b2600ed1696dfd88e47d8 /main.go
parent910fb7f2078e5e0a576dbb465bc7b3eb61bd474c (diff)
downloadgo-http-logger-2fc27e5b3b802dcc77a0299f99b97056712c92e3.tar.gz
go-http-logger-2fc27e5b3b802dcc77a0299f99b97056712c92e3.zip
initial commit
Diffstat (limited to 'main.go')
-rw-r--r--main.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..dc85d1d
--- /dev/null
+++ b/main.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "net"
+ "net/http"
+ "os"
+ "time"
+)
+
+func main() {
+ listen := flag.String("listen", "0.0.0.0", "interface to listen on (default: 0.0.0.0)")
+ port := flag.String("port", "8080", "port to listen on")
+ cert := flag.String("cert", "", "tls certificate file (for https)")
+ key := flag.String("key", "", "tls key file (for https)")
+ responseFile := flag.String("response", "", "file to use as static HTTP response body")
+ flag.Parse()
+
+ logFilename := fmt.Sprintf("requests_%s.log", time.Now().Format("2006-01-02T15-04-05"))
+ logFile, err := os.OpenFile(logFilename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+ if err != nil {
+ log.Fatalf("Failed to open log file: %v", err)
+ }
+ defer logFile.Close()
+
+ multiLog := io.MultiWriter(os.Stdout, logFile)
+ logger := log.New(multiLog, "", 0)
+
+ var staticResponse []byte
+ if *responseFile != "" {
+ staticResponse, err = os.ReadFile(*responseFile)
+ if err != nil {
+ log.Fatalf("Failed to read response file: %v", err)
+ }
+ }
+
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+ body, _ := io.ReadAll(r.Body)
+ r.Body.Close()
+
+ host, _, err := net.SplitHostPort(r.RemoteAddr)
+ if err != nil {
+ host = r.RemoteAddr
+ }
+ logger.Printf("%s | %s\n", time.Now().Format("2006/01/02 15:04:05"), host)
+
+ var logEntry string
+ logEntry += fmt.Sprintf("%s %s %s\n", r.Method, r.URL.RequestURI(), r.Proto)
+ if r.Host != "" {
+ logEntry += fmt.Sprintf("Host: %s\n", r.Host)
+ }
+ for name, values := range r.Header {
+ for _, value := range values {
+ logEntry += fmt.Sprintf("%s: %s\n", name, value)
+ }
+ }
+
+ logEntry += "\n" + string(body) + "\n\n---\n\n"
+ logger.Print(logEntry)
+
+ w.WriteHeader(http.StatusOK)
+ if staticResponse != nil {
+ _, _ = w.Write(staticResponse)
+ } else {
+ _, _ = w.Write([]byte("pong\n"))
+ }
+ })
+
+ addr := *listen + ":" + *port
+
+ if *cert != "" && *key != "" {
+ logger.Printf("Starting HTTPS server on %s\n", addr)
+ err = http.ListenAndServeTLS(addr, *cert, *key, nil)
+ } else {
+ logger.Printf("Starting HTTP server on %s\n", addr)
+ err = http.ListenAndServe(addr, nil)
+ }
+
+ if err != nil {
+ logger.Fatalf("Server failed: %v", err)
+ }
+}