2016-11-16 3 views
8

मैं एक गोलांग https को एक विशिष्ट आईपी पते का उपयोग करने के लिए अनुरोध कैसे प्राप्त कर सकता हूं। मैं DNS रिज़ॉल्यूशन को छोड़ना चाहता हूं और आईपी स्वयं प्रदान करना चाहता हूं। कर्ल में समकक्ष नीचे वर्णित के रूप में एक --resolve होगा।विशिष्ट आईपी (curl --resolve के समान) के लिए गोलांग बल http अनुरोध

कर्ल https://domain.com/dir/filename --resolve "domain.com:443:10.10.10.10"

इस के बाद से ssl मैं निम्न उदाहरण में डोमेन के लिए आईपी में प्रतिस्थापन से बचने के लिए चाहते हैं।

कर्ल https://10.10.10.10/dir/filename --header "होस्ट: domain.com"

उत्तर

14

आप एक कस्टम Transport.DialContext समारोह प्रदान कर सकते हैं।

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) { 
     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) 
} 
+0

धन्यवाद, यह अच्छी तरह से काम किया, मैं "addr" "https" में परिवर्तित करने के लिए करने के लिए "443" –

+0

@RyanD एक समायोजन करने के लिए किया था। मैं जवाब अपडेट करूंगा। – OneOfOne

+1

@ OneOfOne I IPv6 पता addr = "2001: 558: fe0d: 23 :: 2: 443" निर्दिष्ट करते समय एक समस्या में भाग गया, मैं कॉलन विभाजक के आसपास भ्रम के कारण अनुमान लगा रहा हूं ":"। मैंने सोचा कि मैंने एक उदाहरण देखा है जहां उन्होंने आईपीवी 6 पते के आसपास []: [2001: 558: fe0d: 23 :: 2]: 443 "लगाया और मैंने सोचा कि मेरे पास यह काम कर रहा है लेकिन यह भी असफल रहा। आईपीवी 6 उदाहरण खोजने के लिए संघर्ष। कोई विचार? –

3

ऊपर OneOfOne का उत्तर उत्कृष्ट है। मैं यहां मेरे जैसे नोबस के लिए आसान बनाने के लिए पूर्ण कार्य पैकेज कोड पोस्ट कर रहा हूं। मैंने कुछ प्रिंटलिन जोड़े ताकि आप संशोधन से पहले और बाद में एडीआर मूल्य देख सकें।

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) 
} 
संबंधित मुद्दे