mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 09:45:40 +08:00
80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
package obfs
|
|
|
|
import (
|
|
"math/rand"
|
|
|
|
"github.com/sun8911879/shadowsocksR/ssr"
|
|
)
|
|
|
|
type randomHead struct {
|
|
ssr.ServerInfoForObfs
|
|
rawTransSent bool
|
|
rawTransReceived bool
|
|
hasSentHeader bool
|
|
dataBuffer []byte
|
|
}
|
|
|
|
func init() {
|
|
register("random_head", newRandomHead)
|
|
}
|
|
|
|
func newRandomHead() IObfs {
|
|
p := &randomHead{}
|
|
return p
|
|
}
|
|
|
|
func (r *randomHead) SetServerInfo(s *ssr.ServerInfoForObfs) {
|
|
r.ServerInfoForObfs = *s
|
|
}
|
|
|
|
func (r *randomHead) GetServerInfo() (s *ssr.ServerInfoForObfs) {
|
|
return &r.ServerInfoForObfs
|
|
}
|
|
|
|
func (r *randomHead) SetData(data interface{}) {
|
|
|
|
}
|
|
|
|
func (r *randomHead) GetData() interface{} {
|
|
return nil
|
|
}
|
|
|
|
func (r *randomHead) Encode(data []byte) (encodedData []byte, err error) {
|
|
if r.rawTransSent {
|
|
return data, nil
|
|
}
|
|
|
|
dataLength := len(data)
|
|
if r.hasSentHeader {
|
|
if dataLength > 0 {
|
|
d := make([]byte, len(r.dataBuffer)+dataLength)
|
|
copy(d, r.dataBuffer)
|
|
copy(d[len(r.dataBuffer):], data)
|
|
r.dataBuffer = d
|
|
} else {
|
|
encodedData = r.dataBuffer
|
|
r.dataBuffer = nil
|
|
r.rawTransSent = true
|
|
}
|
|
} else {
|
|
size := rand.Intn(96) + 8
|
|
encodedData = make([]byte, size)
|
|
rand.Read(encodedData)
|
|
ssr.SetCRC32(encodedData, size)
|
|
|
|
d := make([]byte, dataLength)
|
|
copy(d, data)
|
|
r.dataBuffer = d
|
|
}
|
|
r.hasSentHeader = true
|
|
return
|
|
}
|
|
|
|
func (r *randomHead) Decode(data []byte) ([]byte, uint64, error) {
|
|
if r.rawTransReceived {
|
|
return data, 0, nil
|
|
}
|
|
r.rawTransReceived = true
|
|
return data, 0, nil
|
|
}
|