From db879b565fb1bdc112e303c8cd70921814a1d90a Mon Sep 17 00:00:00 2001 From: Integralist Date: Mon, 16 Feb 2026 15:59:34 +0000 Subject: [PATCH] remove(result): return result instead of storing it off --- cmd/epp/epp.go | 2 +- conn.go | 9 +-------- session.go | 14 ++++---------- session_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/cmd/epp/epp.go b/cmd/epp/epp.go index a698856..9cd2918 100644 --- a/cmd/epp/epp.go +++ b/cmd/epp/epp.go @@ -118,7 +118,7 @@ func main() { c, err := epp.NewConn(conn) fatalif(err) color.Fprintf(os.Stderr, "Logging in as %s...\n", user) - err = c.Login(user, pass, "") + _, err = c.Login(user, pass, "") fatalif(err) // Check diff --git a/conn.go b/conn.go index 5dc5daf..4fc0d1e 100644 --- a/conn.go +++ b/conn.go @@ -29,7 +29,7 @@ type Conn struct { // a connection is already opened will have no effect. Timeout time.Duration - // m protects Greeting and LoginResult. + // m protects Greeting. m sync.Mutex // Greeting holds the last received greeting message from the server, @@ -38,13 +38,6 @@ type Conn struct { // Deprecated: This field is written to upon opening a new EPP connection and should not be modified. Greeting - // LoginResult holds the last received login response message's Result - // from the server, in which some servers might include diagnostics such - // as connection count limits. - // - // Deprecated: this field is written to by the Login method but otherwise is not used by this package. - LoginResult Result - // mRead synchronizes connection reads. mRead sync.Mutex diff --git a/session.go b/session.go index 31dc623..c0dd3b5 100644 --- a/session.go +++ b/session.go @@ -7,22 +7,16 @@ import ( // Login initializes an authenticated EPP session. // https://tools.ietf.org/html/rfc5730#section-2.9.1.1 -func (c *Conn) Login(user, password, newPassword string) error { +func (c *Conn) Login(user, password, newPassword string) (Result, error) { err := c.writeLogin(user, password, newPassword) if err != nil { - return err + return Result{}, err } res, err := c.readResponse() if err != nil { - return err + return Result{}, err } - // We always have a .Result in our non-pointer, but it might be meaningless. - // We might not have read anything. We think that the worst case is we - // have the same zero values we'd get without the assignment-even-in-error-case. - c.m.Lock() - c.LoginResult = res.Result - c.m.Unlock() - return err + return res.Result, nil } func (c *Conn) writeLogin(user, password, newPassword string) error { diff --git a/session_test.go b/session_test.go index cadc8b0..61e7231 100644 --- a/session_test.go +++ b/session_test.go @@ -2,6 +2,7 @@ package epp import ( "encoding/xml" + "net" "testing" "github.com/nbio/st" @@ -45,6 +46,52 @@ var ( } ) +func TestLoginReturnsResult(t *testing.T) { + ls, err := newLocalServer() + st.Assert(t, err, nil) + defer ls.teardown() + ls.buildup(func(ls *localServer, ln net.Listener) { + conn, err := ls.Accept() + st.Assert(t, err, nil) + // Send greeting + err = writeDataUnit(conn, []byte(testXMLGreeting)) + st.Assert(t, err, nil) + // Read login request + _, err = readDataUnitHeader(conn) + st.Assert(t, err, nil) + // Send login response + err = writeDataUnit(conn, []byte(testXMLLoginResponse)) + st.Assert(t, err, nil) + // Read logout request + _, err = readDataUnitHeader(conn) + st.Assert(t, err, nil) + conn.Close() + }) + nc, err := net.Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String()) + st.Assert(t, err, nil) + c, err := NewConn(nc) + st.Assert(t, err, nil) + + result, err := c.Login("jane", "battery", "") + st.Expect(t, err, nil) + st.Expect(t, result.Code, 1000) + st.Expect(t, result.Message, "Command completed successfully") + + c.Close() +} + +var testXMLLoginResponse = ` + + + + Command completed successfully + + + 12345 + + +` + func BenchmarkEncodeLogin(b *testing.B) { for i := 0; i < b.N; i++ { encodeLogin("jane", "battery", "horse", "1.0", "en", testObjects, testExtensions)