diff --git a/proxy/freedom/config.go b/proxy/freedom/config.go index 416719df0..ec3c4f6da 100644 --- a/proxy/freedom/config.go +++ b/proxy/freedom/config.go @@ -9,4 +9,5 @@ const ( type Config struct { DomainStrategy DomainStrategy + Timeout uint32 } diff --git a/proxy/freedom/config_json.go b/proxy/freedom/config_json.go index 9a9f8258e..f1d41b1c5 100644 --- a/proxy/freedom/config_json.go +++ b/proxy/freedom/config_json.go @@ -12,6 +12,7 @@ import ( func (this *Config) UnmarshalJSON(data []byte) error { type JsonConfig struct { DomainStrategy string `json:"domainStrategy"` + Timeout uint32 `json:"timeout"` } jsonConfig := new(JsonConfig) if err := json.Unmarshal(data, jsonConfig); err != nil { @@ -22,6 +23,7 @@ func (this *Config) UnmarshalJSON(data []byte) error { if domainStrategy == "useip" { this.DomainStrategy = DomainStrategyUseIP } + this.Timeout = jsonConfig.Timeout return nil } diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index f5710e484..590b87ba0 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -21,12 +21,14 @@ import ( type FreedomConnection struct { domainStrategy DomainStrategy + timeout uint32 dns dns.Server } func NewFreedomConnection(config *Config, space app.Space) *FreedomConnection { f := &FreedomConnection{ domainStrategy: config.DomainStrategy, + timeout: config.Timeout, } log.Info("Freedom: Domain strategy: ", f.domainStrategy) space.InitializeApplication(func() error { @@ -111,8 +113,12 @@ func (this *FreedomConnection) Dispatch(destination v2net.Destination, payload * var reader io.Reader = conn + timeout := this.timeout if destination.IsUDP() { - reader = v2net.NewTimeOutReader(16 /* seconds */, conn) + timeout = 16 + } + if timeout > 0 { + reader = v2net.NewTimeOutReader(int(timeout) /* seconds */, conn) } v2reader := v2io.NewAdaptiveReader(reader)