func cmd(c *textproto.Conn, expectedCode int, format string, args ...interface{}) error { id, err := c.Cmd(format, args...) if err != nil { return err } c.StartResponse(id) _, _, err = c.ReadResponse(expectedCode) c.EndResponse(id) return err }
func CloseConn(conn *textproto.Conn) error { id, err := conn.Cmd("close") if err != nil { return err } conn.StartResponse(id) conn.EndResponse(id) err = conn.Close() if err != nil { return err } return nil }
func (s *server) writeIdleResponse(p *textproto.Conn, id uint, quit chan bool, subsystems []string) { p.StartResponse(id) defer p.EndResponse(id) req := &idleRequest{ endTokenc: make(chan uint), eventc: make(chan string, 1), subsystems: subsystems, } s.idleStartc <- req token := <-req.endTokenc select { case name := <-req.eventc: p.PrintfLine("changed: %s", name) p.PrintfLine("OK") <-quit case <-quit: p.PrintfLine("OK") } s.idleEndc <- token }
// playScriptAgainst an existing connection, does not handle server greeting func playScriptAgainst(t *testing.T, c *textproto.Conn, script []scriptStep) error { for i, step := range script { id, err := c.Cmd(step.send) if err != nil { return fmt.Errorf("Step %d, failed to send %q: %v", i, step.send, err) } c.StartResponse(id) code, msg, err := c.ReadResponse(step.expect) if err != nil { err = fmt.Errorf("Step %d, sent %q, expected %v, got %v: %q", i, step.send, step.expect, code, msg) } c.EndResponse(id) if err != nil { // Return after c.EndResponse so we don't hang the connection return err } } return nil }
func (s *server) handleConnection(p *textproto.Conn) { id := p.Next() p.StartRequest(id) p.EndRequest(id) p.StartResponse(id) p.PrintfLine("OK MPD gompd0.1") p.EndResponse(id) endIdle := make(chan bool) inIdle := false defer p.Close() for { id := p.Next() p.StartRequest(id) req, err := s.readRequest(p) if err != nil { return } // We need to do this inside request because idle response // may not have ended yet, but it will end after the following. if inIdle { endIdle <- true } p.EndRequest(id) if req.typ == idle { inIdle = true go s.writeIdleResponse(p, id, endIdle, req.args[1:]) // writeIdleResponse does it's own StartResponse/EndResponse continue } p.StartResponse(id) if inIdle { inIdle = false } switch req.typ { case noIdle: case commandListOk: var ok, closed bool ok = true for _, args := range req.cmdList { ok, closed = s.writeResponse(p, args, "list_OK") if closed { return } if !ok { break } } if ok { p.PrintfLine("OK") } case simple: if _, closed := s.writeResponse(p, req.args, "OK"); closed { return } } p.EndResponse(id) } }