func()

in gdbclient/internal/pool/conn.go [269:325]


func (cn *ConnWebSocket) handleResponse(response *graphsonv3.Response) {
	if response.Code == graphsonv3.RESPONSE_STATUS_AUTHENTICATE {
		request, _ := graphsonv3.MakeAuthRequest(response.RequestID, cn.opt.Username, cn.opt.Password)

		// append auth request to server and do not care return future
		cn.SubmitRequestAsync(request)
		return
	}

	if future, ok := cn.pendingResponses.Load(response.RequestID); ok {
		responseFuture := future.(*graphsonv3.ResponseFuture)

		responseFuture.FixResponse(func(respChan *graphsonv3.Response) {
			respChan.Code = response.Code
			if respChan.Data == nil {
				respChan.Data = response.Data
			} else {
				if newData, ok := response.Data.(json.RawMessage); ok {
					// make Data as Slice when json.RawMessage append
					if data, ok := respChan.Data.(json.RawMessage); ok {
						dataList := make([]json.RawMessage, 2, 8)
						dataList[0] = data
						dataList[1] = newData
						respChan.Data = dataList
					} else if dataList, ok := respChan.Data.([]json.RawMessage); ok {
						respChan.Data = append(dataList, newData)
					} else {
						// FIXME: incoming rawMessage but couldn't append to
						internal.Logger.Error("incoming rawMessage after", zap.Time("time", time.Now()), zap.Stringer("data", reflect.TypeOf(respChan.Data)))
					}
				} else if newData, ok := response.Data.(error); ok {
					// FIXME: incoming a error, ignore it if here is before, take it if not
					if _, isErr := respChan.Data.(error); !isErr {
						respChan.Data = newData
					}
					internal.Logger.Debug("incoming error after", zap.Time("time", time.Now()), zap.Stringer("data", reflect.TypeOf(respChan.Data)))
				} else {
					internal.Logger.Error("ignore incoming message", zap.Time("time", time.Now()), zap.Stringer("data", reflect.TypeOf(response.Data)))
				}
			}
		})

		if response.Code != graphsonv3.RESPONSE_STATUS_PARITAL_CONTENT {
			// get a whole response, remove from pending queue then signal to
			cn.pendingResponses.Delete(response.RequestID)
			atomic.AddInt32(&cn.pendingSize, -1)
			responseFuture.Complete(nil)

			if (response.Code != graphsonv3.RESPONSE_STATUS_SUCCESS) && (response.Code != graphsonv3.RESPONSE_STATUS_NO_CONTENT) {
				internal.Logger.Debug("response", zap.Time("time", time.Now()), zap.Int("code", response.Code),
					zap.String("error", fmt.Sprint(response.Data)))
			}
		}
	} else {
		internal.Logger.Error("handle response not found", zap.Time("time", time.Now()), zap.String("id", response.RequestID))
	}
}