summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/nlopes/slack/websocket_proxy.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2018-01-08 22:41:38 +0100
committerWim <wim@42.be>2018-01-08 22:41:38 +0100
commit4a96a977c0e86e22edcda40730779279334685be (patch)
treefea5efa54d17af2d3cadb4d4d5a42f57e9bb7fbe /vendor/github.com/nlopes/slack/websocket_proxy.go
parent9a95293bdf74a4d02827018649b6ea0ffdef74ba (diff)
downloadmatterbridge-msglm-4a96a977c0e86e22edcda40730779279334685be.tar.gz
matterbridge-msglm-4a96a977c0e86e22edcda40730779279334685be.tar.bz2
matterbridge-msglm-4a96a977c0e86e22edcda40730779279334685be.zip
Update vendor (slack)
Diffstat (limited to 'vendor/github.com/nlopes/slack/websocket_proxy.go')
-rw-r--r--vendor/github.com/nlopes/slack/websocket_proxy.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/vendor/github.com/nlopes/slack/websocket_proxy.go b/vendor/github.com/nlopes/slack/websocket_proxy.go
new file mode 100644
index 00000000..27f1cf99
--- /dev/null
+++ b/vendor/github.com/nlopes/slack/websocket_proxy.go
@@ -0,0 +1,82 @@
+package slack
+
+import (
+ "crypto/tls"
+ "errors"
+ "net"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "os"
+ "strings"
+
+ "golang.org/x/net/websocket"
+)
+
+// Taken and reworked from: https://gist.github.com/madmo/8548738
+func websocketHTTPConnect(proxy, urlString string) (net.Conn, error) {
+ p, err := net.Dial("tcp", proxy)
+ if err != nil {
+ return nil, err
+ }
+
+ turl, err := url.Parse(urlString)
+ if err != nil {
+ return nil, err
+ }
+
+ req := http.Request{
+ Method: "CONNECT",
+ URL: &url.URL{},
+ Host: turl.Host,
+ }
+
+ cc := httputil.NewProxyClientConn(p, nil)
+ if _, err := cc.Do(&req); err != nil {
+ return nil, err
+ }
+
+ rwc, _ := cc.Hijack()
+
+ return rwc, nil
+}
+
+func websocketProxyDial(urlString, origin string) (ws *websocket.Conn, err error) {
+ if os.Getenv("HTTP_PROXY") == "" {
+ return websocket.Dial(urlString, "", origin)
+ }
+
+ purl, err := url.Parse(os.Getenv("HTTP_PROXY"))
+ if err != nil {
+ return nil, err
+ }
+
+ config, err := websocket.NewConfig(urlString, origin)
+ if err != nil {
+ return nil, err
+ }
+
+ client, err := websocketHTTPConnect(purl.Host, urlString)
+ if err != nil {
+ return nil, err
+ }
+
+ switch config.Location.Scheme {
+ case "ws":
+ case "wss":
+ tlsClient := tls.Client(client, &tls.Config{
+ ServerName: strings.Split(config.Location.Host, ":")[0],
+ })
+ err := tlsClient.Handshake()
+ if err != nil {
+ tlsClient.Close()
+ return nil, err
+ }
+ client = tlsClient
+
+ default:
+ return nil, errors.New("invalid websocket schema")
+ }
+
+ return websocket.NewClient(config, client)
+}