koding / websocketproxy

WebSocket reverse proxy handler for Go
http://godoc.org/github.com/koding/websocketproxy
MIT License
427 stars 120 forks source link

Qemu websocket for VNC #12

Open joconcepts opened 7 years ago

joconcepts commented 7 years ago

I want to write a little proxy for accessing the vnc console of qemu via websocket. Qemu starts the websocket on its own, so its just a simple proxy.

When connecting to the proxy url via noVNC I get the following message:

websocketproxy: couldn't dial to remote backend url unexpected EOF

My code looks as follows:

func ConsoleHandler(w http.ResponseWriter, r *http.Request) {
    port, _ := "5700"
    proxy_url := fmt.Sprintf("http://localhost:%d", port)
        p_u, _ := url.Parse(proxy_url)

    if strings.ToLower(r.Header.Get("Connection")) == "upgrade" {
        p_u_ws, _ := url.Parse(strings.Replace(proxy_url, "http", "ws", 1))
        websocketproxy.NewProxy(p_u_ws).ServeHTTP(w, r)
        return
    }
    httputil.NewSingleHostReverseProxy(p_u).ServeHTTP(w, r)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", ConsoleHandler)

    srv := &http.Server{
        Handler: r,
        Addr:    "127.0.0.1:10001",
    }
    log.Fatal(srv.ListenAndServe())
}

Can anybody give me some hint why that will not work?

cihangir commented 7 years ago

Seems like your handler is problematic. NewProxy already handles the upgrades and other stuff.

func main() {
        port, _ := "5700"
    proxy_url := fmt.Sprintf("http://localhost:%d", port)
        p_u, _ := url.Parse(proxy_url) // handle the errors

    r := mux.NewRouter()
    r.Handle("/", websocketproxy.NewProxy(p_u))

    srv := &http.Server{
        Handler: r,
        Addr:    "127.0.0.1:10001",
    }
    log.Fatal(srv.ListenAndServe())
}

Please see the example in readme.