From d5ba15c23b8d96823709e17a0cd3cc1ed5ffba15 Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (desktop)" Date: Mon, 26 Jul 2021 01:42:37 +0000 Subject: [PATCH] Maint: improve http proxy loop Run --- internal/httpproxy/loop.go | 2 ++ internal/httpproxy/run.go | 33 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/internal/httpproxy/loop.go b/internal/httpproxy/loop.go index 182958b7..f2c47635 100644 --- a/internal/httpproxy/loop.go +++ b/internal/httpproxy/loop.go @@ -31,6 +31,7 @@ type Loop struct { running chan models.LoopStatus stop, stopped chan struct{} start chan struct{} + userTrigger bool backoffTime time.Duration } @@ -54,6 +55,7 @@ func NewLoop(logger logging.Logger, settings configuration.HTTPProxy) *Loop { running: running, stop: stop, stopped: stopped, + userTrigger: true, backoffTime: defaultBackoffTime, } } diff --git a/internal/httpproxy/run.go b/internal/httpproxy/run.go index 4e52d1c8..73ce6cb8 100644 --- a/internal/httpproxy/run.go +++ b/internal/httpproxy/run.go @@ -2,7 +2,7 @@ package httpproxy import ( "context" - "fmt" + "strconv" "github.com/qdm12/gluetun/internal/constants" ) @@ -14,34 +14,28 @@ type Runner interface { func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { defer close(done) - crashed := false - - if l.state.GetSettings().Enabled { - go func() { - _, _ = l.statusManager.ApplyStatus(ctx, constants.Running) - }() - } - - select { - case <-l.start: - case <-ctx.Done(): - return + if !l.state.GetSettings().Enabled { + select { + case <-l.start: + case <-ctx.Done(): + return + } } for ctx.Err() == nil { runCtx, runCancel := context.WithCancel(ctx) settings := l.state.GetSettings() - address := fmt.Sprintf(":%d", settings.Port) + address := ":" + strconv.Itoa(int(settings.Port)) server := New(runCtx, address, l.logger, settings.Stealth, settings.Log, settings.User, settings.Password) errorCh := make(chan error) go server.Run(runCtx, errorCh) // TODO stable timer, check Shadowsocks - if !crashed { + if l.userTrigger { l.running <- constants.Running - crashed = false + l.userTrigger = false } else { l.backoffTime = defaultBackoffTime l.statusManager.SetStatus(constants.Running) @@ -53,21 +47,26 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { case <-ctx.Done(): runCancel() <-errorCh + close(errorCh) return case <-l.start: + l.userTrigger = true l.logger.Info("starting") runCancel() <-errorCh + close(errorCh) stayHere = false case <-l.stop: + l.userTrigger = true l.logger.Info("stopping") runCancel() <-errorCh + // Do not close errorCh or this for loop won't work l.stopped <- struct{}{} case err := <-errorCh: + close(errorCh) l.statusManager.SetStatus(constants.Crashed) l.logAndWait(ctx, err) - crashed = true stayHere = false } }