diff options
author | heqnx <root@heqnx.com> | 2025-08-06 12:22:31 +0300 |
---|---|---|
committer | heqnx <root@heqnx.com> | 2025-08-06 12:22:31 +0300 |
commit | 2fc27e5b3b802dcc77a0299f99b97056712c92e3 (patch) | |
tree | 4c0d6f6ca74ab9f7eb9b2600ed1696dfd88e47d8 | |
parent | 910fb7f2078e5e0a576dbb465bc7b3eb61bd474c (diff) | |
download | go-http-logger-2fc27e5b3b802dcc77a0299f99b97056712c92e3.tar.gz go-http-logger-2fc27e5b3b802dcc77a0299f99b97056712c92e3.zip |
initial commit
-rw-r--r-- | .gitlab-ci.yml | 30 | ||||
-rw-r--r-- | build-release.sh | 21 | ||||
-rw-r--r-- | go.mod | 3 | ||||
-rw-r--r-- | main.go | 85 |
4 files changed, 139 insertions, 0 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..236b28c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,30 @@ +# source repo .gitlab-ci.yml +# requires a project access token (Project > Settings > Access tokens): +# - TOKEN with read_repository, write_repository; Role: Maintainer +# +# disable protected branch for Maintainer (Project > Settings > Repository): +# - main branch allowed to merge, allowed to push and merge maintainer; allowed to force push on +# +# requires the following gitlab variables (Project > Settings > CI/CD > Variables): +# - REPO_NAME: gitlab.com/<user>/<repo_name> (Protected, Masked, Expanded) +# - SOURCE_REPO: https://cgit.example.com/<repo_name> (Protected, Masked, Expanded) +# - TOKEN: <project access token> (Protected, Masked, Expanded) +# +stages: + - mirror + +mirror-from-cgit: + stage: mirror + image: ubuntu:20.04 + before_script: + - apt-get update -y && apt-get install -y git + - git config --global user.name "CI" + - git config --global user.email "ci@gitlab.com" + script: + - git clone --mirror "$SOURCE_REPO" temp_repo + - cd temp_repo + - TARGET_REPO="https://oauth2:$TOKEN@$REPO_NAME" + - git remote set-url origin "$TARGET_REPO" + - git push --prune --mirror + only: + - schedules diff --git a/build-release.sh b/build-release.sh new file mode 100644 index 0000000..5f1b978 --- /dev/null +++ b/build-release.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +if ! command -v docker &>/dev/null; then + printf "%s\n" "[err] docker not found" + exit 1 +fi + +docker run --rm -it -v $(pwd):/mnt golang:latest /bin/bash -c ' +git config --global --add safe.directory /mnt +DEBIAN_FRONTEND=noninteractive apt-get update +DEBIAN_FRONTEND=noninteractive apt-get install -y make zip git + +( + cd /mnt + REPO_NAME=$(basename $(git remote get-url origin)) + REPO_NAME="${REPO_NAME%.git}" + make all + zip -r "${REPO_NAME}-release.zip" LICENSE README.md build/ + make clean +) +' @@ -0,0 +1,3 @@ +module go-http-logger + +go 1.24.5 @@ -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) + } +} |