func (p *RedisProtocol) RunClient(client server.ProtocolClient) { // defer panics to the loggable event routine defer func() { if e := recover(); e != nil { buf := make([]byte, 4096) n := runtime.Stack(buf, false) buf = buf[0:n] p.ctx.Events <- server.BroadcastEvent{"fatal", "client run panic", errors.New(fmt.Sprintf("%v", e)), buf} } client.Close() return }() reqErr := client.RequestErrorChan() for { data, err := client.ReadBulkPayload() if err != nil { if err != io.EOF { p.ctx.Events <- server.BroadcastEvent{"error", "read error", err, nil} } return } err = p.handleData(data, client, reqErr) if err != nil { if err == errQuit { client.WriteString("OK") client.Flush() return } else { p.ctx.Events <- server.BroadcastEvent{"error", "accept error", err, nil} client.WriteError(err) client.Flush() } } } }