mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-09-07 00:39:20 +03:00
* Fix UDP destination override * Fix code style * Fix fakedns object init Do type convertion at runtime in case if user don't use fakedns in config. Since dispatcher now depend on fakedns object, move the injection order of fakedns to top (As a temporary solution) * Amend logic for handing fakedns client A map is used by server side when client turn on fakedns Client will send domain address in the buffer.UDP.Address, server record all possible target IP addrs. When target replies, server will restore the domain and send back to client. Co-authored-by: hmol233 <82594500+hmol233@users.noreply.github.com>
77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package pipe
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/xtls/xray-core/common/buf"
|
|
"github.com/xtls/xray-core/common/signal"
|
|
"github.com/xtls/xray-core/common/signal/done"
|
|
"github.com/xtls/xray-core/features/policy"
|
|
)
|
|
|
|
// Option for creating new Pipes.
|
|
type Option func(*pipeOption)
|
|
|
|
// WithoutSizeLimit returns an Option for Pipe to have no size limit.
|
|
func WithoutSizeLimit() Option {
|
|
return func(opt *pipeOption) {
|
|
opt.limit = -1
|
|
}
|
|
}
|
|
|
|
// WithSizeLimit returns an Option for Pipe to have the given size limit.
|
|
func WithSizeLimit(limit int32) Option {
|
|
return func(opt *pipeOption) {
|
|
opt.limit = limit
|
|
}
|
|
}
|
|
|
|
func OnTransmission(hook func(mb buf.MultiBuffer) buf.MultiBuffer) Option {
|
|
return func(option *pipeOption) {
|
|
option.onTransmission = hook
|
|
}
|
|
}
|
|
|
|
// DiscardOverflow returns an Option for Pipe to discard writes if full.
|
|
func DiscardOverflow() Option {
|
|
return func(opt *pipeOption) {
|
|
opt.discardOverflow = true
|
|
}
|
|
}
|
|
|
|
// OptionsFromContext returns a list of Options from context.
|
|
func OptionsFromContext(ctx context.Context) []Option {
|
|
var opt []Option
|
|
|
|
bp := policy.BufferPolicyFromContext(ctx)
|
|
if bp.PerConnection >= 0 {
|
|
opt = append(opt, WithSizeLimit(bp.PerConnection))
|
|
} else {
|
|
opt = append(opt, WithoutSizeLimit())
|
|
}
|
|
|
|
return opt
|
|
}
|
|
|
|
// New creates a new Reader and Writer that connects to each other.
|
|
func New(opts ...Option) (*Reader, *Writer) {
|
|
p := &pipe{
|
|
readSignal: signal.NewNotifier(),
|
|
writeSignal: signal.NewNotifier(),
|
|
done: done.New(),
|
|
option: pipeOption{
|
|
limit: -1,
|
|
},
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(&(p.option))
|
|
}
|
|
|
|
return &Reader{
|
|
pipe: p,
|
|
}, &Writer{
|
|
pipe: p,
|
|
}
|
|
}
|