add http headers to protobuf
This commit is contained in:
parent
822fe38eee
commit
2015f84fb4
54
http.go
54
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
|
||||
}
|
||||
|
|
|
@ -32,6 +32,19 @@ func (f *Forge) LoadPatchsets() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (f *Forge) InitPatchsets() error {
|
||||
if err := f.LoadPatchsets(); err == nil {
|
||||
return nil
|
||||
} else {
|
||||
log.Info("LoadPatchsets() failed", err)
|
||||
}
|
||||
// TODO: check if Unmarshal failed here
|
||||
f.Patchsets = NewPatchsets()
|
||||
tmp := f.findAutoPatchset() // makes the default setting
|
||||
f.Patchsets.Append(tmp)
|
||||
return f.SavePatchsets()
|
||||
}
|
||||
|
||||
func (f *Forge) SavePatchsets() error {
|
||||
filename := filepath.Join(f.patchDir, "all-patches.pb")
|
||||
regfile, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
|
||||
|
|
|
@ -60,11 +60,24 @@ message Patch {
|
|||
|
||||
// this is a "PATCH: [1/x]" series
|
||||
message Patches { // `autogenpb:marshal` `autogenpb:gui:Patch`
|
||||
message HttpRequest { // HttpRequest represents the essential fields of an incoming HTTP request.
|
||||
string method = 1; // The request method, e.g., "GET", "POST".
|
||||
string url = 2; // The full URL of the request, including scheme, host, path, and query string.
|
||||
string route = 3; // just the route: "/add/" or "/find/"
|
||||
string proto = 4; // The protocol version, e.g., "HTTP/1.1", "HTTP/2.0".
|
||||
map<string, string> headers = 5; // The map of request headers. Header names are case-insensitive,
|
||||
string remoteAddr = 6; // The remote IP address of the client, after resolving proxies.
|
||||
string host = 7; // The host on which the URL is sought (www.wit.com)
|
||||
string hostname = 8; // The hostname of the client if passed from the client (mylaptop.fun.me)
|
||||
bytes body = 9; // The request body as raw bytes.
|
||||
string namespace = 10; // When the body is a pb (always!). This is the pb namespace ("go.wit.com/lib/protobuf/virtpb")
|
||||
}
|
||||
string uuid = 1; // `autogenpb:uuid:2679065e-c81d-4a00-aca4-03c158a834fb`
|
||||
string version = 2; // `autogenpb:version:v2.0.0`
|
||||
repeated Patch Patches = 3;
|
||||
HttpRequest httpRequest = 4; // who connected // rename httpRequest? This might make sense in our case
|
||||
string Error = 5; // when passing these around, if there is an error, store it here
|
||||
}
|
||||
|
||||
message Patchset { // `autogenpb:marshal`
|
||||
Patches patches = 1; //
|
||||
string name = 2; // `autogenpb:sort`
|
||||
|
|
Loading…
Reference in New Issue