Compare commits
4 Commits
565f4ce4fc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cf3ec88bb1 | |||
| 842444b70b | |||
| e8353f7e28 | |||
|
|
2f9deb6997 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
*.yaml
|
*.yaml
|
||||||
bin/http_logger
|
bin/http_logger
|
||||||
|
*.out
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
2025/10/26 01:40:52 Ошибка загрузки конфига: open config.yaml: no such file or directory
|
|
||||||
2025/10/26 01:41:33 Ошибка загрузки конфига: open config.yaml: no such file or directory
|
|
||||||
2025/10/26 01:42:54 Запуск приложения
|
|
||||||
2025/10/26 01:42:54 Ошибка загрузки конфига: open config.yaml: no such file or directory
|
|
||||||
2025/10/26 01:43:36 Запуск приложения
|
|
||||||
2025/10/26 01:43:36 Слушаю 127.0.0.1:7001 ...
|
|
||||||
2025/10/26 01:43:50 Запуск приложения
|
|
||||||
2025/10/26 01:43:50 Слушаю 127.0.0.1:7001 ...
|
|
||||||
2025/10/26 01:43:54 Запуск приложения
|
|
||||||
2025/10/26 01:43:54 Слушаю 127.0.0.1:7001 ...
|
|
||||||
87
main.go
87
main.go
@@ -4,8 +4,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
@@ -25,6 +27,58 @@ type ConfigTelegraam struct {
|
|||||||
GroupID int64 `yaml:"group_id"`
|
GroupID int64 `yaml:"group_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetRemoteAddr(r *http.Request) string {
|
||||||
|
// Сначала смотрим X-Forwarded-For
|
||||||
|
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
|
||||||
|
// X-Forwarded-For может содержать несколько IP через запятую
|
||||||
|
ips := strings.Split(xff, ",")
|
||||||
|
if len(ips) > 0 {
|
||||||
|
return strings.TrimSpace(ips[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Потом X-Real-IP
|
||||||
|
if realIP := r.Header.Get("X-Real-IP"); realIP != "" {
|
||||||
|
return realIP
|
||||||
|
}
|
||||||
|
|
||||||
|
// И в конце RemoteAddr
|
||||||
|
host, _, err := net.SplitHostPort(r.RemoteAddr)
|
||||||
|
if err != nil {
|
||||||
|
return r.RemoteAddr
|
||||||
|
}
|
||||||
|
return host
|
||||||
|
}
|
||||||
|
|
||||||
|
func BuildMessage(r *http.Request) string {
|
||||||
|
t := time.Now()
|
||||||
|
|
||||||
|
var body []byte
|
||||||
|
|
||||||
|
if r.ContentLength > 1024 {
|
||||||
|
body = []byte("too long")
|
||||||
|
} else {
|
||||||
|
// Читаем тело запроса
|
||||||
|
body, _ = io.ReadAll(r.Body)
|
||||||
|
_ = r.Body.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Формируем содержимое
|
||||||
|
entry := fmt.Sprintf("[%s] %s %s%s\n", t.Format(time.RFC3339), r.Method, r.Host, r.URL.String())
|
||||||
|
entry += "RemoteAddr: " + GetRemoteAddr(r) + "\n"
|
||||||
|
entry += "Headers:\n"
|
||||||
|
for name, values := range r.Header {
|
||||||
|
for _, v := range values {
|
||||||
|
entry += fmt.Sprintf(" %s: %s\n", name, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entry += fmt.Sprintf("Body:\n%s\n", string(body))
|
||||||
|
entry += "----\n"
|
||||||
|
|
||||||
|
entry = "```" + entry + "```"
|
||||||
|
return entry
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("Запуск приложения")
|
log.Println("Запуск приложения")
|
||||||
// Загружаем конфиг
|
// Загружаем конфиг
|
||||||
@@ -44,31 +98,18 @@ func main() {
|
|||||||
|
|
||||||
// Общий обработчик
|
// Общий обработчик
|
||||||
handler := func(w http.ResponseWriter, r *http.Request) {
|
handler := func(w http.ResponseWriter, r *http.Request) {
|
||||||
t := time.Now()
|
paths := strings.Split(r.URL.Path, "/")
|
||||||
|
switch {
|
||||||
var body []byte
|
case len(paths) < 2:
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
if r.ContentLength > 1024 {
|
return
|
||||||
body = []byte("too long")
|
case paths[1] == "telegram":
|
||||||
} else {
|
default:
|
||||||
// Читаем тело запроса
|
w.WriteHeader(http.StatusNotFound)
|
||||||
body, _ = io.ReadAll(r.Body)
|
return
|
||||||
_ = r.Body.Close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Формируем содержимое
|
entry := BuildMessage(r)
|
||||||
entry := fmt.Sprintf("[%s] %s %s%s\n", t.Format(time.RFC3339), r.Method, r.Host, r.URL.String())
|
|
||||||
entry += "Headers:\n"
|
|
||||||
for name, values := range r.Header {
|
|
||||||
for _, v := range values {
|
|
||||||
entry += fmt.Sprintf(" %s: %s\n", name, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
entry += fmt.Sprintf("Body:\n%s\n", string(body))
|
|
||||||
entry += "----\n"
|
|
||||||
|
|
||||||
entry = "```" + entry + "```"
|
|
||||||
|
|
||||||
_, err = tg.SendTextMessage(cfg.Telegram.GroupID, entry)
|
_, err = tg.SendTextMessage(cfg.Telegram.GroupID, entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
|||||||
Reference in New Issue
Block a user