]> Cypherpunks repositories - gostls13.git/commitdiff
http: send full URL in proxy requests
authorRuss Cox <rsc@golang.org>
Thu, 17 Feb 2011 22:14:50 +0000 (17:14 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 17 Feb 2011 22:14:50 +0000 (17:14 -0500)
Fixes #53.  (again)

R=agl1
CC=golang-dev
https://golang.org/cl/4167054

src/pkg/http/client.go
src/pkg/http/request.go

index ae37879ae984612953f8b437661e59e2c3510eb8..cc0ac323dc6ed336f6afab3bef08674c3c9fec70 100644 (file)
@@ -92,19 +92,25 @@ func send(req *Request) (resp *Response, err os.Error) {
 
        var proxyURL *URL
        proxyAuth := ""
-       proxy := os.Getenv("HTTP_PROXY")
-       if proxy == "" {
-               proxy = os.Getenv("http_proxy")
-       }
-       if matchNoProxy(addr) {
-               proxy = ""
+       proxy := ""
+       if !matchNoProxy(addr) {
+               proxy = os.Getenv("HTTP_PROXY")
+               if proxy == "" {
+                       proxy = os.Getenv("http_proxy")
+               }
        }
 
        if proxy != "" {
-               proxyURL, err = ParseURL(proxy)
+               proxyURL, err = ParseRequestURL(proxy)
                if err != nil {
                        return nil, os.ErrorString("invalid proxy address")
                }
+               if proxyURL.Host == "" {
+                       proxyURL, err = ParseRequestURL("http://" + proxy)
+                       if err != nil {
+                               return nil, os.ErrorString("invalid proxy address")
+                       }
+               }
                addr = proxyURL.Host
                proxyInfo := proxyURL.RawUserinfo
                if proxyInfo != "" {
index 04bebaaf55bc0df244776de2d793b286ccd9cb62..e682c2c1ade22b0950cdbbc57faf785ff36421a6 100644 (file)
@@ -184,6 +184,17 @@ const defaultUserAgent = "Go http package"
 // If Body is present, Write forces "Transfer-Encoding: chunked" as a header
 // and then closes Body when finished sending it.
 func (req *Request) Write(w io.Writer) os.Error {
+       return req.write(w, false)
+}
+
+// WriteProxy is like Write but writes the request in the form
+// expected by an HTTP proxy.  It includes the scheme and host
+// name in the URI instead of using a separate Host: header line.
+func (req *Request) WriteProxy(w io.Writer) os.Error {
+       return req.write(w, true)
+}
+
+func (req *Request) write(w io.Writer, usingProxy bool) os.Error {
        host := req.Host
        if host == "" {
                host = req.URL.Host
@@ -197,10 +208,19 @@ func (req *Request) Write(w io.Writer) os.Error {
                }
        }
 
+       if usingProxy {
+               if uri == "" || uri[0] != '/' {
+                       uri = "/" + uri
+               }
+               uri = req.URL.Scheme + "://" + host + uri
+       }
+
        fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(req.Method, "GET"), uri)
 
        // Header lines
-       fmt.Fprintf(w, "Host: %s\r\n", host)
+       if !usingProxy {
+               fmt.Fprintf(w, "Host: %s\r\n", host)
+       }
        fmt.Fprintf(w, "User-Agent: %s\r\n", valueOrDefault(req.UserAgent, defaultUserAgent))
        if req.Referer != "" {
                fmt.Fprintf(w, "Referer: %s\r\n", req.Referer)