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))
}
}