瀏覽代碼

fix cli long response

fancl 2 年之前
父節點
當前提交
1d70d0eb25
共有 2 個文件被更改,包括 31 次插入6 次删除
  1. 23 5
      gateway/cli/server.go
  2. 8 1
      options_test.go

+ 23 - 5
gateway/cli/server.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"math"
 	"net"
 	"os"
 	"path"
@@ -75,6 +76,23 @@ func (svr *Server) writePack(conn net.Conn, packet *Frame) (err error) {
 	return
 }
 
+func (svr *Server) flushResponse(conn net.Conn, res *Response) (err error) {
+	if res.Code != 0 {
+		return svr.writePack(conn, &Frame{Type: PacketTypeData, Error: fmt.Sprintf("ERROR(%d): %s", res.Code, res.Error)})
+	}
+	offset := 0
+	chunkSize := math.MaxInt16 - 1
+	n := len(res.Data) / chunkSize
+	for i := 0; i < n; i++ {
+		if err = svr.writePack(conn, &Frame{Type: PacketTypeData, Data: res.Data[offset:chunkSize]}); err != nil {
+			return
+		}
+		offset += chunkSize
+	}
+	err = svr.writePack(conn, &Frame{Type: PacketTypeData, Data: res.Data[offset:]})
+	return
+}
+
 func (svr *Server) process(id int32, conn net.Conn) (err error) {
 	var (
 		buf []byte
@@ -88,12 +106,13 @@ func (svr *Server) process(id int32, conn net.Conn) (err error) {
 		svr.locker.Unlock()
 		err = conn.Close()
 		if v := recover(); v != nil {
-			log.Errorf("handle %d command failed cause by %v", id, v)
+			log.Errorf("[CLI]: handle connection %d command failed cause by %v", id, v)
 		}
 	}()
 	for {
 		reqPacket := &Frame{}
 		if reqPacket, err = nextFrame(conn); err != nil {
+			log.Warnf("[CLI]: read connection %d frame error: %s", id, err.Error())
 			break
 		}
 		switch reqPacket.Type {
@@ -134,12 +153,11 @@ func (svr *Server) process(id int32, conn net.Conn) (err error) {
 			ctx.WithContext(svr.ctx)
 			ctx.reset(cmdStr)
 			if res, err = svr.executor.Do(ctx, tokens...); err == nil {
-				if res.Code == 0 {
-					err = svr.writePack(conn, &Frame{Type: PacketTypeData, Data: res.Data})
-				} else {
-					err = svr.writePack(conn, &Frame{Type: PacketTypeData, Error: fmt.Sprintf("ERROR(%d): %s", res.Code, res.Error)})
+				if err = svr.flushResponse(conn, res); err != nil {
+					log.Warnf("[CLI]: flush connection %d response error: %s", id, err.Error())
 				}
 			} else {
+				log.Debugf("[CLI]: handle connection %d command [%s] error: %s", id, cmdStr, err.Error())
 				err = svr.writePack(conn, &Frame{Type: PacketTypeData, Error: fmt.Sprintf("ERROR(5000): %s", err.Error())})
 			}
 		default:

+ 8 - 1
options_test.go

@@ -1,6 +1,9 @@
 package micro
 
-import "testing"
+import (
+	"fmt"
+	"testing"
+)
 
 func TestOptions_ShortName(t *testing.T) {
 	tests := []struct {
@@ -20,3 +23,7 @@ func TestOptions_ShortName(t *testing.T) {
 		})
 	}
 }
+
+func TestMath(t *testing.T) {
+	fmt.Println(100 / 105)
+}