Documentation
¶
Overview ¶
Package wsproxy provides a reusable WebSocket proxy handler with hook-based observation points and target resolution abstractions.
The package intentionally does not own persistence, monitor payloads, or any application-specific storage schema. Callers can attach their own hooks and keep UI or backend compatibility layers outside the transport engine.
Example ¶
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"net/url"
"strings"
"github.com/gorilla/websocket"
)
func main() {
upgrader := websocket.Upgrader{CheckOrigin: func(*http.Request) bool { return true }}
upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
mt, msg, err := conn.ReadMessage()
if err != nil {
return
}
_ = conn.WriteMessage(mt, []byte("upstream:"+string(msg)))
}))
defer upstream.Close()
handler, err := New(Options{
Resolver: QueryTargetResolver{NormalizeScheme: true},
})
if err != nil {
panic(err)
}
proxy := httptest.NewServer(handler)
defer proxy.Close()
target := url.QueryEscape(upstream.URL + "/echo")
conn, _, err := websocket.DefaultDialer.Dial(httpToWS(proxy.URL)+"/proxy?_target="+target, nil)
if err != nil {
panic(err)
}
defer conn.Close()
if err := conn.WriteMessage(websocket.TextMessage, []byte("hello")); err != nil {
panic(err)
}
_, msg, err := conn.ReadMessage()
if err != nil {
panic(err)
}
fmt.Println(string(msg))
}
func httpToWS(raw string) string {
return "ws" + strings.TrimPrefix(raw, "http")
}
Output: upstream:hello
Index ¶
Examples ¶
Constants ¶
View Source
const ( DirectionClientToUpstream = observe.DirectionClientToUpstream DirectionUpstreamToClient = observe.DirectionUpstreamToClient )
View Source
const ( MessageText = observe.WSMessageText MessageBinary = observe.WSMessageBinary MessagePing = observe.WSMessagePing MessagePong = observe.WSMessagePong MessageClose = observe.WSMessageClose MessageOther = observe.WSMessageOther )
Variables ¶
View Source
var ( ErrMissingTarget = errors.New("missing target") ErrInvalidTarget = errors.New("invalid target") )
Functions ¶
This section is empty.
Types ¶
type ErrorWriter ¶
type ForwardDecision ¶
type MessageType ¶
type MessageType = observe.WSMessageType
type Options ¶
type Options struct {
Resolver TargetResolver
ObserveTarget func(*url.URL) bool
GenerateSessionID func() string
HandshakeTimeout time.Duration
InsecureTLS bool
AllowPlaintextFallback bool
BeforeForward func(Direction, MessageType, int) ForwardDecision
ForwardHeaders []string
SynthesizeOrigin bool
WriteError ErrorWriter
Hooks Hooks
Upgrader websocket.Upgrader
}
type QueryTargetResolver ¶
type ResolveTargetFunc ¶
Click to show internal directories.
Click to hide internal directories.