github.com/misfo/deis@v1.0.1-0.20141111224634-e0eee0392b8a/logspout/Godeps/_workspace/src/code.google.com/p/go.net/websocket/client.go (about) 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. 4 5 package websocket 6 7 import ( 8 "bufio" 9 "crypto/tls" 10 "io" 11 "net" 12 "net/http" 13 "net/url" 14 ) 15 16 // DialError is an error that occurs while dialling a websocket server. 17 type DialError struct { 18 *Config 19 Err error 20 } 21 22 func (e *DialError) Error() string { 23 return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() 24 } 25 26 // NewConfig creates a new WebSocket config for client connection. 27 func NewConfig(server, origin string) (config *Config, err error) { 28 config = new(Config) 29 config.Version = ProtocolVersionHybi13 30 config.Location, err = url.ParseRequestURI(server) 31 if err != nil { 32 return 33 } 34 config.Origin, err = url.ParseRequestURI(origin) 35 if err != nil { 36 return 37 } 38 config.Header = http.Header(make(map[string][]string)) 39 return 40 } 41 42 // NewClient creates a new WebSocket client connection over rwc. 43 func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { 44 br := bufio.NewReader(rwc) 45 bw := bufio.NewWriter(rwc) 46 err = hybiClientHandshake(config, br, bw) 47 if err != nil { 48 return 49 } 50 buf := bufio.NewReadWriter(br, bw) 51 ws = newHybiClientConn(config, buf, rwc) 52 return 53 } 54 55 // Dial opens a new client connection to a WebSocket. 56 func Dial(url_, protocol, origin string) (ws *Conn, err error) { 57 config, err := NewConfig(url_, origin) 58 if err != nil { 59 return nil, err 60 } 61 if protocol != "" { 62 config.Protocol = []string{protocol} 63 } 64 return DialConfig(config) 65 } 66 67 // DialConfig opens a new client connection to a WebSocket with a config. 68 func DialConfig(config *Config) (ws *Conn, err error) { 69 var client net.Conn 70 if config.Location == nil { 71 return nil, &DialError{config, ErrBadWebSocketLocation} 72 } 73 if config.Origin == nil { 74 return nil, &DialError{config, ErrBadWebSocketOrigin} 75 } 76 switch config.Location.Scheme { 77 case "ws": 78 client, err = net.Dial("tcp", config.Location.Host) 79 80 case "wss": 81 client, err = tls.Dial("tcp", config.Location.Host, config.TlsConfig) 82 83 default: 84 err = ErrBadScheme 85 } 86 if err != nil { 87 goto Error 88 } 89 90 ws, err = NewClient(config, client) 91 if err != nil { 92 goto Error 93 } 94 return 95 96 Error: 97 return nil, &DialError{config, err} 98 }