2025-02-03 21:39:04 -05:00
package filter
import (
"errors"
"net"
)
var ErrInvalidFunctionFilter = errors . New ( "invalid Function filter" )
func noopReadFilter ( b [ ] byte ) ( [ ] byte , error ) {
return b , nil
}
func noopWriteFilter ( b [ ] byte ) ( [ ] byte , error ) {
return b , nil
}
type FunctionConnFilter struct {
net . Conn
ReadFilter func ( b [ ] byte ) ( [ ] byte , error )
WriteFilter func ( b [ ] byte ) ( [ ] byte , error )
}
var ex net . Conn = & FunctionConnFilter { }
// Write modifies the bytes according to c.Filter and writes the result to the underlying connection
func ( c * FunctionConnFilter ) Write ( b [ ] byte ) ( n int , err error ) {
b2 , err := c . WriteFilter ( b )
if err != nil {
2025-02-03 23:33:00 -05:00
return 0 , err
2025-02-03 21:39:04 -05:00
}
return c . Conn . Write ( b2 )
}
// Read reads data from the underlying connection and modifies the bytes according to c.Filter
func ( c * FunctionConnFilter ) Read ( b [ ] byte ) ( n int , err error ) {
n , err = c . Conn . Read ( b )
if err != nil {
2025-02-03 23:33:00 -05:00
return 0 , err
2025-02-03 21:39:04 -05:00
}
2025-02-03 23:33:00 -05:00
b2 , err := c . ReadFilter ( b [ : n ] )
2025-02-03 21:39:04 -05:00
if err != nil {
2025-02-03 23:33:00 -05:00
return 0 , err
2025-02-03 21:39:04 -05:00
}
copy ( b , b2 )
return len ( b2 ) , nil
}
2025-02-03 23:33:00 -05:00
// NewFunctionConnFilter creates a new FunctionConnFilter that has the powerful ability to rewrite any byte that comes across the net.Conn with user-defined functions. By default, the filters are no-op functions.
func NewFunctionConnFilter ( parentConn net . Conn , readFilter , writeFilter func ( b [ ] byte ) ( [ ] byte , error ) ) ( net . Conn , error ) {
if readFilter == nil {
readFilter = noopReadFilter
}
if writeFilter == nil {
writeFilter = noopWriteFilter
}
2025-02-03 21:39:04 -05:00
return & FunctionConnFilter {
Conn : parentConn ,
2025-02-03 23:33:00 -05:00
ReadFilter : readFilter ,
WriteFilter : writeFilter ,
2025-02-03 21:39:04 -05:00
} , nil
}