97 lines
1.6 KiB
Go
97 lines
1.6 KiB
Go
// Commands from https://redis.io/commands#connection
|
|
|
|
package miniredis
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/alicebob/miniredis/server"
|
|
)
|
|
|
|
func commandsConnection(m *Miniredis) {
|
|
m.srv.Register("AUTH", m.cmdAuth)
|
|
m.srv.Register("ECHO", m.cmdEcho)
|
|
m.srv.Register("PING", m.cmdPing)
|
|
m.srv.Register("SELECT", m.cmdSelect)
|
|
m.srv.Register("QUIT", m.cmdQuit)
|
|
}
|
|
|
|
// PING
|
|
func (m *Miniredis) cmdPing(c *server.Peer, cmd string, args []string) {
|
|
if !m.handleAuth(c) {
|
|
return
|
|
}
|
|
c.WriteInline("PONG")
|
|
}
|
|
|
|
// AUTH
|
|
func (m *Miniredis) cmdAuth(c *server.Peer, cmd string, args []string) {
|
|
if len(args) != 1 {
|
|
setDirty(c)
|
|
c.WriteError(errWrongNumber(cmd))
|
|
return
|
|
}
|
|
pw := args[0]
|
|
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
if m.password == "" {
|
|
c.WriteError("ERR Client sent AUTH, but no password is set")
|
|
return
|
|
}
|
|
if m.password != pw {
|
|
c.WriteError("ERR invalid password")
|
|
return
|
|
}
|
|
|
|
setAuthenticated(c)
|
|
c.WriteOK()
|
|
}
|
|
|
|
// ECHO
|
|
func (m *Miniredis) cmdEcho(c *server.Peer, cmd string, args []string) {
|
|
if len(args) != 1 {
|
|
setDirty(c)
|
|
c.WriteError(errWrongNumber(cmd))
|
|
return
|
|
}
|
|
if !m.handleAuth(c) {
|
|
return
|
|
}
|
|
|
|
msg := args[0]
|
|
c.WriteBulk(msg)
|
|
}
|
|
|
|
// SELECT
|
|
func (m *Miniredis) cmdSelect(c *server.Peer, cmd string, args []string) {
|
|
if len(args) != 1 {
|
|
setDirty(c)
|
|
c.WriteError(errWrongNumber(cmd))
|
|
return
|
|
}
|
|
if !m.handleAuth(c) {
|
|
return
|
|
}
|
|
|
|
id, err := strconv.Atoi(args[0])
|
|
if err != nil {
|
|
id = 0
|
|
}
|
|
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
ctx := getCtx(c)
|
|
ctx.selectedDB = id
|
|
|
|
c.WriteOK()
|
|
}
|
|
|
|
// QUIT
|
|
func (m *Miniredis) cmdQuit(c *server.Peer, cmd string, args []string) {
|
|
// QUIT isn't transactionfied and accepts any arguments.
|
|
c.WriteOK()
|
|
c.Close()
|
|
}
|