Move decode logic into separate function
This commit is contained in:
parent
41b78f0b58
commit
2b4dfdc56d
72
main.go
72
main.go
|
@ -14,37 +14,53 @@ var (
|
|||
logger logging.Logger
|
||||
)
|
||||
|
||||
func handleMtaConnection(clientConnection *bufio.ReadWriter) {
|
||||
type milterPacket struct {
|
||||
payloadLength uint32
|
||||
message string
|
||||
payload []byte
|
||||
}
|
||||
|
||||
type smficOptineg struct {
|
||||
version uint32
|
||||
actions uint32
|
||||
protocol uint32
|
||||
}
|
||||
|
||||
func readRequestPacket(clientConnection *bufio.ReadWriter) (milterPacket, error) {
|
||||
buf := make([]byte, 4096)
|
||||
bytesRead, err := clientConnection.Read(buf)
|
||||
if err != nil {
|
||||
logger.Errorln("Error reading from clientConnection:", err.Error())
|
||||
return milterPacket{}, err
|
||||
}
|
||||
logger.Infof("Read %d bytes from connection\n", bytesRead)
|
||||
logger.Debugf("Hexdump of bytes read:\n%s", hex.Dump(buf[0:bytesRead]))
|
||||
reqPacket := milterPacket{}
|
||||
// First 4 Bytes will be some integer thing "length"
|
||||
bytesReader := bytes.NewReader(buf[0:4])
|
||||
err = binary.Read(bytesReader, binary.BigEndian, &reqPacket.payloadLength)
|
||||
if err != nil {
|
||||
logger.Errorln(err.Error())
|
||||
}
|
||||
logger.Debugf("Parsed length: %d\n", reqPacket.payloadLength)
|
||||
// Next up is a character, indicating the milter command
|
||||
logger.Debugf("Parsing command from byte: %X\n", buf[4])
|
||||
reqPacket.message = string(buf[4])
|
||||
logger.Debugf("Parsed packet command: %s\n", reqPacket.message)
|
||||
// Last part is data with lenght len-1
|
||||
reqPacket.payload = buf[5 : 5+reqPacket.payloadLength-1]
|
||||
logger.Debugf("Hexdump of packet payload read:\n%s", hex.Dump(reqPacket.payload))
|
||||
// That's it, we're done.
|
||||
return reqPacket, nil
|
||||
}
|
||||
|
||||
func handleMtaConnection(clientConnection *bufio.ReadWriter) {
|
||||
for {
|
||||
bytesRead, err := clientConnection.Read(buf)
|
||||
if err != nil {
|
||||
logger.Errorln("Error reading from clientConnection:", err.Error())
|
||||
break
|
||||
} else {
|
||||
logger.Infof("Read %d bytes from connection\n", bytesRead)
|
||||
logger.Debugf("Hexdump of bytes read:\n%s", hex.Dump(buf[0:bytesRead]))
|
||||
|
||||
// First 4 Bytes will be some integer thing "length"
|
||||
// Let's parse that
|
||||
var packetLength uint32
|
||||
bytesReader := bytes.NewReader(buf[0:4])
|
||||
err := binary.Read(bytesReader, binary.BigEndian, &packetLength)
|
||||
if err != nil {
|
||||
logger.Errorln(err.Error())
|
||||
}
|
||||
logger.Debugf("Parsed length: %d\n", packetLength)
|
||||
|
||||
// Next up is a character, indicating the milter command
|
||||
logger.Debugf("Parsing command from byte: %X\n", buf[4])
|
||||
command := string(buf[4])
|
||||
logger.Debugf("Parsed packet command: %s\n", command)
|
||||
|
||||
// Last part is data with lenght len-1
|
||||
data := make([]byte, packetLength)
|
||||
data = buf[5 : 5+packetLength-1]
|
||||
logger.Debugf("Hexdump of packet payload read:\n%s", hex.Dump(data))
|
||||
request, _ := readRequestPacket(clientConnection)
|
||||
|
||||
if request.message == "O" {
|
||||
responsePayload := smficOptineg{2, 0, 2}
|
||||
//clientConnection.Write()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue