// Copyright 1994-2025 WIT.COM Inc Licensed GPL 3.0 package forgepb /* func (f *Forge) HttpPost(base string, route string, data []byte) ([]byte, error) { // Fix using url.JoinPath (Best Practice) baseURL, _ := url.Parse(config.Get("ForgeURL")) // "http://forge.grid.wit.com:2520") finalURL := baseURL.JoinPath(route) // Correctly produces ...:2520/patches var err error var req *http.Request req, err = http.NewRequest(http.MethodPost, finalURL.String(), bytes.NewBuffer(data)) if req == nil { return nil, err } req.Header.Set("author", config.Get("author")) req.Header.Set("hostname", config.Get("hostname")) return rawHttpPost(req) } func rawHttpPost(req *http.Request) ([]byte, error) { client := &http.Client{} resp, err := client.Do(req) if err != nil { return []byte("client.Do(req) error"), err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return body, err } return body, 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 } */