From 0b02fef14ece77b21e991a93c414bc962570e157 Mon Sep 17 00:00:00 2001 From: Yoshida Hiroshi Date: Tue, 26 Nov 2024 15:29:16 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=91=E3=82=B1=E3=83=83=E3=83=88=E7=A0=B4?= =?UTF-8?q?=E6=A3=84=E5=87=A6=E7=90=86=E3=82=92=E9=96=A2=E6=95=B0=E5=8C=96?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler.go | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/handler.go b/handler.go index 78781b2..822c56b 100644 --- a/handler.go +++ b/handler.go @@ -162,28 +162,11 @@ func (s *Server) createSpeechHandler(serviceType string, onResultFunc func(conte serviceHandler.UpdateRetryCount() // 切断検知のために、クライアントから送られてくるパケットは受信し続ける - errCh := make(chan error) ctx, cancelPacketDiscard := context.WithCancel(ctx) defer cancelPacketDiscard() - // TODO: 関数化 - go func(ctx context.Context) { - defer close(errCh) - - // サービス側には接続していないため、パケットは破棄する - buf := make([]byte, HeaderLength+MaxPayloadLength) - for { - select { - case <-ctx.Done(): - return - default: - if _, err := r.Read(buf); err != nil { - errCh <- err - return - } - } - } - }(ctx) + errCh := make(chan error) + go discardPacket(ctx, r, errCh) // 連続のリトライを避けるために少し待つ retryTimer := time.NewTimer(time.Duration(s.config.RetryIntervalMs) * time.Millisecond) @@ -192,14 +175,12 @@ func (s *Server) createSpeechHandler(serviceType string, onResultFunc func(conte retryTimer.Stop() cancelPacketDiscard() // リトライ対象のエラーのため、クライアントとの接続は切らずにリトライする - break + continue case err := <-errCh: retryTimer.Stop() // リトライする前にクライアントとの接続でエラーが発生した場合は終了する return err } - - continue } } // SuzuError の場合はその Status Code を返す @@ -356,6 +337,24 @@ func (s *Server) createSpeechHandler(serviceType string, onResultFunc func(conte } } +func discardPacket(ctx context.Context, r io.Reader, errCh chan error) { + defer close(errCh) + + // サービス側には接続していないため、パケットは破棄する + buf := make([]byte, HeaderLength+MaxPayloadLength) + for { + select { + case <-ctx.Done(): + return + default: + if _, err := r.Read(buf); err != nil { + errCh <- err + return + } + } + } +} + func readPacketWithHeader(reader io.Reader) io.Reader { r, w := io.Pipe()