func receiveProtobuf(conn *transport.Conn, inBuf []byte, t *testing.T) *proto.ServerToClient { response := new(proto.ServerToClient) conn.SetDeadline(time.Now().Add(time.Second)) num, err := conn.ReadFrame(inBuf) handleError(err, t) unpadMsg := proto.Unpad(inBuf[:num]) if err := response.Unmarshal(unpadMsg); err != nil { t.Error(err) } if response.Status == nil { t.Error("Server returned nil status.") } if *response.Status == proto.ServerToClient_PARSE_ERROR { t.Error("Server threw a parse error.") } return response }
func ReceiveProtobuf(conn *transport.Conn, inBuf []byte) (*proto.ServerToClient, error) { response := new(proto.ServerToClient) conn.SetDeadline(time.Now().Add(time.Hour)) num, err := conn.ReadFrame(inBuf) if err != nil { return nil, err } unpadMsg := proto.Unpad(inBuf[:num]) if err := response.Unmarshal(unpadMsg); err != nil { return nil, err } if response.Status == nil { return nil, errors.New("Server returned nil status.") } if *response.Status != proto.ServerToClient_OK { return nil, errors.New("Server did not return OK") } return response, nil }
// readClientCommands reads client commands from a connnection and sends them // to channel commands. On error, the error is sent to channel disconnect and // both channels (but not the connection are closed). // commands is a TWO-WAY channel! the reader must reach return each cmd after // interpreting it, readClientCommands will call cmd.Reset() and reuse it. func (server *Server) readClientCommands(conn *transport.Conn, commands chan *proto.ClientToServer, disconnected chan error) { defer server.wg.Done() defer close(commands) defer close(disconnected) inBuf := make([]byte, proto.SERVER_MESSAGE_SIZE) cmd := new(proto.ClientToServer) for { num, err := conn.ReadFrame(inBuf) if err != nil { disconnected <- err return } unpadMsg := proto.Unpad(inBuf[:num]) if err := cmd.Unmarshal(unpadMsg); err != nil { disconnected <- err return } commands <- cmd cmd = <-commands cmd.Reset() } }