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