mirror of https://github.com/v2ray/v2ray-core
parent
729312f3b5
commit
8be5d695c8
@ -1,70 +1,70 @@
|
|||||||
package json
|
package json
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/v2ray/v2ray-core"
|
"github.com/v2ray/v2ray-core"
|
||||||
"github.com/v2ray/v2ray-core/log"
|
"github.com/v2ray/v2ray-core/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ConnectionConfig struct {
|
type ConnectionConfig struct {
|
||||||
ProtocolString string `json:"protocol"`
|
ProtocolString string `json:"protocol"`
|
||||||
File string `json:"file"`
|
File string `json:"file"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *ConnectionConfig) Protocol() string {
|
func (config *ConnectionConfig) Protocol() string {
|
||||||
return config.ProtocolString
|
return config.ProtocolString
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *ConnectionConfig) Content() []byte {
|
func (config *ConnectionConfig) Content() []byte {
|
||||||
if len(config.File) == 0 {
|
if len(config.File) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
content, err := ioutil.ReadFile(config.File)
|
content, err := ioutil.ReadFile(config.File)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(log.Error("Failed to read config file (%s): %v", config.File, err))
|
panic(log.Error("Failed to read config file (%s): %v", config.File, err))
|
||||||
}
|
}
|
||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is the config for Point server.
|
// Config is the config for Point server.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
PortValue uint16 `json:"port"` // Port of this Point server.
|
PortValue uint16 `json:"port"` // Port of this Point server.
|
||||||
InboundConfigValue *ConnectionConfig `json:"inbound"`
|
InboundConfigValue *ConnectionConfig `json:"inbound"`
|
||||||
OutboundConfigValue *ConnectionConfig `json:"outbound"`
|
OutboundConfigValue *ConnectionConfig `json:"outbound"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) Port() uint16 {
|
func (config *Config) Port() uint16 {
|
||||||
return config.PortValue
|
return config.PortValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) InboundConfig() core.ConnectionConfig {
|
func (config *Config) InboundConfig() core.ConnectionConfig {
|
||||||
return config.InboundConfigValue
|
return config.InboundConfigValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) OutboundConfig() core.ConnectionConfig {
|
func (config *Config) OutboundConfig() core.ConnectionConfig {
|
||||||
return config.OutboundConfigValue
|
return config.OutboundConfigValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadConfig(file string) (*Config, error) {
|
func LoadConfig(file string) (*Config, error) {
|
||||||
rawConfig, err := ioutil.ReadFile(file)
|
rawConfig, err := ioutil.ReadFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to read point config file (%s): %v", file, err)
|
log.Error("Failed to read point config file (%s): %v", file, err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
config := &Config{}
|
config := &Config{}
|
||||||
err = json.Unmarshal(rawConfig, config)
|
err = json.Unmarshal(rawConfig, config)
|
||||||
|
|
||||||
if !filepath.IsAbs(config.InboundConfigValue.File) && len(config.InboundConfigValue.File) > 0 {
|
if !filepath.IsAbs(config.InboundConfigValue.File) && len(config.InboundConfigValue.File) > 0 {
|
||||||
config.InboundConfigValue.File = filepath.Join(filepath.Dir(file), config.InboundConfigValue.File)
|
config.InboundConfigValue.File = filepath.Join(filepath.Dir(file), config.InboundConfigValue.File)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !filepath.IsAbs(config.OutboundConfigValue.File) && len(config.OutboundConfigValue.File) > 0 {
|
if !filepath.IsAbs(config.OutboundConfigValue.File) && len(config.OutboundConfigValue.File) > 0 {
|
||||||
config.OutboundConfigValue.File = filepath.Join(filepath.Dir(file), config.OutboundConfigValue.File)
|
config.OutboundConfigValue.File = filepath.Join(filepath.Dir(file), config.OutboundConfigValue.File)
|
||||||
}
|
}
|
||||||
|
|
||||||
return config, err
|
return config, err
|
||||||
}
|
}
|
||||||
|
@ -1,39 +1,63 @@
|
|||||||
package socks
|
package socks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "bytes"
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
// "github.com/v2ray/v2ray-core"
|
"golang.org/x/net/proxy"
|
||||||
// "github.com/v2ray/v2ray-core/testing/mocks"
|
|
||||||
// "github.com/v2ray/v2ray-core/testing/unit"
|
"github.com/v2ray/v2ray-core"
|
||||||
|
"github.com/v2ray/v2ray-core/testing/mocks"
|
||||||
|
"github.com/v2ray/v2ray-core/testing/unit"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSocksTcpConnect(t *testing.T) {
|
func TestSocksTcpConnect(t *testing.T) {
|
||||||
t.Skip("Not ready yet.")
|
assert := unit.Assert(t)
|
||||||
/*
|
port := uint16(12385)
|
||||||
assert := unit.Assert(t)
|
|
||||||
|
och := &mocks.OutboundConnectionHandler{
|
||||||
port := uint16(12384)
|
Data2Send: bytes.NewBuffer(make([]byte, 0, 1024)),
|
||||||
|
Data2Return: []byte("The data to be returned to socks server."),
|
||||||
uuid := "2418d087-648d-4990-86e8-19dca1d006d3"
|
}
|
||||||
id, err := core.UUIDToID(uuid)
|
|
||||||
assert.Error(err).IsNil()
|
core.RegisterOutboundConnectionHandlerFactory("mock_och", och)
|
||||||
|
|
||||||
config := core.VConfig{
|
config := mocks.Config{
|
||||||
port,
|
PortValue: port,
|
||||||
[]core.User{core.User{id}},
|
InboundConfigValue: &mocks.ConnectionConfig{
|
||||||
"",
|
ProtocolValue: "socks",
|
||||||
[]core.VNext{}}
|
ContentValue: []byte("{\"auth\": \"noauth\"}"),
|
||||||
|
},
|
||||||
och := new(mocks.FakeOutboundConnectionHandler)
|
OutboundConfigValue: &mocks.ConnectionConfig{
|
||||||
och.Data2Send = bytes.NewBuffer(make([]byte, 1024))
|
ProtocolValue: "mock_och",
|
||||||
och.Data2Return = []byte("The data to be returned to socks server.")
|
ContentValue: nil,
|
||||||
|
},
|
||||||
vpoint, err := core.NewPoint(&config, SocksServerFactory{}, och)
|
}
|
||||||
assert.Error(err).IsNil()
|
|
||||||
|
point, err := core.NewPoint(&config)
|
||||||
err = vpoint.Start()
|
assert.Error(err).IsNil()
|
||||||
assert.Error(err).IsNil()
|
|
||||||
*/
|
err = point.Start()
|
||||||
|
assert.Error(err).IsNil()
|
||||||
|
|
||||||
|
socks5Client, err := proxy.SOCKS5("tcp", "127.0.0.1:12385", nil, proxy.Direct)
|
||||||
|
assert.Error(err).IsNil()
|
||||||
|
|
||||||
|
conn, err := socks5Client.Dial("tcp", "google.com:80")
|
||||||
|
assert.Error(err).IsNil()
|
||||||
|
|
||||||
|
data2Send := "The data to be sent to remote server."
|
||||||
|
conn.Write([]byte(data2Send))
|
||||||
|
if tcpConn, ok := conn.(*net.TCPConn); ok {
|
||||||
|
tcpConn.CloseWrite()
|
||||||
|
}
|
||||||
|
|
||||||
|
dataReturned, err := ioutil.ReadAll(conn)
|
||||||
|
assert.Error(err).IsNil()
|
||||||
|
conn.Close()
|
||||||
|
|
||||||
|
assert.Bytes([]byte(data2Send)).Equals(och.Data2Send.Bytes())
|
||||||
|
assert.Bytes(dataReturned).Equals(och.Data2Return)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package mocks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/v2ray/v2ray-core"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ConnectionConfig struct {
|
||||||
|
ProtocolValue string
|
||||||
|
ContentValue []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *ConnectionConfig) Protocol() string {
|
||||||
|
return config.ProtocolValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *ConnectionConfig) Content() []byte {
|
||||||
|
return config.ContentValue
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
PortValue uint16
|
||||||
|
InboundConfigValue *ConnectionConfig
|
||||||
|
OutboundConfigValue *ConnectionConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) Port() uint16 {
|
||||||
|
return config.PortValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) InboundConfig() core.ConnectionConfig {
|
||||||
|
return config.InboundConfigValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) OutboundConfig() core.ConnectionConfig {
|
||||||
|
return config.OutboundConfigValue
|
||||||
|
}
|
@ -1,33 +0,0 @@
|
|||||||
package mocks
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
|
|
||||||
"github.com/v2ray/v2ray-core"
|
|
||||||
v2net "github.com/v2ray/v2ray-core/net"
|
|
||||||
)
|
|
||||||
|
|
||||||
type FakeOutboundConnectionHandler struct {
|
|
||||||
Data2Send *bytes.Buffer
|
|
||||||
Data2Return []byte
|
|
||||||
Destination v2net.Address
|
|
||||||
}
|
|
||||||
|
|
||||||
func (handler *FakeOutboundConnectionHandler) Start(ray core.OutboundRay) error {
|
|
||||||
input := ray.OutboundInput()
|
|
||||||
output := ray.OutboundOutput()
|
|
||||||
|
|
||||||
output <- handler.Data2Return
|
|
||||||
for {
|
|
||||||
data, open := <-input
|
|
||||||
if !open {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
handler.Data2Send.Write(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (handler *FakeOutboundConnectionHandler) Create(point *core.Point, dest v2net.Address) (core.OutboundConnectionHandler, error) {
|
|
||||||
return handler, nil
|
|
||||||
}
|
|
@ -0,0 +1,38 @@
|
|||||||
|
package mocks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"github.com/v2ray/v2ray-core"
|
||||||
|
v2net "github.com/v2ray/v2ray-core/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OutboundConnectionHandler struct {
|
||||||
|
Data2Send *bytes.Buffer
|
||||||
|
Data2Return []byte
|
||||||
|
Destination v2net.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
func (handler *OutboundConnectionHandler) Start(ray core.OutboundRay) error {
|
||||||
|
input := ray.OutboundInput()
|
||||||
|
output := ray.OutboundOutput()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
data, open := <-input
|
||||||
|
if !open {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
handler.Data2Send.Write(data)
|
||||||
|
}
|
||||||
|
output <- handler.Data2Return
|
||||||
|
close(output)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (handler *OutboundConnectionHandler) Create(point *core.Point, config []byte, dest v2net.Address) (core.OutboundConnectionHandler, error) {
|
||||||
|
handler.Destination = dest
|
||||||
|
return handler, nil
|
||||||
|
}
|
Loading…
Reference in new issue