diff options
Diffstat (limited to 'http.go')
| -rw-r--r-- | http.go | 54 |
1 files changed, 54 insertions, 0 deletions
@@ -5,8 +5,10 @@ package forgepb import ( "bytes" "io/ioutil" + "net" "net/http" "os/user" + "strings" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" @@ -92,3 +94,55 @@ func (f *Forge) UpdatePB(check *gitpb.Repos) (*gitpb.Repos, error) { return queryPB.SubmitReposPB(url) } + +// HTTPRequestToProto converts an *http.Request to our custom HttpRequest protobuf message. +func (pb *Patches) AddHttpToPB(r *http.Request) error { + if pb == nil { + return log.Errorf("AddHttpToPB() pb was nil") + } + // 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") + } + } + + pb.HttpRequest = &Patches_HttpRequest{ + Method: r.Method, + Url: r.URL.String(), + Proto: r.Proto, + Headers: headers, + RemoteAddr: getClientIP(r), + Host: r.Host, + Hostname: r.Header.Get("hostname"), + } + return nil +} + +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 +} |
