2017-02-25 05:56:40 +00:00
|
|
|
package genericlistener
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"net"
|
|
|
|
)
|
|
|
|
|
|
|
|
//WedgeConn -- A buffered IO infront of a connection allowing peeking, and switching connections.
|
|
|
|
type WedgeConn struct {
|
|
|
|
reader *bufio.Reader
|
|
|
|
net.Conn
|
|
|
|
}
|
|
|
|
|
|
|
|
//NewWedgeConn -- Constructor
|
|
|
|
func NewWedgeConn(c net.Conn) (p *WedgeConn) {
|
|
|
|
p = new(WedgeConn)
|
|
|
|
p.reader = bufio.NewReader(c)
|
|
|
|
p.Conn = c
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
//NewWedgeConnSize -- Constructor
|
|
|
|
func NewWedgeConnSize(c net.Conn, size int) (p *WedgeConn) {
|
|
|
|
p = new(WedgeConn)
|
|
|
|
p.reader = bufio.NewReaderSize(c, size)
|
|
|
|
p.Conn = c
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-26 18:35:06 +00:00
|
|
|
//Peek - Get a number of bytes outof the buffer, but allow the buffer to be replayed once read
|
2017-02-25 05:56:40 +00:00
|
|
|
func (w *WedgeConn) Peek(n int) ([]byte, error) {
|
2017-02-26 18:35:06 +00:00
|
|
|
loginfo.Println("Peek")
|
|
|
|
loginfo.Println("buffered=", w.reader.Buffered())
|
2017-02-25 05:56:40 +00:00
|
|
|
return w.reader.Peek(n)
|
2017-02-26 18:35:06 +00:00
|
|
|
|
2017-02-25 05:56:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//Read -- A normal reader.
|
|
|
|
func (w *WedgeConn) Read(p []byte) (int, error) {
|
|
|
|
loginfo.Println("read", w.Conn)
|
|
|
|
cnt, err := w.reader.Read(p)
|
|
|
|
return cnt, err
|
|
|
|
}
|
2017-02-26 18:35:06 +00:00
|
|
|
|
|
|
|
//Buffered --
|
|
|
|
func (w *WedgeConn) Buffered() int {
|
|
|
|
return w.reader.Buffered()
|
|
|
|
}
|
|
|
|
|
|
|
|
//PeekAll --
|
|
|
|
// - get all the chars available
|
|
|
|
// - pass then back
|
|
|
|
func (w *WedgeConn) PeekAll() (buf []byte, err error) {
|
|
|
|
loginfo.Println("PeekAll")
|
|
|
|
|
|
|
|
var peek []byte
|
|
|
|
for {
|
|
|
|
b, err := w.reader.Peek(1)
|
|
|
|
if err != nil {
|
|
|
|
if len(peek) > 0 {
|
|
|
|
return peek, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var t byte
|
|
|
|
t = b[0]
|
|
|
|
|
|
|
|
peek = append(peek, t)
|
|
|
|
loginfo.Println("len", len(peek))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|