Commit 70fe7565 authored by AlexStocks's avatar AlexStocks

fix issue 77: process the last package before handle eof error

parent 54967137
...@@ -20,3 +20,6 @@ classes ...@@ -20,3 +20,6 @@ classes
*.swp *.swp
vendor/ vendor/
# vscode
.vscode/
...@@ -631,6 +631,13 @@ func (s *session) handleTCPPackage() error { ...@@ -631,6 +631,13 @@ func (s *session) handleTCPPackage() error {
log.Infof("%s, session.conn read EOF, client send over, session exit", s.sessionToken()) log.Infof("%s, session.conn read EOF, client send over, session exit", s.sessionToken())
err = nil err = nil
exit = true exit = true
if bufLen != 0 {
// as https://github.com/apache/dubbo-getty/issues/77#issuecomment-939652203
// this branch is impossible. Even if it happens, the bufLen will be zero and the error
// is io.EOF when getty continues to read the socket.
exit = false
log.Infof("%s, session.conn read EOF, while the bufLen(%d) is non-zero.", s.sessionToken())
}
break break
} }
log.Errorf("%s, [session.conn.read] = error:%+v", s.sessionToken(), perrors.WithStack(err)) log.Errorf("%s, [session.conn.read] = error:%+v", s.sessionToken(), perrors.WithStack(err))
...@@ -638,38 +645,34 @@ func (s *session) handleTCPPackage() error { ...@@ -638,38 +645,34 @@ func (s *session) handleTCPPackage() error {
} }
break break
} }
if exit { if 0 != bufLen {
break pktBuf.Write(buf[:bufLen])
} for {
if 0 == bufLen { if pktBuf.Len() <= 0 {
continue // just continue if session can not read no more stream bytes. break
} }
pktBuf.Write(buf[:bufLen]) pkg, pkgLen, err = s.reader.Read(s, pktBuf.Bytes())
for { // for case 3/case 4
if pktBuf.Len() <= 0 { if err == nil && s.maxMsgLen > 0 && pkgLen > int(s.maxMsgLen) {
break err = perrors.Errorf("pkgLen %d > session max message len %d", pkgLen, s.maxMsgLen)
} }
pkg, pkgLen, err = s.reader.Read(s, pktBuf.Bytes()) // handle case 1
// for case 3/case 4 if err != nil {
if err == nil && s.maxMsgLen > 0 && pkgLen > int(s.maxMsgLen) { log.Warnf("%s, [session.handleTCPPackage] = len{%d}, error:%+v",
err = perrors.Errorf("pkgLen %d > session max message len %d", pkgLen, s.maxMsgLen) s.sessionToken(), pkgLen, perrors.WithStack(err))
} exit = true
// handle case 1 break
if err != nil { }
log.Warnf("%s, [session.handleTCPPackage] = len{%d}, error:%+v", // handle case 2/case 3
s.sessionToken(), pkgLen, perrors.WithStack(err)) if pkg == nil {
exit = true break
break }
} // handle case 4
// handle case 2/case 3 s.UpdateActive()
if pkg == nil { s.addTask(pkg)
break pktBuf.Next(pkgLen)
// continue to handle case 5
} }
// handle case 4
s.UpdateActive()
s.addTask(pkg)
pktBuf.Next(pkgLen)
// continue to handle case 5
} }
if exit { if exit {
break break
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment