這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。Go1.9 出來後 6 個多月的時間,Go1.10 就被[發布](https://blog.golang.org/go1.10)。新版本帶來大大小小的變化([版本資訊](https://golang.org/doc/go1.10)),但是我想談談有關 `net/http` 包的改變。1.10 版本支援在 HTTPS([commit](https://github.com/hyangah/go/commit/ab0372d91c17ca97a8258670beadadc6601d0da2)) 上的代理,而在原來它只能通過使用普通的(未加密)HTTP 來和代理進行溝通。接下來讓我們來看看它是否真的可以工作。## Server為了驗證這一改變,首先請用 golang 啟動一個簡單的 HTTP(S) Proxy 伺服器。具體做法可以從下面文章瞭解。[HTTP(S) Proxy in Golang in less than 100 lines of code](https://medium.com/@mlowicki/http-s-proxy-in-golang-in-less-than-100-lines-of-code-6a51c2f2c38c)## Client```gopackage mainimport ("net/url""net/http""crypto/tls""net/http/httputil""fmt")func main() {u, err := url.Parse("https://localhost:8888")if err != nil {panic(err)}tr := &http.Transport{Proxy: http.ProxyURL(u),// disabled HTTP/2TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),}client := &http.Client{Transport: tr}resp, err := client.Get("https://google.com")if err != nil {panic(err)}defer resp.Body.Close()dump, err := httputil.DumpResponse(resp, true)if err != nil {panic(err)}fmt.Printf("%q", dump)}```## 1.9 和 1.10 對比```>go versiongo version go1.10 darwin/amd64>go run proxyclient.go"HTTP/1.1 200 OK\r\nTransfer-Encoding:...>go versiongo version go1.9 darwin/amd64>go run proxyclient.gopanic:Get https://google.com:malformed HTTP response "\x15\x03\x01\x00\x02\x02\x16"...```從第一個結果看到,使用 Go1.10,我們通過Proxy 伺服器[https//google.com](https//google.com)監聽[https://localhost:8888](https://localhost:8888)得到正確的響應。而第二個結果顯示 Go1.9 搭建的 HTTP 用戶端被拒絕。如果你想瞭解更多關於 Go 更新的內容,請在這裡關注我或者在[Twitter](https://twitter.com/mlowicki)上。
via: https://medium.com/@mlowicki/https-proxies-support-in-go-1-10-b956fb501d6b
作者:Michał Łowicki 譯者:zhaohj1118 校對:rxcai
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
816 次點擊