diff --git a/resolver.go b/resolver.go index 6caa71d..e9103a1 100644 --- a/resolver.go +++ b/resolver.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "errors" + "fmt" "strings" "github.com/go-i2p/i2pkeys" @@ -36,8 +37,8 @@ func NewFullSAMResolver(address string) (*SAMResolver, error) { // addresses, 3) by asking peers in the I2P network. func (sam *SAMResolver) Resolve(name string) (i2pkeys.I2PAddr, error) { log.WithField("name", name).Debug("Resolving name") - - if _, err := sam.conn.Write([]byte("NAMING LOOKUP NAME=" + name + "\r\n")); err != nil { + query := []byte(fmt.Sprintf("NAMING LOOKUP NAME=%s\n", name)) + if _, err := sam.conn.Write(query); err != nil { log.WithError(err).Error("Failed to write to SAM connection") sam.Close() return i2pkeys.I2PAddr(""), err @@ -56,7 +57,6 @@ func (sam *SAMResolver) Resolve(name string) (i2pkeys.I2PAddr, error) { s := bufio.NewScanner(bytes.NewReader(buf[13:n])) s.Split(bufio.ScanWords) - errStr := "" for s.Scan() { text := s.Text() log.WithField("text", text).Debug("Parsing SAM response token") @@ -64,11 +64,11 @@ func (sam *SAMResolver) Resolve(name string) (i2pkeys.I2PAddr, error) { if text == "RESULT=OK" { continue } else if text == "RESULT=INVALID_KEY" { - errStr += "Invalid key - resolver." log.Error("Invalid key in resolver") + return i2pkeys.I2PAddr(""), fmt.Errorf("Invalid key - resolver") } else if text == "RESULT=KEY_NOT_FOUND" { - errStr += "Unable to resolve " + name log.WithField("name", name).Error("Unable to resolve name") + return i2pkeys.I2PAddr(""), fmt.Errorf("Unable to resolve %s", name) } else if text == "NAME="+name { continue } else if strings.HasPrefix(text, "VALUE=") { @@ -76,11 +76,11 @@ func (sam *SAMResolver) Resolve(name string) (i2pkeys.I2PAddr, error) { log.WithField("addr", addr).Debug("Name resolved successfully") return i2pkeys.I2PAddr(text[6:]), nil } else if strings.HasPrefix(text, "MESSAGE=") { - errStr += " " + text[8:] log.WithField("message", text[8:]).Warn("Received message from SAM") + return i2pkeys.I2PAddr(""), fmt.Errorf("Received message from SAM: %s", text[8:]) } else { continue } } - return i2pkeys.I2PAddr(""), errors.New(errStr) + return i2pkeys.I2PAddr(""), fmt.Errorf("Unable to resolve %s", name) } diff --git a/sam3.go b/sam3.go index 6eca359..445a569 100644 --- a/sam3.go +++ b/sam3.go @@ -314,11 +314,11 @@ func (sam *SAM) newGenericSessionWithSignatureAndPorts(style, id, from, to strin } else if strings.HasPrefix(text, session_I2P_ERROR) { log.WithField("error", text[len(session_I2P_ERROR):]).Error("I2P error") conn.Close() - return nil, fmt.Errorf("I2P error " + text[len(session_I2P_ERROR):]) + return nil, fmt.Errorf("I2P error %s", text[len(session_I2P_ERROR):]) } else { log.WithField("reply", text).Error("Unable to parse SAMv3 reply") conn.Close() - return nil, fmt.Errorf("Unable to parse SAMv3 reply: " + text) + return nil, fmt.Errorf("Unable to parse SAMv3 reply: %s", text) } } diff --git a/streamListener.go b/streamListener.go index c341a0e..75e3821 100644 --- a/streamListener.go +++ b/streamListener.go @@ -3,7 +3,7 @@ package sam3 import ( "bufio" "context" - "errors" + "fmt" "io" "net" "strconv" @@ -106,7 +106,8 @@ func (l *StreamListener) AcceptI2P() (*SAMConn, error) { log.Debug("Connected to SAM bridge") // we connected to sam // send accept() command - _, err = io.WriteString(s.conn, "STREAM ACCEPT ID="+l.id+" SILENT=false\n") + acceptFmt := fmt.Sprintf("STREAM ACCEPT ID=%s SILENT=false", l.id) + _, err = io.WriteString(s.conn, acceptFmt) if err != nil { log.WithError(err).Error("Failed to send STREAM ACCEPT command") s.Close() @@ -127,15 +128,15 @@ func (l *StreamListener) AcceptI2P() (*SAMConn, error) { destline, err := rd.ReadString(10) if err != nil { if err == io.EOF { - err = errors.New("connection closed after OK") + err = fmt.Errorf("connection closed after OK") } - err = errors.New("error reading destination: " + err.Error()) + err = fmt.Errorf("error reading destination: %s", err.Error()) } if err == nil { // Validate destination format dest := ExtractDest(destline) if !strings.HasPrefix(dest, "") { - err = errors.New("invalid destination format") + err = fmt.Errorf("invalid destination format") } l.session.from = ExtractPairString(destline, "FROM_PORT") l.session.to = ExtractPairString(destline, "TO_PORT") @@ -160,7 +161,7 @@ func (l *StreamListener) AcceptI2P() (*SAMConn, error) { } else { log.WithField("line", line).Error("Invalid SAM response") s.Close() - err = errors.New("invalid sam line: " + line) + err = fmt.Errorf("invalid sam line: %s", line) } } else { log.WithError(err).Error("Failed to connect to SAM bridge") diff --git a/suggestedOptions.go b/suggestedOptions.go index 92f087f..86fa428 100644 --- a/suggestedOptions.go +++ b/suggestedOptions.go @@ -1,6 +1,7 @@ package sam3 import ( + "fmt" "net" "net/http" "os" @@ -88,8 +89,7 @@ func GenerateOptionString(opts []string) string { log.Debug("i2cp.leaseSetEncType already present in options") return optStr } - finalOpts := optStr + " i2cp.leaseSetEncType=4,0" + finalOpts := fmt.Sprintf("%s i2cp.leaseSetEncType=4,0", optStr) log.WithField("finalOptions", finalOpts).Debug("Added default i2cp.leaseSetEncType to options") return finalOpts - // return optStr + " i2cp.leaseSetEncType=4,0" }