summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml30
-rw-r--r--build-release.sh21
-rw-r--r--go.mod3
-rw-r--r--main.go85
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
+)
+'
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..3f940c7
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module go-http-logger
+
+go 1.24.5
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)
+ }
+}