msg

package
v0.70.28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 29, 2026 License: Apache-2.0 Imports: 10 Imported by: 0

Documentation

Index

Constants

View Source
const (
	TypeLogin              byte = 'o'
	TypeLoginResp          byte = '1'
	TypeNewProxy           byte = 'p'
	TypeNewProxyResp       byte = '2'
	TypeCloseProxy         byte = 'c'
	TypeNewWorkConn        byte = 'w'
	TypeReqWorkConn        byte = 'r'
	TypeStartWorkConn      byte = 's'
	TypeNewVisitorConn     byte = 'v'
	TypeNewVisitorConnResp byte = '3'
	TypePing               byte = 'h'
	TypePong               byte = '4'
	TypeUDPPacket          byte = 'u'
	TypeNatHoleVisitor     byte = 'i'
	TypeNatHoleClient      byte = 'n'
	TypeNatHoleResp        byte = 'm'
	TypeNatHoleSid         byte = '5'
	TypeNatHoleReport      byte = '6'
	TypeServerCommand      byte = '7'
	TypeServerCommandResp  byte = '8'
)
View Source
const (
	V2TypeLogin              uint16 = 1
	V2TypeLoginResp          uint16 = 2
	V2TypeNewProxy           uint16 = 3
	V2TypeNewProxyResp       uint16 = 4
	V2TypeCloseProxy         uint16 = 5
	V2TypeNewWorkConn        uint16 = 6
	V2TypeReqWorkConn        uint16 = 7
	V2TypeStartWorkConn      uint16 = 8
	V2TypeNewVisitorConn     uint16 = 9
	V2TypeNewVisitorConnResp uint16 = 10
	V2TypePing               uint16 = 11
	V2TypePong               uint16 = 12
	V2TypeUDPPacket          uint16 = 13
	V2TypeNatHoleVisitor     uint16 = 14
	V2TypeNatHoleClient      uint16 = 15
	V2TypeNatHoleResp        uint16 = 16
	V2TypeNatHoleSid         uint16 = 17
	V2TypeNatHoleReport      uint16 = 18
	V2TypeUDPPacketBinary    uint16 = 19
	V2TypeServerCommand      uint16 = 20
	V2TypeServerCommandResp  uint16 = 21
)
View Source
const MaxUDPPayloadSize = 65507

Variables

View Source
var TypeNameNatHoleResp = reflect.TypeFor[NatHoleResp]().Name()

Functions

func AsyncHandler

func AsyncHandler(f func(Message)) func(Message)

func DecodeV2MessageFrameInto added in v0.70.10

func DecodeV2MessageFrameInto(f *wire.Frame, out Message) error

func EncodeUDPPacketBinary added in v0.70.10

func EncodeUDPPacketBinary(packet *UDPPacket) ([]byte, error)

EncodeUDPPacketBinary encodes the body of a V2 binary UDP packet message. RemoteAddr is required by the UDP forwarding path.

func EncodeV2MessageFrame added in v0.70.10

func EncodeV2MessageFrame(m Message) (*wire.Frame, error)

func ReadMsgInto

func ReadMsgInto(c io.Reader, msg Message) (err error)

func WriteMsg

func WriteMsg(c io.Writer, msg any) (err error)

Types

type ClientSpec

type ClientSpec struct {
	// Due to the support of VirtualClient, frps needs to know the client type in order to
	// differentiate the processing logic.
	// Optional values: ssh-tunnel
	Type string `json:"type,omitempty"`
	// If the value is true, the client will not require authentication.
	AlwaysAuthPass bool `json:"always_auth_pass,omitempty"`
}

type CloseProxy

type CloseProxy struct {
	ProxyName string `json:"proxy_name,omitempty"`
}

type Conn added in v0.70.10

type Conn struct {
	net.Conn
	// contains filtered or unexported fields
}

func NewConn added in v0.70.10

func NewConn(conn net.Conn, rw ReadWriter) *Conn

func (*Conn) Context added in v0.70.10

func (c *Conn) Context() context.Context

func (*Conn) ReadMsg added in v0.70.10

func (c *Conn) ReadMsg() (Message, error)

func (*Conn) ReadMsgInto added in v0.70.10

func (c *Conn) ReadMsgInto(m Message) error

func (*Conn) WithContext added in v0.70.10

func (c *Conn) WithContext(ctx context.Context)

func (*Conn) WriteMsg added in v0.70.10

func (c *Conn) WriteMsg(m Message) error

type Dispatcher

type Dispatcher struct {
	// contains filtered or unexported fields
}

Dispatcher is used to send messages to net.Conn or register handlers for messages read from net.Conn.

func NewDispatcher

func NewDispatcher(rw ReadWriter) *Dispatcher

func (*Dispatcher) Done

func (d *Dispatcher) Done() chan struct{}

func (*Dispatcher) RegisterHandler

func (d *Dispatcher) RegisterHandler(msg Message, handler func(Message))

func (*Dispatcher) Run

func (d *Dispatcher) Run()

Run will block until io.EOF or some error occurs.

func (*Dispatcher) Send

func (d *Dispatcher) Send(m Message) error

type Login

type Login struct {
	Version      string            `json:"version,omitempty"`
	Hostname     string            `json:"hostname,omitempty"`
	Os           string            `json:"os,omitempty"`
	Arch         string            `json:"arch,omitempty"`
	User         string            `json:"user,omitempty"`
	PrivilegeKey string            `json:"privilege_key,omitempty"`
	Timestamp    int64             `json:"timestamp,omitempty"`
	RunID        string            `json:"run_id,omitempty"`
	ClientID     string            `json:"client_id,omitempty"`
	Metas        map[string]string `json:"metas,omitempty"`

	// Currently only effective for VirtualClient.
	ClientSpec ClientSpec `json:"client_spec,omitempty"`

	// Some global configures.
	PoolCount int `json:"pool_count,omitempty"`

	// ClientAddr is the client's own view of its outbound IP address. When frps
	// sits behind a reverse proxy (e.g. nginx), the server side RemoteAddr may
	// only see the proxy's address (e.g. 127.0.0.1). The client reports its real
	// outbound address so the server can prefer it when the two disagree.
	ClientAddr string `json:"client_addr,omitempty"`
}

When frpc start, client send this message to login to server.

type LoginResp

type LoginResp struct {
	Version string `json:"version,omitempty"`
	RunID   string `json:"run_id,omitempty"`
	Error   string `json:"error,omitempty"`
}

type Message

type Message = jsonMsg.Message

func DecodeV2MessageFrame added in v0.70.10

func DecodeV2MessageFrame(f *wire.Frame) (Message, error)

func ReadMsg

func ReadMsg(c io.Reader) (msg Message, err error)

type NatHoleClient

type NatHoleClient struct {
	TransactionID string   `json:"transaction_id,omitempty"`
	ProxyName     string   `json:"proxy_name,omitempty"`
	Sid           string   `json:"sid,omitempty"`
	MappedAddrs   []string `json:"mapped_addrs,omitempty"`
	AssistedAddrs []string `json:"assisted_addrs,omitempty"`
}

type NatHoleDetectBehavior

type NatHoleDetectBehavior struct {
	Role              string       `json:"role,omitempty"` // sender or receiver
	Mode              int          `json:"mode,omitempty"` // 0, 1, 2...
	TTL               int          `json:"ttl,omitempty"`
	SendDelayMs       int          `json:"send_delay_ms,omitempty"`
	ReadTimeoutMs     int          `json:"read_timeout,omitempty"`
	CandidatePorts    []PortsRange `json:"candidate_ports,omitempty"`
	SendRandomPorts   int          `json:"send_random_ports,omitempty"`
	ListenRandomPorts int          `json:"listen_random_ports,omitempty"`
}

type NatHoleReport

type NatHoleReport struct {
	Sid     string `json:"sid,omitempty"`
	Success bool   `json:"success,omitempty"`
}

type NatHoleResp

type NatHoleResp struct {
	TransactionID  string                `json:"transaction_id,omitempty"`
	Sid            string                `json:"sid,omitempty"`
	Protocol       string                `json:"protocol,omitempty"`
	CandidateAddrs []string              `json:"candidate_addrs,omitempty"`
	AssistedAddrs  []string              `json:"assisted_addrs,omitempty"`
	DetectBehavior NatHoleDetectBehavior `json:"detect_behavior,omitempty"`
	Error          string                `json:"error,omitempty"`
}

type NatHoleSid

type NatHoleSid struct {
	TransactionID string `json:"transaction_id,omitempty"`
	Sid           string `json:"sid,omitempty"`
	Response      bool   `json:"response,omitempty"`
	Nonce         string `json:"nonce,omitempty"`
}

type NatHoleVisitor

type NatHoleVisitor struct {
	TransactionID string   `json:"transaction_id,omitempty"`
	ProxyName     string   `json:"proxy_name,omitempty"`
	PreCheck      bool     `json:"pre_check,omitempty"`
	Protocol      string   `json:"protocol,omitempty"`
	SignKey       string   `json:"sign_key,omitempty"`
	Timestamp     int64    `json:"timestamp,omitempty"`
	MappedAddrs   []string `json:"mapped_addrs,omitempty"`
	AssistedAddrs []string `json:"assisted_addrs,omitempty"`
}

type NewProxy

type NewProxy struct {
	ProxyName          string            `json:"proxy_name,omitempty"`
	ProxyType          string            `json:"proxy_type,omitempty"`
	UseEncryption      bool              `json:"use_encryption,omitempty"`
	UseCompression     bool              `json:"use_compression,omitempty"`
	BandwidthLimit     string            `json:"bandwidth_limit,omitempty"`
	BandwidthLimitMode string            `json:"bandwidth_limit_mode,omitempty"`
	Group              string            `json:"group,omitempty"`
	GroupKey           string            `json:"group_key,omitempty"`
	Metas              map[string]string `json:"metas,omitempty"`
	Annotations        map[string]string `json:"annotations,omitempty"`

	// tcp and udp only
	RemotePort int `json:"remote_port,omitempty"`

	// http and https only
	CustomDomains     []string          `json:"custom_domains,omitempty"`
	SubDomain         string            `json:"subdomain,omitempty"`
	Locations         []string          `json:"locations,omitempty"`
	HTTPUser          string            `json:"http_user,omitempty"`
	HTTPPwd           string            `json:"http_pwd,omitempty"`
	HostHeaderRewrite string            `json:"host_header_rewrite,omitempty"`
	Headers           map[string]string `json:"headers,omitempty"`
	ResponseHeaders   map[string]string `json:"response_headers,omitempty"`
	RouteByHTTPUser   string            `json:"route_by_http_user,omitempty"`

	// stcp, sudp, xtcp
	Sk         string   `json:"sk,omitempty"`
	AllowUsers []string `json:"allow_users,omitempty"`

	// tcpmux
	Multiplexer string `json:"multiplexer,omitempty"`
}

When frpc login success, send this message to frps for running a new proxy.

type NewProxyResp

type NewProxyResp struct {
	ProxyName  string `json:"proxy_name,omitempty"`
	RemoteAddr string `json:"remote_addr,omitempty"`
	Error      string `json:"error,omitempty"`
}

type NewVisitorConn

type NewVisitorConn struct {
	RunID          string `json:"run_id,omitempty"`
	ProxyName      string `json:"proxy_name,omitempty"`
	SignKey        string `json:"sign_key,omitempty"`
	Timestamp      int64  `json:"timestamp,omitempty"`
	UseEncryption  bool   `json:"use_encryption,omitempty"`
	UseCompression bool   `json:"use_compression,omitempty"`
}

type NewVisitorConnResp

type NewVisitorConnResp struct {
	ProxyName string `json:"proxy_name,omitempty"`
	Error     string `json:"error,omitempty"`
}

type NewWorkConn

type NewWorkConn struct {
	RunID        string `json:"run_id,omitempty"`
	PrivilegeKey string `json:"privilege_key,omitempty"`
	Timestamp    int64  `json:"timestamp,omitempty"`
}

type Ping

type Ping struct {
	PrivilegeKey string `json:"privilege_key,omitempty"`
	Timestamp    int64  `json:"timestamp,omitempty"`
}

type Pong

type Pong struct {
	Error string `json:"error,omitempty"`
}

type PortsRange

type PortsRange struct {
	From int `json:"from,omitempty"`
	To   int `json:"to,omitempty"`
}

type ReadWriter added in v0.70.10

type ReadWriter interface {
	ReadMsg() (Message, error)
	ReadMsgInto(Message) error
	WriteMsg(Message) error
}

func NewReadWriter added in v0.70.10

func NewReadWriter(rw io.ReadWriter, wireProtocol string) ReadWriter

NewReadWriter wraps rw with the message codec for the selected wire protocol. An empty protocol keeps the historical v1 behavior for tests and older call sites.

func NewUDPPacketReadWriter added in v0.70.10

func NewUDPPacketReadWriter(rw io.ReadWriter, wireProtocol, udpPacketCodec string) (ReadWriter, error)

NewUDPPacketReadWriter selects the negotiated packet codec without changing the framing or codecs used by non-UDP messages on the work connection.

func NewV1ReadWriter added in v0.70.10

func NewV1ReadWriter(rw io.ReadWriter) ReadWriter

type ReqWorkConn

type ReqWorkConn struct{}

type ServerCommand added in v0.70.10

type ServerCommand struct {
	// RequestID correlates a command with its response so that concurrent
	// commands to the same client are routed to the correct caller instead of
	// clobbering each other (the server historically used a single shared
	// callback that was overwritten on every send).
	RequestID string `json:"request_id,omitempty"`
	Command   string `json:"command,omitempty"`
	Payload   string `json:"payload,omitempty"`
}

ServerCommand is sent from frps to frpc to execute a command on the client side.

type ServerCommandResp added in v0.70.10

type ServerCommandResp struct {
	RequestID string `json:"request_id,omitempty"`
	Command   string `json:"command,omitempty"`
	Result    string `json:"result,omitempty"`
	Output    string `json:"output,omitempty"`
}

ServerCommandResp is sent from frpc to frps as a response to a ServerCommand.

type StartWorkConn

type StartWorkConn struct {
	ProxyName string `json:"proxy_name,omitempty"`
	SrcAddr   string `json:"src_addr,omitempty"`
	DstAddr   string `json:"dst_addr,omitempty"`
	SrcPort   uint16 `json:"src_port,omitempty"`
	DstPort   uint16 `json:"dst_port,omitempty"`
	Error     string `json:"error,omitempty"`
}

type UDPPacket

type UDPPacket struct {
	Content    []byte       `json:"c,omitempty"`
	LocalAddr  *net.UDPAddr `json:"l,omitempty"`
	RemoteAddr *net.UDPAddr `json:"r,omitempty"`
}

func DecodeUDPPacketBinary added in v0.70.10

func DecodeUDPPacketBinary(body []byte) (*UDPPacket, error)

DecodeUDPPacketBinary decodes a V2 binary UDP packet body and returns data that does not alias the input frame buffer.

type V1ReadWriter added in v0.70.10

type V1ReadWriter struct {
	// contains filtered or unexported fields
}

func (*V1ReadWriter) ReadMsg added in v0.70.10

func (rw *V1ReadWriter) ReadMsg() (Message, error)

func (*V1ReadWriter) ReadMsgInto added in v0.70.10

func (rw *V1ReadWriter) ReadMsgInto(m Message) error

func (*V1ReadWriter) WriteMsg added in v0.70.10

func (rw *V1ReadWriter) WriteMsg(m Message) error

type V2BinaryUDPPacketReadWriter added in v0.70.10

type V2BinaryUDPPacketReadWriter struct {
	// contains filtered or unexported fields
}

func NewV2BinaryUDPPacketReadWriter added in v0.70.10

func NewV2BinaryUDPPacketReadWriter(rw io.ReadWriter) *V2BinaryUDPPacketReadWriter

func (*V2BinaryUDPPacketReadWriter) ReadMsg added in v0.70.10

func (rw *V2BinaryUDPPacketReadWriter) ReadMsg() (Message, error)

func (*V2BinaryUDPPacketReadWriter) ReadMsgInto added in v0.70.10

func (rw *V2BinaryUDPPacketReadWriter) ReadMsgInto(out Message) error

func (*V2BinaryUDPPacketReadWriter) WriteMsg added in v0.70.10

func (rw *V2BinaryUDPPacketReadWriter) WriteMsg(message Message) error

type V2ReadWriter added in v0.70.10

type V2ReadWriter struct {
	// contains filtered or unexported fields
}

func NewV2ReadWriter added in v0.70.10

func NewV2ReadWriter(rw io.ReadWriter) *V2ReadWriter

func NewV2ReadWriterWithConn added in v0.70.10

func NewV2ReadWriterWithConn(conn *wire.Conn) *V2ReadWriter

func (*V2ReadWriter) ReadMsg added in v0.70.10

func (rw *V2ReadWriter) ReadMsg() (Message, error)

func (*V2ReadWriter) ReadMsgInto added in v0.70.10

func (rw *V2ReadWriter) ReadMsgInto(m Message) error

func (*V2ReadWriter) WireConn added in v0.70.10

func (rw *V2ReadWriter) WireConn() *wire.Conn

func (*V2ReadWriter) WriteMsg added in v0.70.10

func (rw *V2ReadWriter) WriteMsg(m Message) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL