summaryrefslogtreecommitdiff
path: root/http.go
diff options
context:
space:
mode:
Diffstat (limited to 'http.go')
-rw-r--r--http.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/http.go b/http.go
index f983220..0e3a56b 100644
--- a/http.go
+++ b/http.go
@@ -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
+}