proxyhttp.go 926 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "net/http/httputil"
  6. "net/url"
  7. "github.com/koding/websocketproxy"
  8. )
  9. // TODO(ssx): not tested yet.
  10. type HTTPWSProxy struct {
  11. forwardedAddr string
  12. wsProxy *websocketproxy.WebsocketProxy
  13. httpProxy *httputil.ReverseProxy
  14. }
  15. // NewHTTPWSProxy return Proxy instance
  16. func NewHTTPWSProxy(forwardedAddr string) *HTTPWSProxy {
  17. wsURL, _ := url.Parse("ws://" + forwardedAddr)
  18. httpURL, _ := url.Parse("http://" + forwardedAddr)
  19. return &HTTPWSProxy{
  20. forwardedAddr: forwardedAddr,
  21. wsProxy: websocketproxy.NewProxy(wsURL),
  22. httpProxy: httputil.NewSingleHostReverseProxy(httpURL),
  23. }
  24. }
  25. func (p *HTTPWSProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  26. if r.Header.Get("Upgrade") == "websocket" {
  27. log.Println("proxy websocket", r.RequestURI)
  28. p.wsProxy.ServeHTTP(w, r)
  29. return
  30. }
  31. log.Println("proxy http", r.RequestURI)
  32. p.httpProxy.ServeHTTP(w, r)
  33. }