func dialHTTP(network, address, codecName string, cFactory ClientCodecFactory, auth bool, connectTimeout time.Duration, config *tls.Config) (*rpc.Client, error) { var err error var conn net.Conn if connectTimeout != 0 { conn, err = net.DialTimeout(network, address, connectTimeout) } else { conn, err = net.Dial(network, address) } if err != nil { return nil, err } if config != nil { conn = tls.Client(conn, config) } _, err = io.WriteString(conn, "CONNECT "+GetRpcPath(codecName, auth)+" HTTP/1.0\n\n") if err != nil { return nil, err } // Require successful HTTP response // before switching to RPC protocol. buffered := NewBufferedConnection(conn) resp, err := http.ReadResponse(buffered.Reader, &http.Request{Method: "CONNECT"}) if err == nil && resp.Status == connected { return rpc.NewClientWithCodec(cFactory(buffered)), nil } if err == nil { err = errors.New("unexpected HTTP response: " + resp.Status) } conn.Close() return nil, &net.OpError{Op: "dial-http", Net: network + " " + address, Addr: nil, Err: err} }
// NewClient returns a new rpc.Client to handle requests to the // set of services at the other end of the connection. func NewClient(conn io.ReadWriteCloser) *rpc.Client { return rpc.NewClientWithCodec(NewClientCodec(conn)) }