Commit 4f64ecfd authored by Fazlul Shahriar's avatar Fazlul Shahriar Committed by Russ Cox

http: add https client support

Fixes #851.

R=rsc
CC=golang-dev
https://golang.org/cl/1729052
parent 518df525
...@@ -93,7 +93,7 @@ func (c *Conn) clientHandshake() os.Error { ...@@ -93,7 +93,7 @@ func (c *Conn) clientHandshake() os.Error {
} }
// TODO(rsc): Find certificates for OS X 10.6. // TODO(rsc): Find certificates for OS X 10.6.
if false && c.config.RootCAs != nil { if c.config.RootCAs != nil {
root := c.config.RootCAs.FindParent(certs[len(certs)-1]) root := c.config.RootCAs.FindParent(certs[len(certs)-1])
if root == nil { if root == nil {
return c.sendAlert(alertBadCertificate) return c.sendAlert(alertBadCertificate)
......
...@@ -8,6 +8,7 @@ package http ...@@ -8,6 +8,7 @@ package http
import ( import (
"bufio" "bufio"
"crypto/tls"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"io" "io"
...@@ -21,7 +22,7 @@ import ( ...@@ -21,7 +22,7 @@ import (
func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") } func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
// Used in Send to implement io.ReadCloser by bundling together the // Used in Send to implement io.ReadCloser by bundling together the
// io.BufReader through which we read the response, and the underlying // bufio.Reader through which we read the response, and the underlying
// network connection. // network connection.
type readClose struct { type readClose struct {
io.Reader io.Reader
...@@ -34,13 +35,13 @@ type readClose struct { ...@@ -34,13 +35,13 @@ type readClose struct {
// send() method is nonpublic because, when we refactor the code for persistent // send() method is nonpublic because, when we refactor the code for persistent
// connections, it may no longer make sense to have a method with this signature. // connections, it may no longer make sense to have a method with this signature.
func send(req *Request) (resp *Response, err os.Error) { func send(req *Request) (resp *Response, err os.Error) {
if req.URL.Scheme != "http" { if req.URL.Scheme != "http" && req.URL.Scheme != "https" {
return nil, &badStringError{"unsupported protocol scheme", req.URL.Scheme} return nil, &badStringError{"unsupported protocol scheme", req.URL.Scheme}
} }
addr := req.URL.Host addr := req.URL.Host
if !hasPort(addr) { if !hasPort(addr) {
addr += ":http" addr += ":" + req.URL.Scheme
} }
info := req.URL.Userinfo info := req.URL.Userinfo
if len(info) > 0 { if len(info) > 0 {
...@@ -52,7 +53,13 @@ func send(req *Request) (resp *Response, err os.Error) { ...@@ -52,7 +53,13 @@ func send(req *Request) (resp *Response, err os.Error) {
} }
req.Header["Authorization"] = "Basic " + string(encoded) req.Header["Authorization"] = "Basic " + string(encoded)
} }
conn, err := net.Dial("tcp", "", addr)
var conn io.ReadWriteCloser
if req.URL.Scheme == "http" {
conn, err = net.Dial("tcp", "", addr)
} else { // https
conn, err = tls.Dial("tcp", "", addr)
}
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment