Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在客户端处理https(记录时间过长错误)_Https_Go - Fatal编程技术网

如何在客户端处理https(记录时间过长错误)

如何在客户端处理https(记录时间过长错误),https,go,Https,Go,我正在构建代理,我还想处理https URL。 问题是,我尝试访问时出错 我的代理的代码如下: package main import ( "crypto/tls" "flag" "io/ioutil" "log" "net/http" "strings" "unicode" ) var ( listen = flag.String("listen", "localhost:1080", "listen on address")

我正在构建代理,我还想处理https URL。
问题是,我尝试访问时出错

我的代理的代码如下:

package main

import (
    "crypto/tls"
    "flag"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "unicode"
)

var (
    listen = flag.String("listen", "localhost:1080", "listen on address")
    logp   = flag.Bool("log", true, "enable logging")
)

func main() {
    flag.Parse()
    proxyHandler := http.HandlerFunc(proxyHandlerFunc)

    log.Fatal(http.ListenAndServe(*listen, proxyHandler))

    //log.Fatal(http.ListenAndServeTLS("localhost:1080", "cert.pem","key.pem",proxyHandler))

}
func copyHeaders(dst, src http.Header) {
    for k, _ := range dst {
        dst.Del(k)
    }
    for k, vs := range src {
        for _, v := range vs {
            dst.Add(k, v)
        }
    }
}

func proxyHandlerFunc(w http.ResponseWriter, r *http.Request) {
    log.Println(r.Method)

    if r.Method == "CONNECT" && 1 == 2 {

    } else {
        // Log if requested
        if *logp {
            log.Println(r.URL)
        }

        tr := &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        }

        // We'll want to use a new client for every request.
        client := &http.Client{Transport: tr}

        // Tweak the request as appropriate:
        //  RequestURI may not be sent to client
        //  URL.Scheme must be lower-case
        r.RequestURI = ""

        r.URL.Scheme = strings.Map(unicode.ToLower, r.URL.Scheme)
        if r.URL.Scheme == "" {
            r.URL.Scheme = "https"
        }
        log.Println(r.Host)

        // And proxy
        resp, err := client.Do(r)
        if err != nil {
            log.Fatal(err)

        }
        for n, v := range resp.Header {
            log.Printf("%s %s", n, v[0])
        }

        bodyBytes, err := ioutil.ReadAll(resp.Body)
        resp.Body.Close()

        copyHeaders(w.Header(), resp.Header)

        w.Write(bodyBytes)

        log.Print("----------")

    }
}
上面的代码适用于普通URL(http),我应该做什么 还要获取https URL吗

编辑:
我更新了代码。

您代理的代码无法编译;你的错误不容易重现。
package main

import (
    "crypto/tls"
    "flag"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "unicode"
)

var (
    listen = flag.String("listen", "localhost:1080", "listen on address")
    logp   = flag.Bool("log", true, "enable logging")
)

func main() {
    flag.Parse()
    proxyHandler := http.HandlerFunc(proxyHandlerFunc)

    log.Fatal(http.ListenAndServe(*listen, proxyHandler))

    //log.Fatal(http.ListenAndServeTLS("localhost:1080", "cert.pem","key.pem",proxyHandler))

}
func copyHeaders(dst, src http.Header) {
    for k, _ := range dst {
        dst.Del(k)
    }
    for k, vs := range src {
        for _, v := range vs {
            dst.Add(k, v)
        }
    }
}

func proxyHandlerFunc(w http.ResponseWriter, r *http.Request) {
    log.Println(r.Method)

    if r.Method == "CONNECT" && 1 == 2 {

    } else {
        // Log if requested
        if *logp {
            log.Println(r.URL)
        }

        tr := &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        }

        // We'll want to use a new client for every request.
        client := &http.Client{Transport: tr}

        // Tweak the request as appropriate:
        //  RequestURI may not be sent to client
        //  URL.Scheme must be lower-case
        r.RequestURI = ""

        r.URL.Scheme = strings.Map(unicode.ToLower, r.URL.Scheme)
        if r.URL.Scheme == "" {
            r.URL.Scheme = "https"
        }
        log.Println(r.Host)

        // And proxy
        resp, err := client.Do(r)
        if err != nil {
            log.Fatal(err)

        }
        for n, v := range resp.Header {
            log.Printf("%s %s", n, v[0])
        }

        bodyBytes, err := ioutil.ReadAll(resp.Body)
        resp.Body.Close()

        copyHeaders(w.Header(), resp.Header)

        w.Write(bodyBytes)

        log.Print("----------")

    }
}