57 lines
1 KiB
Go
57 lines
1 KiB
Go
package adapters
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net"
|
|
|
|
C "github.com/Dreamacro/clash/constant"
|
|
)
|
|
|
|
// DirectAdapter is a directly connected adapter
|
|
type DirectAdapter struct {
|
|
conn net.Conn
|
|
}
|
|
|
|
// Close is used to close connection
|
|
func (d *DirectAdapter) Close() {
|
|
d.conn.Close()
|
|
}
|
|
|
|
// Conn is used to http request
|
|
func (d *DirectAdapter) Conn() net.Conn {
|
|
return d.conn
|
|
}
|
|
|
|
type Direct struct{}
|
|
|
|
func (d *Direct) Name() string {
|
|
return "DIRECT"
|
|
}
|
|
|
|
func (d *Direct) Type() C.AdapterType {
|
|
return C.Direct
|
|
}
|
|
|
|
func (d *Direct) Generator(metadata *C.Metadata) (adapter C.ProxyAdapter, err error) {
|
|
address := net.JoinHostPort(metadata.Host, metadata.Port)
|
|
if metadata.IP != nil {
|
|
address = net.JoinHostPort(metadata.IP.String(), metadata.Port)
|
|
}
|
|
|
|
c, err := net.DialTimeout("tcp", address, tcpTimeout)
|
|
if err != nil {
|
|
return
|
|
}
|
|
tcpKeepAlive(c)
|
|
return &DirectAdapter{conn: c}, nil
|
|
}
|
|
|
|
func (d *Direct) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(map[string]string{
|
|
"type": d.Type().String(),
|
|
})
|
|
}
|
|
|
|
func NewDirect() *Direct {
|
|
return &Direct{}
|
|
}
|