mirror of
https://github.com/v2ray/v2ray-core.git
synced 2026-11-14 14:47:12 +00:00
Simplify channel operations
This commit is contained in:
1 parent
ef950770fe
commit
d12737b3b8
11 files changed
+63
-176
No files matched your search
@@ -1,75 +0,0 @@
|
||||
package io
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
const (
|
||||
SizeSmall = 16
|
||||
SizeMedium = 128
|
||||
SizeLarge = 512
|
||||
)
|
||||
|
||||
var (
|
||||
ErrorNoChannel = errors.New("No suitable channels found.")
|
||||
)
|
||||
|
||||
type BufferSet struct {
|
||||
small chan []byte
|
||||
medium chan []byte
|
||||
large chan []byte
|
||||
}
|
||||
|
||||
func NewBufferSet() *BufferSet {
|
||||
bSet := new(BufferSet)
|
||||
bSet.small = make(chan []byte, 128)
|
||||
bSet.medium = make(chan []byte, 128)
|
||||
bSet.large = make(chan []byte, 128)
|
||||
return bSet
|
||||
}
|
||||
|
||||
func (bSet *BufferSet) detectBucket(size int, strict bool) (chan []byte, error) {
|
||||
if strict {
|
||||
if size == SizeSmall {
|
||||
return bSet.small, nil
|
||||
} else if size == SizeMedium {
|
||||
return bSet.medium, nil
|
||||
} else if size == SizeLarge {
|
||||
return bSet.large, nil
|
||||
}
|
||||
} else {
|
||||
if size <= SizeSmall {
|
||||
return bSet.small, nil
|
||||
} else if size <= SizeMedium {
|
||||
return bSet.medium, nil
|
||||
} else if size <= SizeLarge {
|
||||
return bSet.large, nil
|
||||
}
|
||||
}
|
||||
return nil, ErrorNoChannel
|
||||
}
|
||||
|
||||
func (bSet *BufferSet) FetchBuffer(minSize int) []byte {
|
||||
var buffer []byte
|
||||
byteChan, err := bSet.detectBucket(minSize, false)
|
||||
if err != nil {
|
||||
return make([]byte, minSize)
|
||||
}
|
||||
select {
|
||||
case buffer = <-byteChan:
|
||||
default:
|
||||
buffer = make([]byte, minSize)
|
||||
}
|
||||
return buffer
|
||||
}
|
||||
|
||||
func (bSet *BufferSet) ReturnBuffer(buffer []byte) {
|
||||
byteChan, err := bSet.detectBucket(len(buffer), true)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case byteChan <- buffer:
|
||||
default:
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -9,7 +9,6 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
_ "log"
|
||||
mrand "math/rand"
|
||||
|
||||
"github.com/v2ray/v2ray-core"
|
||||
@@ -27,6 +26,8 @@ const (
|
||||
|
||||
var (
|
||||
ErrorInvalidUser = errors.New("Invalid User")
|
||||
|
||||
emptyIV = make([]byte, blockSize)
|
||||
)
|
||||
|
||||
// VMessRequest implements the request message of VMess protocol. It only contains
|
||||
@@ -75,7 +76,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
||||
}
|
||||
request.UserId = *userId
|
||||
|
||||
decryptor, err := NewDecryptionReader(reader, userId.Hash([]byte("PWD")), make([]byte, blockSize))
|
||||
decryptor, err := NewDecryptionReader(reader, userId.Hash([]byte("PWD")), emptyIV)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -224,7 +225,7 @@ func (w *VMessRequestWriter) Write(writer io.Writer, request *VMessRequest) erro
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
aesStream := cipher.NewCFBEncrypter(aesCipher, make([]byte, blockSize))
|
||||
aesStream := cipher.NewCFBEncrypter(aesCipher, emptyIV)
|
||||
cWriter := v2io.NewCryptionWriter(aesStream, writer)
|
||||
|
||||
_, err = writer.Write(buffer[0:encryptionBegin])
|
||||
|
||||
Reference in new issue
Block a user