From e5cd37ef21e8e573a7d3ff6cf84c250f7cd049ea Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 6 Sep 2025 18:47:35 -0500 Subject: [PATCH] add req to PB function --- reqToPB.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 reqToPB.go diff --git a/reqToPB.go b/reqToPB.go new file mode 100644 index 0000000..747f1d4 --- /dev/null +++ b/reqToPB.go @@ -0,0 +1,73 @@ +// Copyright 1994-2025 WIT.COM Inc Licensed GPL 3.0 + +package httppb + +import ( + "io/ioutil" + "log" + "net" + "net/http" + "strings" +) + +// remove '?' part and trailing '/' +func cleanURL(url string) string { + url = "/" + strings.Trim(url, "/") + return url +} + +func getIpSimple(r *http.Request) string { + host, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + log.Printf("could not split host port: %v", err) + return r.RemoteAddr // Fallback + } + return host +} + +// getClientIP inspects the request for common headers to find the true client IP. +func getClientIP(r *http.Request) string { + // Caddy sets the X-Forwarded-For header. + if forwardedFor := r.Header.Get("X-Forwarded-For"); forwardedFor != "" { + // The header can be a comma-separated list of IPs. The first one is the original client. + ips := strings.Split(forwardedFor, ",") + return strings.TrimSpace(ips[0]) + } + + // Fallback to RemoteAddr if the header is not present. + host, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return host +} + +// converts an *http.Request to an http PB +func ReqToPB(r *http.Request) (*HttpRequest, error) { + // Convert the header map. http.Header is a map[string][]string. + // We'll just take the first value for each header for simplicity. + headers := make(map[string]string) + for name, values := range r.Header { + if len(values) > 0 { + headers[name] = strings.Join(values, "\n") + } + } + + msg, err := ioutil.ReadAll(r.Body) // Read the body as []byte + r.Body.Close() + // log.Info("TRYING TO MARSHAL bytes:", len(msg), err) + + pb := &HttpRequest{ + Method: r.Method, + Url: r.URL.String(), + Proto: r.Proto, + Headers: headers, + RemoteAddr: getClientIP(r), + Host: r.Host, + Body: msg, + Hostname: r.Header.Get("hostname"), + } + pb.Route = cleanURL(r.URL.Path) + + return pb, err +}