Merge pull request #53 from arachnist/verbose-truncate

Give explicit notice on message truncation.
master
Robert S. Gerus 2015-12-23 20:31:05 +01:00
commit 95e143e1c6
2 changed files with 51 additions and 7 deletions

View File

@ -11,6 +11,7 @@ import (
"net"
"sync"
"time"
"unicode/utf8"
"github.com/arachnist/dyncfg"
)
@ -39,9 +40,28 @@ type Connection struct {
func (c *Connection) Sender(msg Message) {
c.l.Lock()
defer c.l.Unlock()
c.writer.WriteString(msg.String() + endline)
log.Println(c.network, "-->", msg.String())
c.writer.Flush()
if msg.WireLen() > maxLength {
currLen := 0
for i, ch := range msg.String() {
currLen += utf8.RuneLen(ch)
if currLen > maxLength {
c.writer.WriteString(msg.String()[:i] + endline)
log.Println(c.network, "-->", msg.String())
c.writer.Flush()
// eh, it is a bit naive to assume that we won't explode again…
if msg.Command == "PRIVMSG" { // we don't care otherwise
newMsg := msg
newMsg.Trailing = "Message truncated"
go c.Sender(newMsg)
}
return
}
}
} else {
c.writer.WriteString(msg.String() + endline)
log.Println(c.network, "-->", msg.String())
c.writer.Flush()
}
}
// Receiver receives IRC messages from server, logs their contents, sets message

View File

@ -288,12 +288,36 @@ func (m *Message) Bytes() []byte {
buffer.WriteString(m.Trailing)
}
// We need the limit the buffer length.
if buffer.Len() > (maxLength) {
buffer.Truncate(maxLength)
return buffer.Bytes()
}
func (m *Message) WireLen() int {
buffer := new(bytes.Buffer)
// Message prefix
if m.Prefix != nil {
buffer.WriteByte(prefix)
m.Prefix.writeTo(buffer)
buffer.WriteByte(space)
}
return buffer.Bytes()
// Command is required
buffer.WriteString(m.Command)
// Space separated list of arguments
if len(m.Params) > 0 {
buffer.WriteByte(space)
buffer.WriteString(strings.Join(m.Params, string(space)))
}
if len(m.Trailing) > 0 || m.EmptyTrailing {
buffer.WriteByte(space)
buffer.WriteByte(prefix)
buffer.WriteString(m.Trailing)
}
return buffer.Len()
}
// String returns a string representation of this message.