mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-10-19 18:23:38 -04:00
75 lines
2.8 KiB
Go
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)
|
|
}
|