1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-07-15 17:54:37 -04:00
v2fly/transport/internet/request/stereotype/meek/meek.go
2023-05-30 17:49:28 +01:00

75 lines
2.8 KiB
Go

package meek
import (
"context"
"github.com/v2fly/v2ray-core/v5/common"
"github.com/v2fly/v2ray-core/v5/common/net"
"github.com/v2fly/v2ray-core/v5/common/serial"
"github.com/v2fly/v2ray-core/v5/transport/internet"
"github.com/v2fly/v2ray-core/v5/transport/internet/request/assembler/simple"
"github.com/v2fly/v2ray-core/v5/transport/internet/request/assembly"
"github.com/v2fly/v2ray-core/v5/transport/internet/request/roundtripper/httprt"
)
//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
const protocolName = "meek"
func init() {
common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
return nil, newError("meek is a transport")
}))
common.Must(internet.RegisterTransportDialer(protocolName, meekDial))
common.Must(internet.RegisterTransportListener(protocolName, meekListen))
}
func meekDial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) {
meekSetting := streamSettings.ProtocolSettings.(*Config)
simpleAssembler := &simple.ClientConfig{
MaxWriteSize: 65536,
WaitSubsequentWriteMs: 10,
InitialPollingIntervalMs: 100,
MaxPollingIntervalMs: 1000,
MinPollingIntervalMs: 10,
BackoffFactor: 1.5,
FailedRetryIntervalMs: 1000,
}
httprtSetting := &httprt.ClientConfig{
Http: &httprt.HTTPConfig{
UrlPrefix: meekSetting.Url,
},
}
request := &assembly.Config{
Assembler: serial.ToTypedMessage(simpleAssembler),
Roundtripper: serial.ToTypedMessage(httprtSetting),
}
constructedSetting := &internet.MemoryStreamConfig{
ProtocolName: "request",
ProtocolSettings: request,
SecurityType: streamSettings.SecurityType,
SecuritySettings: streamSettings.SecuritySettings,
SocketSettings: streamSettings.SocketSettings,
}
return internet.Dial(ctx, dest, constructedSetting)
}
func meekListen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, callback internet.ConnHandler) (internet.Listener, error) {
meekSetting := streamSettings.ProtocolSettings.(*Config)
simpleAssembler := &simple.ServerConfig{MaxWriteSize: 65536}
httprtSetting := &httprt.ServerConfig{NoDecodingSessionTag: true, Http: &httprt.HTTPConfig{UrlPrefix: meekSetting.Url}}
request := &assembly.Config{
Assembler: serial.ToTypedMessage(simpleAssembler),
Roundtripper: serial.ToTypedMessage(httprtSetting),
}
constructedSetting := &internet.MemoryStreamConfig{
ProtocolName: "request",
ProtocolSettings: request,
SecurityType: streamSettings.SecurityType,
SecuritySettings: streamSettings.SecuritySettings,
SocketSettings: streamSettings.SocketSettings,
}
return internet.ListenTCP(ctx, address, port, constructedSetting, callback)
}