-
-
Save JalfResi/6287706 to your computer and use it in GitHub Desktop.
package main | |
import( | |
"log" | |
"net/url" | |
"net/http" | |
"net/http/httputil" | |
) | |
func main() { | |
remote, err := url.Parse("http://google.com") | |
if err != nil { | |
panic(err) | |
} | |
handler := func(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) { | |
return func(w http.ResponseWriter, r *http.Request) { | |
log.Println(r.URL) | |
r.Host = remote.Host | |
w.Header().Set("X-Ben", "Rad") | |
p.ServeHTTP(w, r) | |
} | |
} | |
proxy := httputil.NewSingleHostReverseProxy(remote) | |
http.HandleFunc("/", handler(proxy)) | |
err = http.ListenAndServe(":8080", nil) | |
if err != nil { | |
panic(err) | |
} | |
} |
instead of using a closure, you may find creating a struct instance to be simpler. see my fork https://gist.github.com/thurt/2ae1be5fd12a3501e7f049d96dc68bb9 i think it is more idiomatic for golang
Thx
I tried this and it came up 404 in Chrome and Safari.
How to control the http timeout?
added r.Host = remote.Host
I received a 404 as well. Does anyone have a solution?
lovely!
This returns a 404, any solutions?
Does it forward the client IP?
Excellent
Any solution to 404 ?
Added "r.Host = remote.Host" to fix 404 issues
Added "r.Host = remote.Host" to fix 404 issues
undeclared name: remote
function handler should be placed in function main:
handler := func(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL)
r.Host = remote.Host
w.Header().Set("X-Ben", "Rad")
p.ServeHTTP(w, r)
}
}
Thanks @lwzm!
Great!
hi, after saved this file, how can i try?
go run main.go
then
curl localhost:8080
I think
Made some changes to add support for ssl. And cleanup handler.
`package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
"crypto/tls"
)
func main() {
// Replace 'target' with the URL of the server you want to proxy to
target, err := url.Parse("https://example.com")
if err != nil {
panic(err)
}
// Create a new ReverseProxy instance
proxy := httputil.NewSingleHostReverseProxy(target)
// Configure the reverse proxy to use HTTPS
proxy.Transport = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
// Create a handler function that logs the URL and forwards the request to the proxy
handler := func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL)
r.Host = target.Host
//w.Header().Set("X-Ben", "radi")
proxy.ServeHTTP(w, r)
}
// Register the handler function with the HTTP server
http.HandleFunc("/", handler)
// Start the HTTP server
err = http.ListenAndServe(":3000", nil)
if err != nil {
panic(err)
}
}`
Modified it to use struct and ssl
https://gist.github.com/c0d3kid/862276a6291e4aeaf2638e5f7e93a954
Helpful, ta, used this to transparently adjust some query parameters for certain requests.
👍