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 (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os/user"
|
"os/user"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"go.wit.com/lib/protobuf/gitpb"
|
"go.wit.com/lib/protobuf/gitpb"
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
|
@ -92,3 +94,55 @@ func (f *Forge) UpdatePB(check *gitpb.Repos) (*gitpb.Repos, error) {
|
||||||
|
|
||||||
return queryPB.SubmitReposPB(url)
|
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
|
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 {
|
func (f *Forge) SavePatchsets() error {
|
||||||
filename := filepath.Join(f.patchDir, "all-patches.pb")
|
filename := filepath.Join(f.patchDir, "all-patches.pb")
|
||||||
regfile, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
|
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
|
// this is a "PATCH: [1/x]" series
|
||||||
message Patches { // `autogenpb:marshal` `autogenpb:gui:Patch`
|
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 uuid = 1; // `autogenpb:uuid:2679065e-c81d-4a00-aca4-03c158a834fb`
|
||||||
string version = 2; // `autogenpb:version:v2.0.0`
|
string version = 2; // `autogenpb:version:v2.0.0`
|
||||||
repeated Patch Patches = 3;
|
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`
|
message Patchset { // `autogenpb:marshal`
|
||||||
Patches patches = 1; //
|
Patches patches = 1; //
|
||||||
string name = 2; // `autogenpb:sort`
|
string name = 2; // `autogenpb:sort`
|
||||||
|
|
Loading…
Reference in New Issue