Proxy golang https

2019-08-02 08:18发布

问题:

i am trying to make one get in https://www.google.com using proxy with authentication, i already passing header parameter

Proxy-Authorization

but proxy server return

Proxy Authentication Required

code:

package main

import (
    "crypto/tls"
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "os"
)

func main() {
    req, _ := http.NewRequest("GET", "https://www.google.com.br", nil)
    req.Header.Set("Host", "www.google.com.br")

    proxyURL := url.URL{
        Host: "IP-HERE:PORT-HEERE"}

    transport := &http.Transport{
        Proxy:           http.ProxyURL(&proxyURL),
        TLSClientConfig: &tls.Config{},
    }
    client := &http.Client{Transport: transport}
    req.RequestURI = ""

    auth := fmt.Sprintf("USER:PASSWORD")
    basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
    req.Header.Add("Proxy-Authorization", basic)

    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("erro: %s", err)
    }
    fmt.Printf("code: %s", resp.StatusCode)
    htmlData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Println(os.Stdout, string(htmlData))
}

I have to pass another parameter?

When i perform one get in http://www.google.com.br, without https.. proxy authentication with success. why?

回答1:

I found the solution. Golang don't pass header parameters in method CONNECT, then parameter Proxy-Authorization aren't sent to proxy server.

to resolve this, field ProxyConnectHeader was added to struct Transport. but this change until released, this change are only in master.

to test this new field using golang from master, i made on project in github and worked.

link to golang path

link to project in github that test this new field