mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
https://github.com/XTLS/Xray-core/pull/6041#issuecomment-4357417742 And fixes https://github.com/XTLS/Xray-core/issues/6039
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package hysteria
|
|
|
|
import (
|
|
"context"
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/xtls/xray-core/common"
|
|
"github.com/xtls/xray-core/proxy/hysteria/account"
|
|
"github.com/xtls/xray-core/transport/internet"
|
|
)
|
|
|
|
const (
|
|
closeErrCodeOK = 0x100 // HTTP3 ErrCodeNoError
|
|
closeErrCodeProtocolError = 0x101 // HTTP3 ErrCodeGeneralProtocolError
|
|
URLHost = "hysteria"
|
|
URLPath = "/auth"
|
|
RequestHeaderAuth = "Hysteria-Auth"
|
|
ResponseHeaderUDPEnabled = "Hysteria-UDP"
|
|
CommonHeaderCCRX = "Hysteria-CC-RX"
|
|
CommonHeaderPadding = "Hysteria-Padding"
|
|
StatusAuthOK = 233
|
|
FrameTypeTCPRequest = 0x401
|
|
MaxDatagramFrameSize = 1200
|
|
udpMessageChanSize = 1024
|
|
idleCleanupInterval = 1 * time.Second
|
|
)
|
|
|
|
const (
|
|
paddingChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
)
|
|
|
|
type padding struct {
|
|
Min int
|
|
Max int
|
|
}
|
|
|
|
func (p padding) String() string {
|
|
n := p.Min + rand.Intn(p.Max-p.Min)
|
|
bs := make([]byte, n)
|
|
for i := range bs {
|
|
bs[i] = paddingChars[rand.Intn(len(paddingChars))]
|
|
}
|
|
return string(bs)
|
|
}
|
|
|
|
var (
|
|
AuthRequestPadding = padding{Min: 256, Max: 2048}
|
|
AuthResponsePadding = padding{Min: 256, Max: 2048}
|
|
TcpRequestPadding = padding{Min: 64, Max: 512}
|
|
TcpResponsePadding = padding{Min: 128, Max: 1024}
|
|
)
|
|
|
|
type datagramKey struct{}
|
|
|
|
func ContextWithDatagram(ctx context.Context, v bool) context.Context {
|
|
return context.WithValue(ctx, datagramKey{}, v)
|
|
}
|
|
|
|
func DatagramFromContext(ctx context.Context) bool {
|
|
v, _ := ctx.Value(datagramKey{}).(bool)
|
|
return v
|
|
}
|
|
|
|
type validatorKey struct{}
|
|
|
|
func ContextWithValidator(ctx context.Context, v *account.Validator) context.Context {
|
|
return context.WithValue(ctx, validatorKey{}, v)
|
|
}
|
|
|
|
func ValidatorFromContext(ctx context.Context) *account.Validator {
|
|
v, _ := ctx.Value(validatorKey{}).(*account.Validator)
|
|
return v
|
|
}
|
|
|
|
type status int
|
|
|
|
const (
|
|
StatusNull status = iota
|
|
StatusActive
|
|
StatusInactive
|
|
)
|
|
|
|
const protocolName = "hysteria"
|
|
|
|
func init() {
|
|
common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} {
|
|
return &Config{
|
|
UdpIdleTimeout: 60,
|
|
}
|
|
}))
|
|
}
|