-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
69 lines (58 loc) · 1.74 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"flag"
"log"
"net/http"
"net/http/httputil"
"net/url"
"strings"
)
func main() {
// Define command line flags
username := flag.String("user", "glzjin", "Username to impersonate")
role := flag.String("role", "ADMIN", "Role to impersonate (will be converted to uppercase)")
targetURL := flag.String("target", "http://127.0.0.1:8080", "Target URL to proxy to")
listenAddr := flag.String("listen", ":8081", "Address to listen on")
// Parse command line flags
flag.Parse()
// Convert role to uppercase
upperRole := strings.ToUpper(*role)
// Target URL
target, err := url.Parse(*targetURL)
if err != nil {
log.Fatal("Error parsing target URL:", err)
}
// Create reverse proxy
proxy := httputil.NewSingleHostReverseProxy(target)
// Create a custom transport
proxy.Transport = &http.Transport{
Proxy: http.ProxyFromEnvironment,
}
// Modify the director to preserve original request
originalDirector := proxy.Director
proxy.Director = func(req *http.Request) {
originalDirector(req)
if _, ok := req.Header["User-Agent"]; !ok {
req.Header.Set("User-Agent", "")
}
}
// Create a handler that wraps the proxy
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Set custom headers only once
r.Header.Set("X-HC-User-ID", *username)
r.Header.Set("X-HC-User-Role", upperRole)
proxy.ServeHTTP(w, r)
})
// Create server
server := &http.Server{
Addr: *listenAddr,
Handler: handler,
}
// Start the server
log.Printf("Starting proxy server on %s", *listenAddr)
log.Printf("Proxying to: %s", *targetURL)
log.Printf("Using credentials - User: %s, Role: %s", *username, upperRole)
if err := server.ListenAndServe(); err != nil {
log.Fatal("Error starting proxy server:", err)
}
}