golang 强制 http 请求到特定的 ip(类似于 curl --resolve)
golang force http request to specific ip (similar to curl --resolve)
如何强制 golang https get 请求使用特定的 IP 地址。我想跳过 DNS 解析并自己提供 IP。 curl 中的等效项是 --resolve,如下所示。
curl https://domain.com/dir/filename --resolve "domain.com:443:10.10.10.10"
因为这是 ssl,所以我想避免在 IP 中替换域,如下例所示。
curl https://10.10.10.10/dir/filename --header "Host: domain.com"
您可以提供自定义 Transport.DialContext
函数。
func main() {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
// DualStack: true, // this is deprecated as of go 1.16
}
// or create your own transport, there's an example on godoc.
http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
if addr == "google.com:443" {
addr = "216.58.198.206:443"
}
return dialer.DialContext(ctx, network, addr)
}
resp, err := http.Get("https://google.com")
log.Println(resp.Header, err)
}
OneOfOne 上面的回答非常好。我在这里发布了完整的工作包代码,以方便像我这样的新手。我添加了几个println,这样你就可以看到修改前后的addr值了。
package main
import (
"context"
"fmt"
"log"
"net"
"net/http"
"time"
)
func main() {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}
// or create your own transport, there's an example on godoc.
http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
fmt.Println("address original =", addr)
if addr == "google.com:443" {
addr = "216.58.198.206:443"
fmt.Println("address modified =", addr)
}
return dialer.DialContext(ctx, network, addr)
}
resp, err := http.Get("https://google.com")
log.Println(resp.Header, err)
}
如何强制 golang https get 请求使用特定的 IP 地址。我想跳过 DNS 解析并自己提供 IP。 curl 中的等效项是 --resolve,如下所示。
curl https://domain.com/dir/filename --resolve "domain.com:443:10.10.10.10"
因为这是 ssl,所以我想避免在 IP 中替换域,如下例所示。
curl https://10.10.10.10/dir/filename --header "Host: domain.com"
您可以提供自定义 Transport.DialContext
函数。
func main() {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
// DualStack: true, // this is deprecated as of go 1.16
}
// or create your own transport, there's an example on godoc.
http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
if addr == "google.com:443" {
addr = "216.58.198.206:443"
}
return dialer.DialContext(ctx, network, addr)
}
resp, err := http.Get("https://google.com")
log.Println(resp.Header, err)
}
OneOfOne 上面的回答非常好。我在这里发布了完整的工作包代码,以方便像我这样的新手。我添加了几个println,这样你就可以看到修改前后的addr值了。
package main
import (
"context"
"fmt"
"log"
"net"
"net/http"
"time"
)
func main() {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}
// or create your own transport, there's an example on godoc.
http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
fmt.Println("address original =", addr)
if addr == "google.com:443" {
addr = "216.58.198.206:443"
fmt.Println("address modified =", addr)
}
return dialer.DialContext(ctx, network, addr)
}
resp, err := http.Get("https://google.com")
log.Println(resp.Header, err)
}