fix detection of only-ack packets

ref #315
This commit is contained in:
Lucas Clemente
2016-09-01 20:09:41 +02:00
parent 3378c68c92
commit d76d86a7e1
3 changed files with 9 additions and 5 deletions

View File

@@ -113,11 +113,11 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, con
// Don't send out packets that only contain an ACK (plus optional STOP_WAITING), if requested
if !maySendOnlyAck {
if len(payloadFrames) == 1 {
if _, ok := payloadFrames[0].(*frames.AckFrameLegacy); ok {
if _, ok := payloadFrames[0].(*frames.AckFrame); ok {
return nil, nil
}
} else if len(payloadFrames) == 2 && stopWaitingFrame != nil {
if _, ok := payloadFrames[1].(*frames.AckFrameLegacy); ok {
if _, ok := payloadFrames[1].(*frames.AckFrame); ok {
return nil, nil
}
}

View File

@@ -464,19 +464,19 @@ var _ = Describe("Packet packer", func() {
})
It("returns nil if we only have a single STOP_WAITING and an ACK", func() {
p, err := packer.PackPacket(&frames.StopWaitingFrame{}, []frames.Frame{&frames.AckFrameLegacy{}}, 0, false)
p, err := packer.PackPacket(&frames.StopWaitingFrame{}, []frames.Frame{&frames.AckFrame{}}, 0, false)
Expect(err).NotTo(HaveOccurred())
Expect(p).To(BeNil())
})
It("returns nil if we only have a single ACK", func() {
p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrameLegacy{}}, 0, false)
p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrame{}}, 0, false)
Expect(err).NotTo(HaveOccurred())
Expect(p).To(BeNil())
})
It("does not return nil if we only have a single ACK but request it to be sent", func() {
p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrameLegacy{}}, 0, true)
p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrame{}}, 0, true)
Expect(err).NotTo(HaveOccurred())
Expect(p).ToNot(BeNil())
})

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"net"
"runtime"
"sync/atomic"
"time"
@@ -490,6 +491,9 @@ func (s *Session) sendPacket() error {
// Check whether we are allowed to send a packet containing only an ACK
maySendOnlyAck := time.Now().Sub(s.delayedAckOriginTime) > protocol.AckSendDelay
if runtime.GOOS == "windows" {
maySendOnlyAck = true
}
hasRetransmission := s.streamFramer.HasFramesForRetransmission()