如何在客户端处理https(记录时间过长错误)
我正在构建代理,我还想处理https URL。如何在客户端处理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")
问题是,我尝试访问时出错 我的代理的代码如下:
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("----------")
}
}