func (s *Server) onConn(c net.Conn) { conn := s.newClientConn(c) defer func() { err := recover() if err != nil { const size = 4096 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] log.Printf("Error server.onConn remoteAddr:%s, stack:%s", c.RemoteAddr().String(), string(buf)) } conn.Close() }() if allowConnect := conn.IsAllowConnect(); allowConnect == false { err := mysql.NewError(mysql.ER_ACCESS_DENIED_ERROR, "ip address access denied by mysqlproxy.") conn.writeError(err) conn.Close() return } if err := conn.Handshake(); err != nil { log.Printf("Error server.onConn %s", err.Error()) c.Close() return } conn.Run() }
func (c *ClientConn) writeError(e error) error { var m *mysql.SqlError var ok bool if m, ok = e.(*mysql.SqlError); !ok { m = mysql.NewError(mysql.ER_UNKNOWN_ERROR, e.Error()) } data := make([]byte, 4, 16+len(m.Message)) data = append(data, mysql.ERR_HEADER) data = append(data, byte(m.Code), byte(m.Code>>8)) if c.capability&mysql.CLIENT_PROTOCOL_41 > 0 { data = append(data, '#') data = append(data, m.State...) } data = append(data, m.Message...) return c.writePacket(data) }