diff options
Diffstat (limited to 'pkg/auth/sip2/telnet.go')
-rw-r--r-- | pkg/auth/sip2/telnet.go | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/pkg/auth/sip2/telnet.go b/pkg/auth/sip2/telnet.go index 7d8c4fa..469f980 100644 --- a/pkg/auth/sip2/telnet.go +++ b/pkg/auth/sip2/telnet.go @@ -16,7 +16,12 @@ package sip2 import ( - "github.com/reiver/go-telnet" + //"github.com/reiver/go-telnet" + /* TODO this one exposes DialTimeout */ + "github.com/linxiaozhi/go-telnet" + "log" + "net" + "time" ) // The terminator can be configured differently for different SIP endpoints. @@ -24,16 +29,29 @@ import ( var telnetTerminator string -func telnetRead(conn *telnet.Conn) (out string) { +var telnetTimeout string = "2000ms" + +func telnetRead(conn gote.Connection) (string, error) { var buffer [1]byte recvData := buffer[:] var n int var err error + var out string for { + setDeadline(conn) n, err = conn.Read(recvData) if n <= 0 || err != nil { - break + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + log.Println("telnet: read timeout:", err) + return "", err + } else { + // some other error, do something else, for example create new conn + /* TODO -- should modify attributes of the error, or raise a non-recoverable one */ + /* ie, broken pipe errors will not be solved by retries */ + log.Println("telnet: read error:", err) + return "", err + } } else { out += string(recvData) } @@ -41,11 +59,14 @@ func telnetRead(conn *telnet.Conn) (out string) { break } } - return out + return out, nil } -func telnetSend(conn *telnet.Conn, command string) { +func telnetSend(conn gote.Connection, command string) error { var commandBuffer []byte + + setDeadline(conn) + for _, char := range command { commandBuffer = append(commandBuffer, byte(char)) } @@ -53,6 +74,29 @@ func telnetSend(conn *telnet.Conn, command string) { var crlfBuffer [2]byte = [2]byte{'\r', '\n'} crlf := crlfBuffer[:] - conn.Write(commandBuffer) - conn.Write(crlf) + _, err := conn.Write(commandBuffer) + if err != nil { + return err + } + + _, err = conn.Write(crlf) + if err != nil { + return err + } + return nil +} + +func setDeadline(conn gote.Connection) error { + /* TODO do we need to set deadline explicitely here? */ + t, err := time.ParseDuration(telnetTimeout) + if err != nil { + log.Println("telnet: error parsing duration") + return err + } + err = conn.SetDeadline(time.Now().Add(t * time.Second)) + if err != nil { + log.Println("telnet: error setting deadline") + return err + } + return nil } |