func WriteProtobuf(conn *transport.Conn, message *proto.ClientToServer) error { unpadMsg, err := protobuf.Marshal(message) if err != nil { return err } _, err = conn.WriteFrame(proto.Pad(unpadMsg, proto.SERVER_MESSAGE_SIZE)) return err }
func writeProtobuf(conn *transport.Conn, outBuf []byte, message *proto.ClientToServer, t *testing.T) { unpadMsg, err := protobuf.Marshal(message) handleError(err, t) padMsg := proto.Pad(unpadMsg, proto.SERVER_MESSAGE_SIZE) copy(outBuf, padMsg) conn.WriteFrame(outBuf[:proto.SERVER_MESSAGE_SIZE]) }
func (server *Server) writeProtobuf(conn *transport.Conn, outBuf []byte, message *proto.ServerToClient) error { unpadMsg, err := protobuf.Marshal(message) if err != nil { return err } padMsg := proto.Pad(unpadMsg, proto.SERVER_MESSAGE_SIZE) copy(outBuf, padMsg) conn.WriteFrame(outBuf[:proto.SERVER_MESSAGE_SIZE]) return nil }
func (cc *ConnectionCache) Put(k string, conn *transport.Conn) { cc.Lock() ch, ok := cc.connections[k] if !ok { ch = make(chan *transport.Conn, 1) cc.connections[k] = ch } cc.Unlock() select { case ch <- conn: default: conn.Close() } return }
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() } }