1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
15 // DialError is an error that occurs while dialling a websocket server.
16 type DialError struct {
21 func (e *DialError) Error() string {
22 return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error()
25 // NewConfig creates a new WebSocket config for client connection.
26 func NewConfig(server, origin string) (config *Config, err error) {
28 config.Version = ProtocolVersionHybi13
29 config.Location, err = url.ParseRequest(server)
33 config.Origin, err = url.ParseRequest(origin)
40 // NewClient creates a new WebSocket client connection over rwc.
41 func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) {
42 br := bufio.NewReader(rwc)
43 bw := bufio.NewWriter(rwc)
44 switch config.Version {
45 case ProtocolVersionHixie75:
46 err = hixie75ClientHandshake(config, br, bw)
47 case ProtocolVersionHixie76, ProtocolVersionHybi00:
48 err = hixie76ClientHandshake(config, br, bw)
49 case ProtocolVersionHybi08, ProtocolVersionHybi13:
50 err = hybiClientHandshake(config, br, bw)
52 err = ErrBadProtocolVersion
57 buf := bufio.NewReadWriter(br, bw)
58 switch config.Version {
59 case ProtocolVersionHixie75, ProtocolVersionHixie76, ProtocolVersionHybi00:
60 ws = newHixieClientConn(config, buf, rwc)
61 case ProtocolVersionHybi08, ProtocolVersionHybi13:
62 ws = newHybiClientConn(config, buf, rwc)
68 Dial opens a new client connection to a WebSocket.
70 A trivial example client:
82 origin := "http://localhost/"
83 url := "ws://localhost/ws"
84 ws, err := websocket.Dial(url, "", origin)
88 if _, err := ws.Write([]byte("hello, world!\n")); err != nil {
91 var msg = make([]byte, 512);
92 if n, err := ws.Read(msg); err != nil {
98 func Dial(url_, protocol, origin string) (ws *Conn, err error) {
99 config, err := NewConfig(url_, origin)
103 return DialConfig(config)
106 // DialConfig opens a new client connection to a WebSocket with a config.
107 func DialConfig(config *Config) (ws *Conn, err error) {
109 if config.Location == nil {
110 return nil, &DialError{config, ErrBadWebSocketLocation}
112 if config.Origin == nil {
113 return nil, &DialError{config, ErrBadWebSocketOrigin}
115 switch config.Location.Scheme {
117 client, err = net.Dial("tcp", config.Location.Host)
120 client, err = tls.Dial("tcp", config.Location.Host, config.TlsConfig)
129 ws, err = NewClient(config, client)
136 return nil, &DialError{config, err}