From bbca180dba857b3377e629addef7a3a9df054feb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 25 Aug 2016 21:55:49 +0200 Subject: [PATCH] try protobuf --- app/router/proto/config.proto | 5 ++ common/net/timed_io.go | 14 +++--- common/net/timed_io_test.go | 6 +-- common/protocol/user.go | 2 +- proxy/dokodemo/config.go | 2 +- proxy/dokodemo/config_json.go | 2 +- proxy/freedom/config.go | 14 +----- proxy/freedom/config.pb.go | 82 +++++++++++++++++++++++++++++++ proxy/freedom/config.proto | 13 +++++ proxy/freedom/config_json.go | 6 +-- proxy/freedom/freedom.go | 8 +-- proxy/freedom/freedom_test.go | 2 +- proxy/http/config.go | 11 +---- proxy/http/config.pb.go | 68 +++++++++++++++++++++++++ proxy/http/config.proto | 14 ++++++ proxy/http/config_json.go | 6 +-- proxy/http/server.go | 6 +-- proxy/http/server_test.go | 2 +- proxy/socks/server_config.go | 2 +- proxy/socks/server_config_json.go | 2 +- 20 files changed, 216 insertions(+), 51 deletions(-) create mode 100644 app/router/proto/config.proto create mode 100644 proxy/freedom/config.pb.go create mode 100644 proxy/freedom/config.proto create mode 100644 proxy/http/config.pb.go create mode 100644 proxy/http/config.proto diff --git a/app/router/proto/config.proto b/app/router/proto/config.proto new file mode 100644 index 00000000..40179f43 --- /dev/null +++ b/app/router/proto/config.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +message Config { + +} \ No newline at end of file diff --git a/common/net/timed_io.go b/common/net/timed_io.go index 5e0e9227..60e6bdbf 100644 --- a/common/net/timed_io.go +++ b/common/net/timed_io.go @@ -11,15 +11,15 @@ var ( ) type TimeOutReader struct { - timeout int + timeout uint32 connection net.Conn worker io.Reader } -func NewTimeOutReader(timeout int /* seconds */, connection net.Conn) *TimeOutReader { +func NewTimeOutReader(timeout uint32 /* seconds */, connection net.Conn) *TimeOutReader { reader := &TimeOutReader{ connection: connection, - timeout: -100, + timeout: 0, } reader.SetTimeOut(timeout) return reader @@ -29,12 +29,12 @@ func (reader *TimeOutReader) Read(p []byte) (int, error) { return reader.worker.Read(p) } -func (reader *TimeOutReader) GetTimeOut() int { +func (reader *TimeOutReader) GetTimeOut() uint32 { return reader.timeout } -func (reader *TimeOutReader) SetTimeOut(value int) { - if value == reader.timeout { +func (reader *TimeOutReader) SetTimeOut(value uint32) { + if reader.worker != nil && value == reader.timeout { return } reader.timeout = value @@ -56,7 +56,7 @@ func (reader *TimeOutReader) Release() { } type timedReaderWorker struct { - timeout int + timeout uint32 connection net.Conn } diff --git a/common/net/timed_io_test.go b/common/net/timed_io_test.go index fc9847ea..7a5162f4 100644 --- a/common/net/timed_io_test.go +++ b/common/net/timed_io_test.go @@ -11,9 +11,9 @@ func TestTimeOutSettings(t *testing.T) { assert := assert.On(t) reader := NewTimeOutReader(8, nil) - assert.Int(reader.GetTimeOut()).Equals(8) + assert.Uint32(reader.GetTimeOut()).Equals(8) reader.SetTimeOut(8) // no op - assert.Int(reader.GetTimeOut()).Equals(8) + assert.Uint32(reader.GetTimeOut()).Equals(8) reader.SetTimeOut(9) - assert.Int(reader.GetTimeOut()).Equals(9) + assert.Uint32(reader.GetTimeOut()).Equals(9) } diff --git a/common/protocol/user.go b/common/protocol/user.go index 73c8425e..d3364265 100644 --- a/common/protocol/user.go +++ b/common/protocol/user.go @@ -21,7 +21,7 @@ func NewUser(level UserLevel, email string) *User { } type UserSettings struct { - PayloadReadTimeout int + PayloadReadTimeout uint32 } func GetUserSettings(level UserLevel) UserSettings { diff --git a/proxy/dokodemo/config.go b/proxy/dokodemo/config.go index 701141b3..051e4edc 100644 --- a/proxy/dokodemo/config.go +++ b/proxy/dokodemo/config.go @@ -9,5 +9,5 @@ type Config struct { Address v2net.Address Port v2net.Port Network *v2net.NetworkList - Timeout int + Timeout uint32 } diff --git a/proxy/dokodemo/config_json.go b/proxy/dokodemo/config_json.go index cddec97d..42168088 100644 --- a/proxy/dokodemo/config_json.go +++ b/proxy/dokodemo/config_json.go @@ -15,7 +15,7 @@ func (this *Config) UnmarshalJSON(data []byte) error { Host *v2net.AddressJson `json:"address"` PortValue v2net.Port `json:"port"` NetworkList *v2net.NetworkList `json:"network"` - TimeoutValue int `json:"timeout"` + TimeoutValue uint32 `json:"timeout"` Redirect bool `json:"followRedirect"` } rawConfig := new(DokodemoConfig) diff --git a/proxy/freedom/config.go b/proxy/freedom/config.go index ec3c4f6d..a67b65a2 100644 --- a/proxy/freedom/config.go +++ b/proxy/freedom/config.go @@ -1,13 +1,3 @@ +//go:generate protoc --go_out=. config.proto + package freedom - -type DomainStrategy int - -const ( - DomainStrategyAsIs = DomainStrategy(0) - DomainStrategyUseIP = DomainStrategy(1) -) - -type Config struct { - DomainStrategy DomainStrategy - Timeout uint32 -} diff --git a/proxy/freedom/config.pb.go b/proxy/freedom/config.pb.go new file mode 100644 index 00000000..e6358709 --- /dev/null +++ b/proxy/freedom/config.pb.go @@ -0,0 +1,82 @@ +// Code generated by protoc-gen-go. +// source: config.proto +// DO NOT EDIT! + +/* +Package freedom is a generated protocol buffer package. + +It is generated from these files: + config.proto + +It has these top-level messages: + Config +*/ +package freedom + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Config_DomainStrategy int32 + +const ( + Config_AS_IS Config_DomainStrategy = 0 + Config_USE_IP Config_DomainStrategy = 1 +) + +var Config_DomainStrategy_name = map[int32]string{ + 0: "AS_IS", + 1: "USE_IP", +} +var Config_DomainStrategy_value = map[string]int32{ + "AS_IS": 0, + "USE_IP": 1, +} + +func (x Config_DomainStrategy) String() string { + return proto.EnumName(Config_DomainStrategy_name, int32(x)) +} +func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } + +type Config struct { + DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domainStrategy,enum=com.v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domainStrategy,omitempty"` + Timeout uint32 `protobuf:"varint,2,opt,name=timeout" json:"timeout,omitempty"` +} + +func (m *Config) Reset() { *m = Config{} } +func (m *Config) String() string { return proto.CompactTextString(m) } +func (*Config) ProtoMessage() {} +func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func init() { + proto.RegisterType((*Config)(nil), "com.v2ray.core.proxy.freedom.Config") + proto.RegisterEnum("com.v2ray.core.proxy.freedom.Config_DomainStrategy", Config_DomainStrategy_name, Config_DomainStrategy_value) +} + +func init() { proto.RegisterFile("config.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 174 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0xce, 0xcf, 0x4b, + 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x49, 0xce, 0xcf, 0xd5, 0x2b, 0x33, + 0x2a, 0x4a, 0xac, 0xd4, 0x4b, 0xce, 0x2f, 0x4a, 0x05, 0x89, 0x56, 0x54, 0xea, 0xa5, 0x15, 0xa5, + 0xa6, 0xa6, 0xe4, 0xe7, 0x2a, 0xad, 0x60, 0xe4, 0x62, 0x73, 0x06, 0x2b, 0x17, 0x8a, 0xe6, 0xe2, + 0x4b, 0xc9, 0xcf, 0x4d, 0xcc, 0xcc, 0x0b, 0x2e, 0x29, 0x4a, 0x2c, 0x49, 0x4d, 0xaf, 0x94, 0x60, + 0x54, 0x60, 0xd4, 0xe0, 0x33, 0x32, 0xd6, 0xc3, 0x67, 0x82, 0x1e, 0x44, 0xb7, 0x9e, 0x0b, 0x8a, + 0xd6, 0x20, 0x34, 0xa3, 0x84, 0x24, 0xb8, 0xd8, 0x4b, 0x32, 0x73, 0x53, 0xf3, 0x4b, 0x4b, 0x24, + 0x98, 0x14, 0x18, 0x35, 0x78, 0x83, 0x60, 0x5c, 0x25, 0x75, 0x2e, 0x3e, 0x54, 0xbd, 0x42, 0x9c, + 0x5c, 0xac, 0x8e, 0xc1, 0xf1, 0x9e, 0xc1, 0x02, 0x0c, 0x42, 0x5c, 0x5c, 0x6c, 0xa1, 0xc1, 0xae, + 0xf1, 0x9e, 0x01, 0x02, 0x8c, 0x4e, 0x9c, 0x51, 0xec, 0x50, 0x3b, 0x93, 0xd8, 0xc0, 0x5e, 0x33, + 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x68, 0xdc, 0x2d, 0xea, 0x00, 0x00, 0x00, +} diff --git a/proxy/freedom/config.proto b/proxy/freedom/config.proto new file mode 100644 index 00000000..20c48cd8 --- /dev/null +++ b/proxy/freedom/config.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package com.v2ray.core.proxy.freedom; +option go_package = "freedom"; + +message Config { + enum DomainStrategy { + AS_IS = 0; + USE_IP = 1; + } + DomainStrategy domainStrategy = 1; + uint32 timeout = 2; +} \ No newline at end of file diff --git a/proxy/freedom/config_json.go b/proxy/freedom/config_json.go index 229bc175..06a5c7ab 100644 --- a/proxy/freedom/config_json.go +++ b/proxy/freedom/config_json.go @@ -19,10 +19,10 @@ func (this *Config) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, jsonConfig); err != nil { return errors.New("Freedom: Failed to parse config: " + err.Error()) } - this.DomainStrategy = DomainStrategyAsIs + this.DomainStrategy = Config_AS_IS domainStrategy := strings.ToLower(jsonConfig.DomainStrategy) - if domainStrategy == "useip" { - this.DomainStrategy = DomainStrategyUseIP + if domainStrategy == "useip" || domainStrategy == "use_ip" { + this.DomainStrategy = Config_USE_IP } this.Timeout = jsonConfig.Timeout return nil diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 675afec7..67ac35b5 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -19,7 +19,7 @@ import ( ) type FreedomConnection struct { - domainStrategy DomainStrategy + domainStrategy Config_DomainStrategy timeout uint32 dns dns.Server meta *proxy.OutboundHandlerMeta @@ -32,7 +32,7 @@ func NewFreedomConnection(config *Config, space app.Space, meta *proxy.OutboundH meta: meta, } space.InitializeApplication(func() error { - if config.DomainStrategy == DomainStrategyUseIP { + if config.DomainStrategy == Config_USE_IP { if !space.HasApp(dns.APP_ID) { log.Error("Freedom: DNS server is not found in the space.") return app.ErrMissingApplication @@ -75,7 +75,7 @@ func (this *FreedomConnection) Dispatch(destination v2net.Destination, payload * defer ray.OutboundOutput().Close() var conn internet.Connection - if this.domainStrategy == DomainStrategyUseIP && destination.Address().Family().IsDomain() { + if this.domainStrategy == Config_USE_IP && destination.Address().Family().IsDomain() { destination = this.ResolveIP(destination) } err := retry.Timed(5, 100).On(func() error { @@ -116,7 +116,7 @@ func (this *FreedomConnection) Dispatch(destination v2net.Destination, payload * timeout = 16 } if timeout > 0 { - reader = v2net.NewTimeOutReader(int(timeout) /* seconds */, conn) + reader = v2net.NewTimeOutReader(timeout /* seconds */, conn) } v2reader := v2io.NewAdaptiveReader(reader) diff --git a/proxy/freedom/freedom_test.go b/proxy/freedom/freedom_test.go index e124e8e6..ab0f94f8 100644 --- a/proxy/freedom/freedom_test.go +++ b/proxy/freedom/freedom_test.go @@ -97,7 +97,7 @@ func TestIPResolution(t *testing.T) { space.BindApp(dns.APP_ID, dnsServer) freedom := NewFreedomConnection( - &Config{DomainStrategy: DomainStrategyUseIP}, + &Config{DomainStrategy: Config_USE_IP}, space, &proxy.OutboundHandlerMeta{ Address: v2net.AnyIP, diff --git a/proxy/http/config.go b/proxy/http/config.go index 8df9260a..0286777c 100644 --- a/proxy/http/config.go +++ b/proxy/http/config.go @@ -1,10 +1,3 @@ +//go:generate protoc --go_out=. config.proto + package http - -// Config for HTTP proxy server. -type Config struct { - Timeout int -} - -// ClientConfig for HTTP proxy client. -type ClientConfig struct { -} diff --git a/proxy/http/config.pb.go b/proxy/http/config.pb.go new file mode 100644 index 00000000..1eb52835 --- /dev/null +++ b/proxy/http/config.pb.go @@ -0,0 +1,68 @@ +// Code generated by protoc-gen-go. +// source: config.proto +// DO NOT EDIT! + +/* +Package http is a generated protocol buffer package. + +It is generated from these files: + config.proto + +It has these top-level messages: + ServerConfig + ClientConfig +*/ +package http + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// Config for HTTP proxy server. +type ServerConfig struct { + Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` +} + +func (m *ServerConfig) Reset() { *m = ServerConfig{} } +func (m *ServerConfig) String() string { return proto.CompactTextString(m) } +func (*ServerConfig) ProtoMessage() {} +func (*ServerConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// ClientConfig for HTTP proxy client. +type ClientConfig struct { +} + +func (m *ClientConfig) Reset() { *m = ClientConfig{} } +func (m *ClientConfig) String() string { return proto.CompactTextString(m) } +func (*ClientConfig) ProtoMessage() {} +func (*ClientConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func init() { + proto.RegisterType((*ServerConfig)(nil), "com.v2ray.core.proxy.http.ServerConfig") + proto.RegisterType((*ClientConfig)(nil), "com.v2ray.core.proxy.http.ClientConfig") +} + +func init() { proto.RegisterFile("config.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 119 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0xce, 0xcf, 0x4b, + 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x4c, 0xce, 0xcf, 0xd5, 0x2b, 0x33, + 0x2a, 0x4a, 0xac, 0xd4, 0x4b, 0xce, 0x2f, 0x4a, 0x05, 0x89, 0x56, 0x54, 0xea, 0x65, 0x94, 0x94, + 0x14, 0x28, 0x69, 0x70, 0xf1, 0x04, 0xa7, 0x16, 0x95, 0xa5, 0x16, 0x39, 0x83, 0x35, 0x08, 0x49, + 0x70, 0xb1, 0x97, 0x64, 0xe6, 0xa6, 0xe6, 0x97, 0x96, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0xf0, 0x06, + 0xc1, 0xb8, 0x4a, 0x7c, 0x5c, 0x3c, 0xce, 0x39, 0x99, 0xa9, 0x79, 0x25, 0x10, 0x95, 0x4e, 0x6c, + 0x51, 0x2c, 0x20, 0x13, 0x92, 0xd8, 0xc0, 0x76, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd6, + 0xea, 0x59, 0xf8, 0x73, 0x00, 0x00, 0x00, +} diff --git a/proxy/http/config.proto b/proxy/http/config.proto new file mode 100644 index 00000000..286520ab --- /dev/null +++ b/proxy/http/config.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package com.v2ray.core.proxy.http; +option go_package = "http"; + +// Config for HTTP proxy server. +message ServerConfig { + uint32 timeout = 1; +} + +// ClientConfig for HTTP proxy client. +message ClientConfig { + +} \ No newline at end of file diff --git a/proxy/http/config_json.go b/proxy/http/config_json.go index fd6479d9..29a61d29 100644 --- a/proxy/http/config_json.go +++ b/proxy/http/config_json.go @@ -10,9 +10,9 @@ import ( ) // UnmarshalJSON implements json.Unmarshaler -func (this *Config) UnmarshalJSON(data []byte) error { +func (this *ServerConfig) UnmarshalJSON(data []byte) error { type JsonConfig struct { - Timeout int `json:"timeout"` + Timeout uint32 `json:"timeout"` } jsonConfig := new(JsonConfig) if err := json.Unmarshal(data, jsonConfig); err != nil { @@ -24,5 +24,5 @@ func (this *Config) UnmarshalJSON(data []byte) error { } func init() { - registry.RegisterInboundConfig("http", func() interface{} { return new(Config) }) + registry.RegisterInboundConfig("http", func() interface{} { return new(ServerConfig) }) } diff --git a/proxy/http/server.go b/proxy/http/server.go index efcb69d0..64292e1b 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -26,12 +26,12 @@ type Server struct { sync.Mutex accepting bool packetDispatcher dispatcher.PacketDispatcher - config *Config + config *ServerConfig tcpListener *internet.TCPHub meta *proxy.InboundHandlerMeta } -func NewServer(config *Config, packetDispatcher dispatcher.PacketDispatcher, meta *proxy.InboundHandlerMeta) *Server { +func NewServer(config *ServerConfig, packetDispatcher dispatcher.PacketDispatcher, meta *proxy.InboundHandlerMeta) *Server { return &Server{ packetDispatcher: packetDispatcher, config: config, @@ -273,7 +273,7 @@ func (this *ServerFactory) Create(space app.Space, rawConfig interface{}, meta * return nil, common.ErrBadConfiguration } return NewServer( - rawConfig.(*Config), + rawConfig.(*ServerConfig), space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher), meta), nil } diff --git a/proxy/http/server_test.go b/proxy/http/server_test.go index 249b56ac..3aedc2dc 100644 --- a/proxy/http/server_test.go +++ b/proxy/http/server_test.go @@ -58,7 +58,7 @@ func TestNormalGetRequest(t *testing.T) { port := v2net.Port(dice.Roll(20000) + 10000) httpProxy := NewServer( - &Config{}, + &ServerConfig{}, testPacketDispatcher, &proxy.InboundHandlerMeta{ Address: v2net.LocalHostIP, diff --git a/proxy/socks/server_config.go b/proxy/socks/server_config.go index c895787f..e9a2b61e 100644 --- a/proxy/socks/server_config.go +++ b/proxy/socks/server_config.go @@ -14,7 +14,7 @@ type Config struct { Accounts map[string]string Address v2net.Address UDPEnabled bool - Timeout int + Timeout uint32 } func (this *Config) HasAccount(username, password string) bool { diff --git a/proxy/socks/server_config_json.go b/proxy/socks/server_config_json.go index 3ff3a753..54276d6e 100644 --- a/proxy/socks/server_config_json.go +++ b/proxy/socks/server_config_json.go @@ -23,7 +23,7 @@ func (this *Config) UnmarshalJSON(data []byte) error { Accounts []*Account `json:"accounts"` UDP bool `json:"udp"` Host *v2net.AddressJson `json:"ip"` - Timeout int `json:"timeout"` + Timeout uint32 `json:"timeout"` } rawConfig := new(SocksConfig)